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谓词).
小智 6
你听说过Prolog的剪辑吗?
无论如何,我对Prolog标准知之甚少,但在SWI-Prolog中,符号\+意味着否定.我知道它不需要在每个Prolog的翻译中工作.
你可以用Prolog的剪辑来做出谓词否定.谓词的定义如下:
not(Goal) :- call(Goal),!,fail.
not(Goal).
Run Code Online (Sandbox Code Playgroud)
这意味着无法证明目标,而不是目标是错误的.也许这个Prolog&Cut链接会很有用.
| 归档时间: |
|
| 查看次数: |
25892 次 |
| 最近记录: |