双重否定的输出混淆为失败
Confusion in output of double negation as failure
我正在尝试学习序言,但遇到了以下问题:
给定 -
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 使用 closed world assumption。您提供了一个知识库,只有其中的内容是真实的。
当你否定时,Prolog 不知道要检查什么值。它不能将 "a" 添加为这个值得检查的宇宙的一部分。因为它不能检查任何东西,它只是 returns 胡说八道。
除了@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,但没有变量绑定。
我正在尝试学习序言,但遇到了以下问题:
给定 -
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 使用 closed world assumption。您提供了一个知识库,只有其中的内容是真实的。
当你否定时,Prolog 不知道要检查什么值。它不能将 "a" 添加为这个值得检查的宇宙的一部分。因为它不能检查任何东西,它只是 returns 胡说八道。
除了@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,但没有变量绑定。