我read是Prolog的内部表示列为右分支树。 所以[A,B,C]被表示为:Prolog的空列表内部表示
因此表示为具有单个根节点(空列表)树空列表?
,并含有表示为具有一个根节点和两个叶节点树中的空的列表的列表,无论是空的列表?像这样:
.
/\
/ \
/ \
[] []
我read是Prolog的内部表示列为右分支树。 所以[A,B,C]被表示为:Prolog的空列表内部表示
因此表示为具有单个根节点(空列表)树空列表?
,并含有表示为具有一个根节点和两个叶节点树中的空的列表的列表,无论是空的列表?像这样:
.
/\
/ \
/ \
[] []
的'.'/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。
我意识到这比你在问题中要求的要多一点。我有一点被带走了。 :)
空的列表是一个特殊的原子,象列表函子(其通常是一个点)。
从GNU Prolog的提示,尽量
| ?- atom([]).
yes
| ?- atom([ ]).
yes
的display/1
谓词允许检查结构...
| ?- display([]).
[]
yes
| ?- display([[]]).
'.'([],[])
yes
然后我会说,回答你的第一个问题是否定的,而到了第二个是肯定的......
也许一个点作为根更精确... – CapelliC
@CapelliC我同意这是更准确。我认为这是OP的ASCII艺术的意图,但我补充说明了这一点。谢谢。 – lurker
将'谓词'更改为'函子'(第一行)。 – jschimpf