我的例子是使用追加函子:
append([],L,L).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).
//append([123],[abc],L3). this is the query
让我感到困惑的是[H | L3]列表。形成我读到的,取消了头脑,那么如何将它附加到列表中。当它通过列表递归并开始回来时,如何附加?提前谢谢。
答案 0 :(得分:5)
符号[H|T]
是'.'(H, T)
的语法糖。所以它是一个名为.
的仿函数 - 一个点和两个参数。考虑:
?- [1,2,3] = [X|L]. X = 1, L = [2, 3].
我们在这里问,如果有等式[1,2,3] = [X|L]
的解决方案。并且,是的,只有一个解决方案用这两个答案替换进行描述。解决这个等式的过程称为统一。该过程包括读取,选择和写入数据结构。所以,你可以称之为“脱头”,但你会错过背后的普遍性。毕竟:
?- X = 1, L = [2, 3], M = [X|L]. X = 1, L = [2, 3], M = [1, 2, 3].
在这里,我们从一个较小的列表中构建了一个新列表。但是:
?- M = [X|L]. M = [X|L].
这个答案意味着许多解决方案。例如,所有长度为1和更长的列表。
由于您正在查看append/3
,请考虑以下查询:
?- append(Xs, Ys, [X,Y,Z]). ?- append(Xs, Xs, Zs). ?- append(Xs, Ys, Zs)
答案 1 :(得分:3)
当你想知道执行是什么样的时候,你可以使用trace/0
。
以下是对它的概述。
append([1, 2, 3], [a, b, c], L3).
[1, 2, 3]
不为空,第二个子句适用append([2, 3], [a, b, c], L4).
,并记住L3
的负责人就像[1, 2, 3]
的负责人一样,L3
的负责人是L4
[2, 3]
不为空,第二个子句适用append([3], [a, b, c], L5).
,并记住L4
的负责人就像[2, 3]
的负责人一样,L4
的负责人是L5
[3]
不为空,第二个子句适用append([], [a, b, c], L6).
,并记住L5
的负责人就像[3]
的负责人一样,L5
的负责人是L6
[]
与[]
统一,第一个子句已应用L6
与[a, b, c]
现在Prolog有所有的信息来回答你:
L6 = [a, b, c],
L5 = [3|L6],
L4 = [2|L5],
L3 = [1|L4].
将允许Prolog结束L3 = [1, 2, 3, a, b, c]
。
希望它有所帮助。
答案 2 :(得分:1)
在Prolog中,你从不做任何像“起飞”那样活跃的事情;把它当作“专注于”可能会更好。 (Prolog本质上是声明性的;你没有说要做什么,你说什么看起来像。)例如,列表可以是空的([]
)或非空的([H|T]
);每个非空列表都有一个头H
和一个尾T
,而|
只是让你引用它们。统一可以使用列表声明为[H|T]
来将列表分开或根据需要将列表放在一起。