我已经阅读了关于Prolog的Negation by Failure的很多内容,其中Prolog为了证明\+Goal成立,尝试证明Goal失败。
这与CWA(close world assumption)密切相关,例如,如果我们查询\+P(a)(其中P是一元谓词),并且没有线索表明P(a)成立,则Prolog假设(由于CWA)not P(a)成立,因此\+P(a)成功。
从我所搜索的内容来看,这是解决古典逻辑弱点的一种方法,因为如果我们对P(a)一无所知,那么我们就无法回答\+P(a)是否成立。
上述内容是引入Prolog非单调推理的方式。此外,有趣的是Clark证明了Negation by Failure与经典否定只在ground clauses中兼容/相似。我理解,例如:
X=1,\+X==1:在Prolog(及经典逻辑)中应该返回false。
\+X==1,X=1:在经典逻辑中应该返回false,但在Prolog中,由于检查NF的时间,X未被绑定,这与经典纯逻辑不同。
\+X==1:在经典逻辑中,直到X被绑定之前不应该给出任何答案,但是在Prolog中,它返回false(可能是为了打破古典逻辑的弱点),这与纯逻辑不同/兼容。
我尝试模拟经典否定,感谢@false在评论中的建议,当前实现如下:
\\+(Goal) :- when(ground(Goal), \+Goal).
一些测试:
?- \\+(X==1).
when(ground(X), \+X==1).
?- X=1, \\+(X==1).
false.
?- \\+(X==1), X=1.
false.
我的问题:
上述是否为经典否定的正确解释?(是否存在它忽略的明显边界情况?此外,当使用when/2
时,我关心逻辑纯度,可以安全地假设上述内容是纯的吗?)。
ground/2
没有任何意义。 - falseground/2
必须恒为真。没有任何情况下它会是假的。 - false\\+([]=[X|Xs])
,因为它不是全局变量,所以你将永远得不到响应,而dif([], [X|Xs])
则可以顺利成功。 - false