Prolog 双重否定的输出混乱为失败

Prolog 双重否定的输出混乱为失败,prolog,negation-as-failure,Prolog,Negation As Failure,我正在学习prolog,遇到了以下问题: 鉴于— try(X):-not(not((member(X,[a,b,c])))),write(X). 我希望查询?-try(X)。,因为下面的查询类似 X=a a; X=b b; X=c c. 但事实上,结果是: ?- try(X). _12010 true. 为什么呢?为什么变量没有被初始化为某个值?Prolog使用。你提供了一个知识库,只有其中的内容才是真实的 否定时,Prolog不知道要检查哪些值。它不能把“a”作为这个宇宙中值得检查的一

我正在学习prolog,遇到了以下问题:

鉴于—

try(X):-not(not((member(X,[a,b,c])))),write(X). 
我希望查询
?-try(X)。
,因为下面的查询类似

X=a
a;
X=b
b;
X=c
c.
但事实上,结果是:

?- try(X).
_12010
true.
为什么呢?为什么变量没有被初始化为某个值?

Prolog使用。你提供了一个知识库,只有其中的内容才是真实的


否定时,Prolog不知道要检查哪些值。它不能把“a”作为这个宇宙中值得检查的一部分。因为它不能检查任何东西,所以只会返回废话。

除了@VictoriaRuiz所说的之外,请注意以下几点:

?- \+ member(X, [a,b,c]).
false.
这是错误的,因为
成员(X,[a,b,c])
有解决方案,但当您对其求反时,变量绑定将丢失。这意味着

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

?- \+ false.
true.
?- write(X).
_4014
true.
换句话说,X没有任何地方可以实现。您的
write(X)
发生在X的变量绑定范围之外,就好像您这样做了:

?- \+ false, write(X).
_4082
true.
这基本上和

?- \+ false.
true.
?- write(X).
_4014
true.
如果您想在否定中看到回溯的证据,您可以通过以下查询看到:

?- \+ \+ (member(X, [a,b,c]), write(X), nl).
a
true.
但是,因为你在第一次尝试时得到了一个真实的解决方案,对它的否定是错误的。那么对这一点的否定是正确的。所以我们看到它在目标
(成员(X,[a,b,c]),write(X,nl)
中产生了一个解决方案,这足以知道对它的否定是错误的。再次否定false将得到true,但没有变量绑定