我正在尝试理解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)
我错过了什么?谢谢.
这是有关差异列表的问题的后续问题。
一般append/3或conc/3的写法如下:
append([], L, L).
append([H1|T1], L2, [H1|L3]):-
append(T1, L2, L3).
Run Code Online (Sandbox Code Playgroud)
这种递归的缺点是,当将长列表作为第一个参数时,它不能有效运行,因为在开始实际附加之前需要处理整个列表。
为了提高效率,我们可以使用不同的列表,只需要变量实例化,不需要递归来追加列表。
append_d(A1-Z1, Z1-Z2, A1-Z2).
Run Code Online (Sandbox Code Playgroud)
问题是,无论我在哪里寻找append/3谓词的定义,都会使用前者,而不是所谓的更有效的替代方案。这是为什么?使用差异列表有什么缺点?它们不能证明效率的提高是合理的吗?