【发布时间】:2017-12-09 14:21:15
【问题描述】:
我已经阅读了很多关于 Prolog 的 Negation by Failure 的内容,其中 Prolog 为了证明 \+Goal 成立试图证明 Goal 失败。
这与 CWA(近距离假设)高度相关,例如,如果我们查询 \+P(a)(其中 P 是元数 1 的谓词),我们没有任何线索可以导致证明P(a) Prolog 假设(由于 CWA)not P(a) 成立,所以\+P(a) 成功。
根据我的搜索,这是一种解决经典逻辑弱点的方法,如果我们不知道P(a),那么我们就无法回答\+P(a) 是否成立。
上面描述的是在 Prolog 中引入非单调推理的方式。此外,有趣的部分是 Clark 证明了 Negation by Failure 与经典否定仅适用于基础条款兼容/相似。我理解例如:
X=1, \+X==1.: 在 Prolog(和经典逻辑)中应该返回 false。
\+X==1, X=1.: 在经典逻辑中应该返回 false,但它在 Prolog 中成功,因为检查 NF 的时间X 未绑定,这与经典纯逻辑不同。
\+X==1.:在绑定X 之前,不应在经典逻辑中给出任何答案,但在 Prolog 中它返回 false(可能是为了打破经典逻辑的弱点),这与纯逻辑不同/不兼容。
我的尝试是模拟经典的否定,感谢@false 在 cmets 中的建议,目前的实现是:
\\+(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真的没有意义。 -
关系的含义由其基本解释定义。这是适用于这种关系的一组基本项。所以
ground/2必须是常量 true。不存在为假的情况。 -
这很有道理。
-
嗯,它是一种非单调扩展的形式。不管它的优点如何,坚持接地是极其有限的。大多数时候,答案将是一个挣扎的目标,它一无所获。想想
\\+( [] = [X|Xs])的目标,它不是基础,因此您将永远得到响应,而dif([], [X|Xs])只是成功地成功。 -
顺便说一句,你的问题需要一个更详细的答案,从 1972 年和 Prolog 0 开始,涉及到现在发生的所有事情,包括 ASP 以及 Prolog 本身的纯编程。
标签: prolog negation logical-purity prolog-coroutining