Prolog意味着否定的谓词

Rob*_* T. 12 prolog negate implication

如何在PROLOG中编写以下规则:如果P则不是Q.

我明白你可以很容易地写,如果P然后Q谓词喜欢q(X) :- p(X),但你怎么能否定q/1谓词?我不想用其他语义来定义新的谓词non_q/1.

har*_*ath 13

条款"如果P则不是Q"在逻辑上等同于否定条款"不是P或不是Q".因此,它是没有正文字的Horn子句,并且作为SLD定理证明和Horn子句的对应的应用,可以在Prolog编程中表示为目标子句或"查询":

?- P, Q.
Run Code Online (Sandbox Code Playgroud)

让我们在一分钟内回到这个想法.

但目标条款可能不是你想到的那种代表.构成Prolog"知识库"的事实和规则是明确的条款,即Horn条款,每个条款都有一个正面的文字."如果P则不是Q"没有正面的文字,所以在这个意义上它不能被表示(作为一个明确的条款).

上面显示的目标条款"询问"是否可以证明P和Q. Prolog提供了"否定为失败"的概念,因此"询问""不是P或不是Q"的更自然的方式是:

?- not((P,Q)).
Run Code Online (Sandbox Code Playgroud)

如果P或Q失败,我们就会获得成功,如果两者都失败,我们就会失败.

但是,如果您的目的是在知识库中断言否定某些东西,Prolog自然不支持这一点.根据您的应用程序,可能有一种合理的方法来解决Prolog语法并完成所需的操作(总是有一种不合理的方法来执行它,正如您已经暗示的那样使用non_q谓词).

  • 这解决了在查询中包含“if P then not Q”的问题,但并没有解决在程序中包含它的问题。 (3认同)
  • @sharky:我同意 `q :- fail.` 是表示否定 `q` 的一种自然方式。但它本身并不是在 Prolog 中“断言”`q` 错误的有效方式。一方面,如果这是我们拥有的关于 `q/0` 的唯一规则,那么它相当于根本没有规则(对于任何查询都可以找到相同的解决方案,就好像 ISO 实现中没有规则一样)。另一方面,它不会阻止随后对可以以某种方式成功的关于“q/0”的规则的断言。我们可能会通过在您的规则中添加一个削减来缓解后一个问题,但会损失一些“自然性”。 (2认同)

小智 6

你听说过Prolog的剪辑吗?

无论如何,我对Prolog标准知之甚少,但在SWI-Prolog中,符号\+意味着否定.我知道它不需要在每个Prolog的翻译中工作.

你可以用Prolog的剪辑来做出谓词否定.谓词的定义如下:

not(Goal) :- call(Goal),!,fail.
not(Goal). 
Run Code Online (Sandbox Code Playgroud)

这意味着无法证明目标,而不是目标是错误的.也许这个Prolog&Cut链接会很有用.