2

好吧,我只是想知道为什么它会起作用,prolog 松散变量在哪里。

?- \+ \+ member(X,[a]),X=b.
X=b.

其中 X = a。自动消失了。

4

2 回答 2

4

\+/1不是逻辑意义上的“不”,而是通过“否定为失败”来实现的。这意味着,如果失败则\+ Goal成功。Goal

认为\+/1被实施为:

\+(Goal) :- Goal -> fail ; true.

如您所见,在这两种情况下,都不能Goal绑定任何变量。在“if”分支中,任何绑定都将通过回溯撤消,而在“else”分支中,无论如何都不会绑定任何变量。

在您的示例中,member(X,[a]通过绑定Xa. 这将\+ member(X,[a])失败,因此\+\+ member(X,[a])由于失败而成功。由于中间失败,X将不会被绑定a

于 2012-05-29T13:16:57.687 回答
1

prolog 中的(\+)/1运算符应该代表不可证明,但对应于较旧的(not)/1运算符。所以基本上你在这里做的是:

not not member(X, [a]), X = b.

编辑

如果X是一个包含 的列表a,则双重否定的结果与没有任何否定member(X, [a])的结果相同。,只是绑定到列表。member(X, [a])X = bbX

这里还有一个我收藏的链接,其中列出了所有 Prolog 谓词及其含义。

希望这可以帮助

于 2012-05-29T13:17:53.780 回答