双重否定输出失败导致混乱

时间:2018-07-27 18:31:29

标签: 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.

那是为什么?为什么变量没有初始化为某个值?

2 个答案:

答案 0 :(得分:3)

Prolog使用closed world assumption进行操作。您提供了一个知识库,只有其中的内容是正确的。

取反时,Prolog不知道要检查的值。它不能在该Universe中添加值得检查的“ a”。而且由于它无法检查任何内容,因此只会返回废话。

答案 1 :(得分:3)

除了@VictoriaRuiz所说的以外,请注意其他一些事项:

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

这是错误的,因为member(X, [a,b,c])有解决方案,但是变量绑定在取反时会丢失。这意味着

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

相同
?- \+ false.
true.

换句话说,X无处可实现。您的write(X)发生在X的变量绑定范围之外,就好像您这样做:

?- \+ false, write(X).
_4082
true.

基本上与

相同
?- write(X).
_4014
true.

如果您想在否定中看到回溯的证据,则可能希望通过以下查询看到它:

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

但是因为您在第一次尝试中获得了正确的解决方案,所以否定是错误的。那么,否定是真的。因此,我们看到它在目标(member(X, [a,b,c]), write(X), nl)内产生了一个解决方案,足以知道该否定是错误的。再次否定false会为您提供true,但没有变量绑定。