好吧,我只是想知道为什么它会起作用,prolog 松散变量在哪里。
?- \+ \+ member(X,[a]),X=b.
X=b.
其中 X = a。自动消失了。
\+/1不是逻辑意义上的“不”,而是通过“否定为失败”来实现的。这意味着,如果失败则\+ Goal成功。Goal
认为\+/1被实施为:
\+(Goal) :- Goal -> fail ; true.
如您所见,在这两种情况下,都不能Goal绑定任何变量。在“if”分支中,任何绑定都将通过回溯撤消,而在“else”分支中,无论如何都不会绑定任何变量。
在您的示例中,member(X,[a]通过绑定X到a. 这将\+ member(X,[a])失败,因此\+\+ member(X,[a])由于失败而成功。由于中间失败,X将不会被绑定a。
prolog 中的(\+)/1运算符应该代表不可证明,但对应于较旧的(not)/1运算符。所以基本上你在这里做的是:
not not member(X, [a]), X = b.
编辑
如果X是一个包含 的列表a,则双重否定的结果与没有任何否定member(X, [a])的结果相同。,只是绑定到列表。member(X, [a])X = bbX
这里还有一个我收藏的链接,其中列出了所有 Prolog 谓词及其含义。
希望这可以帮助