我已经阅读了很多关于 Prolog 的Negation by Failure的文章,其中 Prolog 为了证明\+Goal
持有试图证明Goal
失败。
这与CWA(近距离世界假设)高度相关,例如,如果我们查询\+P(a)
(哪里P
是 arity 1 的谓词)并且我们没有线索可以证明P(a)
Prolog 假设(由于 CWA)是not P(a)
成功\+P(a)
的。
根据我的搜索,这是一种解决经典逻辑弱点的方法,如果我们不知道P(a)
那么我们就无法回答是否\+P(a)
成立。
上面描述的是在 Prolog 中引入非单调推理的方式。此外,有趣的部分是克拉克证明了失败的否定与经典否定仅适用于基础条款兼容/相似。我理解,例如:
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
的逻辑纯度,可以安全地假设上述内容是纯粹的吗??)。