在尝试解决计算机上的逻辑问题时,通常首先将它们转换为CNF,因为最佳的求解算法希望将CNF作为输入。
对于命题逻辑,这种转换的教科书规则很简单,但是如果按原样应用它们,则结果是程序遇到 double 指数资源消耗而不会被为此专门设计的:
a <=> (b <=> (c <=> ...))
具有N个变量,生成2 ^ 2 ^ N个子句,一个子项是将等价转换为AND / OR时发生指数爆炸,另一个是将OR分布为AND时发生指数爆炸。
解决方案是重命名子项。如果我们将上面的内容改写为
r <=> (c <=> ...)
a <=> (b <=> r)
其中r
是一个新鲜的符号,被定义为等于一个子项-通常,我们可能需要O(N)个这样的符号-可以避免指数爆炸。
不幸的是,当我们尝试将其扩展为一阶逻辑时,这会遇到问题。使用TPTP表示法,其中?
表示“存在”,并且变量以大写字母开头,请考虑
a <=> ?[X]:p(X)
诚然,这种情况很简单,因此实际上不需要重命名子项,但是有必要使用一个简单的情况进行说明,因此,假设我们使用的算法是自动重命名等价运算符的参数;这一点适用于更复杂的情况。
如果我们尝试上述技巧并重命名?
子项,则会得到
r <=> ?[X]:p(X)
现有变量被转换为Skolem符号,因此最终以
结尾r <=> p(s)
原始公式然后扩展为
(~a | r) & (a | ~r)
在构造上等同于
(~a | p(s)) & (a | ~p(s))
但这是不正确的!假设我们没有重命名,而只是扩展原始公式,我们将得到
(~a | ?[X]:p(X)) & (a | ~?[X]:p(X))
(~a | ?[X]:p(X)) & (a | ![X]:~p(X))
(~a | p(s)) & (a | ~p(X))
与我们通过重命名获得的版本完全不同。
问题在于,等价需要每个论点的正反两种形式,但是对包含普遍量词或存在量词的术语应用否定,会在结构上改变这些术语。您不能只将它们封装在定义中,然后将负数应用于定义的符号。
其结果是,当您具有等价且参数可能包含此类量词时,实际上您需要重复遍历每个参数两次,一次是肯定的,一次是否定的。这足以使我们希望通过重命名避免存在的崩溃。据我所知,这个问题不是由特定算法的工作方式引起的,而是由任务的性质引起的。
所以我的问题:
考虑到可能包含等价和量词的任意嵌套的输入公式,是否有任何算法可以通过多项式而不是指数数量的子句正确地将其转换为CNF?
答案 0 :(得分:2)
如您所见,诸如anX.p(X)之类的存在物实际上不是 ,等同于Skolemized表达式p(S)。它的否定∃X.p(X)不等于¬p(S),而是∀Y.¬p(Y)。
避免指数爆炸的可能方法:
鉴于您仍然需要支持ALL
和NOT ALL
语句,因此这不会造成任何新问题。只需规范化并使用与通用性相同的方法即可。
如果您通过转换为SAT来解决问题,那么您的条款也可以代表通用性。因此,在您的示例中,您尝试将a
替换为r
,但是您仍然可以使用~a
,等同于负通用。
在您的表情中。您仍将使用(~a | r) & (a | ~r)
,但将~r
扩展为正确的值,而不是错误的值。该示例很简单,因为它只是~a
,但是您通常将r
定义为等效于更复杂的转换,在这种情况下,您需要记住r
和{ {1}}代表。这并不是Skolemized表达式的简单机械转换。
在此示例中,我不确定~r
等同于(~a | r) & (a | ~r)
并简化为(~a | r) & (a | ~a)
的原因。那不会给你指数爆炸吗?当您转换回一阶谓词逻辑时,请进行正确的翻译。
感谢您澄清聊天中出现的问题。正如我目前认为的那样,您所拥有的是左侧和右侧的等价物,其中包含其他嵌套的等价物,并且您想同时扩展等价物和它的否定。问题在于,由于求反不具有对称形式,您需要为树中的每个嵌套等价递归两次,一次是在扩展等价时,一次是在扩展其否定时?
您应该定义一个转换,该转换会在线性时间内从正扩展生成负扩展,并使用该表达式对包含嵌套等价项的表达式进行分治。这似乎就是您进行〜p(S)转换后的结果。
为此,您记得∃X.p(X)等效于∀X.¬p(X),反之亦然。然后,如果您将p(x)扩展为作为合取和析取的标准形式,那么De Morgan的定律可让您将¬(a∨¬b)这样的表达式转换为¬a∧b。量化器变换的内部和De Morgan变换的外部相互抵消。最后,当您将∨和each相互替换为另一个,并将原子a或¬a替换为相反的原子时,任何布尔等价形式的对偶仍然有效。
因此,尽管我可能会出错,尤其是在凌晨1点,但在我看来,您想要的是替代以下内容的对偶转换:
将此应用于正等价项的扩展,以生成与其长度成比例的负对偶时间,而无需进一步递归。
答案 1 :(得分:1)
转换为 CNF
每个命题公式都可以转换成CNF中的等价公式。这种转换基于有关逻辑等价的规则:双重否定消除、德摩根定律和分配定律。
一阶逻辑
在一阶逻辑中,可以进一步采用合取范式来产生逻辑公式的子句范式,然后可以使用它来执行一阶解析。在基于分辨率的自动定理证明中,一个 CNF 公式。
有关详细信息,请参阅Conjunctive Normal Form
更新:
<块引用>对于{1,2,…,n}的2n个子集A中的每一个,都必须有一个合取 对于所有的 i,xi↔i∈A 和 yi↔i∉A 都是如此。因此这个合 对于 i∈A,最多可以包含 xi, ¬yi 和对于 i∉A 的 ¬xi, yi 作为文字。 假设对于某个 j,这个合取既不包含 xj 也不包含 yj。然后 当 xi↔i∈A∖{j} 并且 yi↔i∉A∪{j}。但是对于这种情况,原始的 CNF 是错误的。我们得出结论 我们的合词至少包含(因此正好)其中之一 xi,yi 对于每个 i。因此,我们的合相对于任何 子集 A′≠A 的 {1,2,…,n} 和 xi↔i∈A′ 和 yi↔i∉A′ 对于所有 i。因此对于 每个 2n 子集我们找到一个不同的合取,这意味着有 至少有 2n 个连词。 (我们还看到,这些 连接词必须至少包含 n 个词)