好吧,我只是想知道为什么它会起作用,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 = b
b
X
这里还有一个我收藏的链接,其中列出了所有 Prolog 谓词及其含义。
希望这可以帮助