【发布时间】:2014-11-04 02:19:00
【问题描述】:
我有这段代码,我需要将其翻译成 CNF(这是为考试做准备,所以不是家庭作业!):
p,q
r :- q
false :- p , s
s :- t
t
这就是我所做的:
p ^ q ^ (r V ~q) ^ (~p V ~s) ^ (s V ~t) ^ t
= r
我的推理正确吗?
这里还有一个问题:
你想用 r 查询数据库。您应该将什么子句添加到您的数据库中?
我完全不明白。简化后的数据库基本上是r。 r 是真的,不是吗?
【问题讨论】:
-
Prolog 中的多个子句通常表示“或”关系,所以我想你会想要,
(p ^ q) v (r v ~q) ...。但是,不清楚这就是您的表达式列表的含义,因为它们并非都是格式正确的 Prolog 子句,并且不会以句点结尾。 -
如果您有足够的时间,我建议您在 SICStus、SWI 等中查看
library(clpb)。 -
@j4nbur53 多个 谓词子句 表示“OR”而不是“AND”。也许您指的是逗号分隔的查询,即“AND”。例如,如果我写
foo(X) :- bar(X). foo(X) :- bah(X).,那是两个谓词子句,如果bar(X)为真或bah(X)为真,则意味着foo(X)为真。如果我写,foo(X) :- bar(X), bah(X).那么这意味着如果bar(X)为真且bah(X)为真,foo(X)为真。 -
@j4nbur53 如果我有一个谓词子句,
foo(X) :- bar(X), bah(X).那么它由一个规则头和主体组成。这是一个完整的谓词从句。我的理解是,如果我也有foo(X) :- framus(X).,那么这是谓词foo/1的另一个“子句”。换句话说,谓词foo/1由两个谓词子句 组成。也许这是我对术语的误解,但我对合取与析取并不混淆。你能指出一个定义谓词子句的文档吗?我不想继续对定义的错误理解。 -
这两个(谓词)子句通过连词连接形成确定逻辑程序(=无否定)的理论。它们已经包含析取,因为它们读取 (~bar(X) \/ ~bah(X) \/ foo(X)) 和 (~framus(X) \/ foo(X))。您不能再次以析取方式加入它们,这没有任何意义。另请参阅什么是 Horn 子句:en.wikipedia.org/wiki/Horn_clause(析取形式)
标签: prolog conjunctive-normal-form