我正在学习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
而不是Xs
或Zs
?
答案 0 :(得分:2)
关于你的第一对问题:
Zs
。最初,当你尝试append([1,2],[3,4],Ys).
时,Prolog会对自己说'嗯,如果原始Ys
的形式为[X|Zs]
,我可以这么做,现在我只需要匹配append(Xs, Ys, Zs).
"下次它说"嗯,如果原始Zs
的格式为[X|OhterZs]
,我可以这样做,现在我只需要匹配append(Xs, Ys, OtherZs).
"试想一下,通过eacy递归调用,它可以创建新的变量名称。Zs
版本。关于你的其他观点:
痕迹的奇怪之处正是这些递归 - 本地Zs
由于您的查询是append([1,2],[3,4],Ys).
,而Ys
是唯一的变量,因此Prolog会将您的查询解释为询问Ys
匹配的内容是否真实。