函数参数在Prolog中用作列表头变量

时间:2012-01-31 18:44:11

标签: prolog arguments

我对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是列表中的第一个元素。

1 个答案:

答案 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,因为它也没有出现在列表的开头。

我不知道为什么你想要这样一个功能,但它正如人们所期望的那样工作。这里没有覆盖变量。