Prolog 列表连接

Prolog list concat

我正在学习 Prolog,我偶然发现了这段代码,但我无法理解它:

代码:

append([],Ys,Ys). 

append([X|Xs],Ys,[X|Zs]):- 
            append(Xs, Ys, Zs).

例子中给出的指令是:

代码:

append([1,2],[3,4],Ys).

输出为 Ys = [1,2,3,4]

而且我不明白这是怎么发生的。

我明白 Xs 上的值会被一一删除直到等于 [],我不明白的是 1、为什么要改Zs;如果事实是 append([],Ys,Ys)Zs 应该等于 [3,4] 那么如果它已经符合事实,为什么要以任何方式改变它呢?
2. [1,2]如何进入Zs的开头?

我使用了跟踪,结果更加混乱,因为 Zs 总是像 _G5166_G5112 等值... 这些价值观是什么?这些是内存地址吗?

为什么即使我不使用 write(),控制台也会显示 Ys = ...?为什么 Ys 而不是 XsZs

关于你的第一对问题:

  1. 不一样Zs。最初,当你尝试 append([1,2],[3,4],Ys). 时,Prolog 对自己说 "Hmm, I could do that if the original Ys were in the form [X|Zs], and now I just need to match append(Xs, Ys, Zs)." 下一次它说 "Hmm, I could do that if the original Zs were in the form [X|OhterZs], and now I just need to match append(Xs, Ys, OtherZs)." 想象一下,通过简单的递归调用,它正在创建新的变量名。
  2. 1 和 2 通过前两次调用到达前面,每个都有自己的版本 Zs

关于您的其他观点:

  • 跟踪的奇怪东西就是这些递归局部Zs

  • 由于您的查询是 append([1,2],[3,4],Ys).,并且 Ys 是唯一的变量,因此 Prolog 将您的查询解释为询问 Ys 的哪个匹配会如实评估。