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

And*_*ndy 3 list append prolog

我的例子是使用append仿函数:

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

//append([123],[abc],L3). this is the query
Run Code Online (Sandbox Code Playgroud)

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

fal*_*lse 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)

更多关于列表语法.