我正在尝试理解Prolog中的差异列表,但我正在努力实际实现一个,每次我尝试这样做,我得到一个列表列表,但这不是我想要的.我正在尝试实现一个追加谓词,但到目前为止运气不佳.很少有尝试,所有这些都无效.
app(X, Y, Z) :- Z = [X|Y].
?- app([a,b,c], [z], Z).
Z = [[a,b,c],z].
Run Code Online (Sandbox Code Playgroud)
要么
app(X, Y, Z) :- Z = [X|Hole], Hole = Y.
Run Code Online (Sandbox Code Playgroud)
与第一个结果相同(它们看起来基本相同).我在一本有效的书中有一个例子(尽管它不是谓词),我不明白其中的区别.X实例化到正确答案[a,b,c,z],与第二个例子有什么不同?
X = [a,b,c|Y], Y = [z].
Run Code Online (Sandbox Code Playgroud)
我错过了什么?谢谢.
差异列表是否可以“解决”变量在序言中不可变的事实?
即如果我实现使用差异列表追加:
diff_append(OpenList, Hole, L2) :-
Hole = L2.
Run Code Online (Sandbox Code Playgroud)
然后运行:
X=[a,b,c|Hole], diff_append(X, Hole, [d,e,f]).
Run Code Online (Sandbox Code Playgroud)
在某种程度上,X已用作可变变量。就我们的意图和目的而言,它已经改变了吗?
换句话说,我们能够修改X(可变),而不必构造新列表(例如Z(不可变)),这使得差异列表具有吸引力。那么为什么不仅仅拥有可变变量呢?
更新:
diff_append2(OpenList-Hole,L2):-
Hole=L2.
X=[a,b,c|Ho]-Ho,diff_append2(X,[d,e,f]).
Run Code Online (Sandbox Code Playgroud) 当我把这个问题写在一个空列表上作为差异列表时,我想测试我对这些结构的了解.然而,当我尝试一些简单的事情,比如比较不同的符号时,似乎我错了,而且我不明白差异列表实际发生了什么.
?- L = [a,b,c|[d,e]]-[d,e], L = [a,b,c].
false % expected true
Run Code Online (Sandbox Code Playgroud)
我在SWI-Prolog和SICStus上测试了这个.我验证了符号,因为它是如何在Bratko的人工智能Prolog编程中编写的,第210页,但显然统一是不可能的.这是为什么?这些符号不具有相同的声明含义吗?