我对Prolog中的这个函数定义感到有点困惑:
sample(X,[X|Tail]) :- member(X,Tail).
此函数检查X是否位于给定列表的第一个位置,以及是否也在列表尾部找到X.
sample(1,[1,2,3]).
false.
% because 1 is not found in the tail
sample(1,[1,2,1]).
true.
但它是如何运作的? X是用户给出的参数,但似乎被列表中的头部提取覆盖了。所以似乎X new value是列表中的第一个元素。
答案 0 :(得分:2)
你的想法太难了。在第一种情况下:
sample(1, [1,2,3])
Prolog能够绑定X,因为1是1:
sample(1, [1,2,3])
X=1, Tail=[2,3]
Prolog然后检查该条款的正文:
member(X, Tail) -> member(1, [2,3])
这显然是错误的,所以sample(1, [1,2,3])
没有成功。
在下一种情况下,绑定仍然有效,但Tail绑定到其他东西:
sample(1, [1,2,1])
X=1, Tail=[2,1]
所以我们检查身体:
member(1, [2,1])
这显然是正确的,所以sample(1, [1,2,1])
成功。
现在,如果你要尝试这个电话:
sample(1, [2,3,1])
你仍然会得到假,因为在这种情况下,1不等于2,所以没有办法在开头绑定X,所以身体永远不会被检查。 sample(1, [2,3,1])
是假的,即使两个地方都出现1,因为它也没有出现在列表的开头。
我不知道为什么你想要这样一个功能,但它正如人们所期望的那样工作。这里没有覆盖变量。