'|'怎么样prolog中的字符是否附加而不是拆分列表?

时间:2012-04-25 05:00:56

标签: list prolog append

我的例子是使用追加函子:

append([],L,L). 
append([H|T],L2,[H|L3])  :-  append(T,L2,L3).

//append([123],[abc],L3). this is the query

让我感到困惑的是[H | L3]列表。形成我读到的,取消了头脑,那么如何将它附加到列表中。当它通过列表递归并开始回来时,如何附加?提前谢谢。

3 个答案:

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

More on list syntax

答案 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]来将列表分开或根据需要将列表放在一起。