2014-03-26 20 views
2

read是Prolog的内部表示列为右分支树。 所以[A,B,C]被表示为:Prolog的空列表内部表示

asda

因此表示为具有单个根节点(空列表)树空列表?

,并含有表示为具有一个根节点和两个叶节点树中的空的列表的列表,无论是空的列表?像这样:

. 
/\ 
/ \ 
/ \ 
[]  [] 

回答

2

'.'/2函子在Prolog是实际列表的形式,其中第一个参数是头,第二个是个e尾巴。所以[H|T]'.'(H,T)一个语法方便的形式,更具体地,[H]是一个方便的形式为[H|[]],其为'.'(H,[])方便的形式。

含有空列表列表是一个元素的列表。在Prolog,它的表示是:

[[]] 
[[]|[]] 
'.'([],[]) 

,并以图形,'.'([],[])会为您显示:

. 
/\ 
/ \ 
/ \ 
[]  [] 

您说明的其他列表[a,b,c]的长格式为:

'.'(a,'.'(b,'.'(c,[]))) 

列表中显示的图形形式是该构造的可视化。当然还有Prolog的解释器识别该基本形式:

| ?- X = '.'(a,'.'(b,'.'(c,[]))). 

X = [a,b,c] 

yes 
| ?- X = '.'([],[]). 

X = [[]] 

yes 

作为CapelliC指出的,形式[]是不是技术上的列表,从该表示的角度,但是用于表示一个空的列表中的一个原子识别由Prolog内置插件。

| ?- [] = '.'(_,_). 

no 
| ?- 

序言确实回应“真”到list([]),以便它可以保持它是在内部谓词空列表表示本公约。

和:

| ?- X = '.'(a,'.'(b,'.'(c,d))). 

X = [a,b,c|d] 

yes 
| ?- 

所以在这里我们使用的原子d作为最后一个参数,而不是[],它给了我一个名单,不爽。但是,除非“最终尾”原子为[],否则大部分使用列表的Prolog内置函数都无法正常工作。例如参见prolog appending a list and a atom

我意识到这比你在问题中要求的要多一点。我有一点被带走了。 :)

+1

也许一个点作为根更精确... – CapelliC

+0

@CapelliC我同意这是更准确。我认为这是OP的ASCII艺术的意图,但我补充说明了这一点。谢谢。 – lurker

+0

将'谓词'更改为'函子'(第一行)。 – jschimpf

1

空的列表是一个特殊的原子,象列表函子(其通常是一个点)。

从GNU Prolog的提示,尽量

| ?- atom([]). 

yes 
| ?- atom([ ]). 

yes 

display/1谓词允许检查结构...

| ?- display([]). 
[] 

yes 

| ?- display([[]]). 
'.'([],[]) 

yes 

然后我会说,回答你的第一个问题是否定的,而到了第二个是肯定的......

+0

为什么没有第一个问题的答案?是不是显示命令确认了什么,即它只是一个单一节点(空列表)? – S0rin

+1

是的,但节点不是化合物(树),而是原子。一个很大的差异 – CapelliC

+0

@ S0rin CapelliC是正确的。空的列表只是一个原子,正如我在我的回答中所描述的,Prolog中的一个表示空列表的约定。 – lurker