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
而不是 Xs
或 Zs
?
关于你的第一对问题:
- 不一样
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).
" 想象一下,通过简单的递归调用,它正在创建新的变量名。
- 1 和 2 通过前两次调用到达前面,每个都有自己的版本
Zs
。
关于您的其他观点:
跟踪的奇怪东西就是这些递归局部Zs
由于您的查询是 append([1,2],[3,4],Ys).
,并且 Ys
是唯一的变量,因此 Prolog 将您的查询解释为询问 Ys
的哪个匹配会如实评估。
我正在学习 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
而不是 Xs
或 Zs
?
关于你的第一对问题:
- 不一样
Zs
。最初,当你尝试append([1,2],[3,4],Ys).
时,Prolog 对自己说 "Hmm, I could do that if the originalYs
were in the form[X|Zs]
, and now I just need to matchappend(Xs, Ys, Zs).
" 下一次它说 "Hmm, I could do that if the originalZs
were in the form[X|OhterZs]
, and now I just need to matchappend(Xs, Ys, OtherZs).
" 想象一下,通过简单的递归调用,它正在创建新的变量名。 - 1 和 2 通过前两次调用到达前面,每个都有自己的版本
Zs
。
关于您的其他观点:
跟踪的奇怪东西就是这些递归局部
Zs
由于您的查询是
append([1,2],[3,4],Ys).
,并且Ys
是唯一的变量,因此 Prolog 将您的查询解释为询问Ys
的哪个匹配会如实评估。