I read Prolog内部将列表表示为右分支树。 所以[a,b,c]表示为:
空列表是否表示为具有单个根节点(空列表)的树?
并且是一个包含空列表的列表,该列表表示为具有一个根节点和两个叶节点的树,两个都是空列表?像这样:
.
/ \
/ \
/ \
[] []
答案 0 :(得分:2)
Prolog中的'.'/2
仿函数是实际的列表形式,其中第一个参数是头部,第二个参数是尾部。因此,[H|T]
是一种语法上方便的'.'(H,T)
形式,更具体地说,[H]
是[H|[]]
的便捷形式,'.'(H,[])
是一种方便的形式。[[]]
[[]|[]]
'.'([],[])
。
包含空列表的列表是一个元素的列表。在Prolog中,它的表示是:
'.'([],[])
以图形方式, .
/ \
/ \
/ \
[] []
将如你所示:
[a,b,c]
您说明的其他列表'.'(a,'.'(b,'.'(c,[])))
的长格式为:
| ?- X = '.'(a,'.'(b,'.'(c,[]))).
X = [a,b,c]
yes
| ?- X = '.'([],[]).
X = [[]]
yes
列表显示的图形表单是此构造的可视化。当然,Prolog翻译承认这一基本形式:
[]
正如CapelliC指出的那样,从这种表示的角度来看,形式| ?- [] = '.'(_,_).
no
| ?-
在技术上并不是一个列表,而是一个用于表示由Prolog内置函数识别的空列表的原子。
list([])
Prolog确实对| ?- X = '.'(a,'.'(b,'.'(c,d))).
X = [a,b,c|d]
yes
| ?-
做出“true”响应,以便它可以维护它在内置谓词中的空列表表示。
和
d
所以在这里我们使用原子[]
作为最后一个参数而不是[]
,它给了我一个列表。但是,除非“最终尾部”原子为{{1}},否则大多数使用列表的Prolog内置函数都无法正常工作。例如,请参阅prolog appending a list and a atom。
我意识到这比你在问题中要求的要多一些。我有点被带走了。 :)
答案 1 :(得分:1)
空列表是一个特殊的 atom ,就像列表仿函数一样(通常是一个点)。
在GNU Prolog提示符下,尝试
| ?- atom([]).
yes
| ?- atom([ ]).
yes
display/1
谓词允许检查结构......
| ?- display([]).
[]
yes
| ?- display([[]]).
'.'([],[])
yes
然后我会说你的第一个问题的答案是否定的,而第二个问题的答案是肯定的......