Prolog空列表内部表示

时间:2014-03-26 10:36:35

标签: prolog

I read Prolog内部将列表表示为右分支树。 所以[a,b,c]表示为:

asda

空列表是否表示为具有单个根节点(空列表)的树?

并且是一个包含空列表的列表,该列表表示为具有一个根节点和两个叶节点的树,两个都是空列表?像这样:

    .
   / \
  /   \
 /     \
[]     []

2 个答案:

答案 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

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