【发布时间】:2015-11-13 12:02:01
【问题描述】:
我正在尝试了解this 程序的工作原理。
来自 Daniel Lyons 解决方案的代码(来自上面的链接)
takeout(X,[X|R],R).
takeout(X,[F |R],[F|S]) :- takeout(X,R,S).
perm([X|Y],Z) :- perm(Y,W), takeout(X,Z,W).
perm([],[]).
我正在尝试了解它如何与此列表一起使用 [1,2,3]
所以,我有perm([1,2,3],X).
一开始很容易理解,Y = [2,3] 然后Y = [3] 然后Y = []
之后perm([],[]). 被调用,它给了我们W = []
现在,takeout 第一次被调用 - takeout(3, Z, []).
它返回Z = [3]
现在,我们要回去了,perm([],[]). 给了我们W = [3],(因为此时 Y 为 [3])
同上,takeout(2, Z, [3]) 和 Z = [2, 3]。
又是perm([], []). 和W = [2, 3]。
还有takeout(1, Z, [2, 3]),这给了我们第一个答案Z = [1, 2, 3]
这里我不知道为什么程序没有结束,递归完成了,为什么takeout和perm又工作了?
之后takeout 被称为takeout(1, [2,3])。
现在哪个适用于takeout(X,[F |R],[F|S]) 而不适用于takeout(X,[X|R],R).,这是我的第二个问题,为什么?
【问题讨论】:
-
在 Prolog 中,查询或谓词调用将尝试找到 所有 可能的解决方案,而不仅仅是一个然后结束。因此,即使看起来他们结束了,他们也留下了一个选择点,在这个选择点上,其他成功的选择都是可能的。 Prolog 会自动返回这些选择点并提供备选方案。这是 Prolog 强大功能的一部分。
-
@lurker 谢谢 :)