Prolog列表concat

时间:2015-07-05 13:35:01

标签: prolog

我正在学习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]

我不明白这是怎么回事。

我明白X上的值会逐一删除,直到它等于[],我不明白的是 1.为什么要改变Zs;如果事实是append([],Ys,Ys)Zs应该等于[3,4],那么为什么如果它已经遵守了这个事实,为什么要以任何方式更改呢? 2. [1,2]如何进入Zs

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

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

1 个答案:

答案 0 :(得分:2)

关于你的第一对问题:

  1. 它不是Zs。最初,当你尝试append([1,2],[3,4],Ys).时,Prolog会对自己说'嗯,如果原始Ys的形式为[X|Zs],我可以这么做,现在我只需要匹配append(Xs, Ys, Zs)."下次它说"嗯,如果原始Zs的格式为[X|OhterZs],我可以这样做,现在我只需要匹配append(Xs, Ys, OtherZs)."试想一下,通过eacy递归调用,它可以创建新的变量名称。
  2. 1和2通过前两个调用到达前面,每个调用到它自己的Zs 版本。
  3. 关于你的其他观点:

    • 痕迹的奇怪之处正是这些递归 - 本地Zs

    • 由于您的查询是append([1,2],[3,4],Ys).,而Ys是唯一的变量,因此Prolog会将您的查询解释为询问Ys匹配的内容是否真实。