我怎样才能将CNF表达重铸为3-CNF?

时间:2014-04-08 01:17:35

标签: cnf

我有一个像这样的CNF表达式,我想把它重铸为3-CNF:

(a+b+c+d)(~a)(~b+d)(a+b+~d)

有谁知道我该怎么做?

1 个答案:

答案 0 :(得分:3)

3-CNFConjunctive Normal Form,其中所有子句都有三个或更少的文字。要获得表达式的这种形式,可以将表达式转换为嵌套的布尔表达式,其中所有运算符(和,或)都有两个操作数:

t1a = (a+b)
t1b = (c+d)
t1 = t1a + t1b
t2 = (~a)
t3 = (~b+d)
t4a = (a+b)
t4 = t4a + ~d
t5a = t1 t2
t5b = t3 t4
t5 = t5a t5b

您可以直接将此嵌套表达式转换为一组3-CNF子句。

最小化解决方案:

(~a)(~b + d)(b + ~d)(c + d)  
<{3>}建议的

是您的表达式的3-CNF,因为它不包含更长的子句。

对于小案例,您可以填写真值表。查看输出0的所有行,找到覆盖所有这些行的minterms。如果你然后反转minterms中的所有文字,你有一个CNF。如果子句具有3个以上的文字,则可以通过引入中间变量将它们分解为两个或更多个较短的子句。广泛使用的程序称为WolframAlpha或Tseitin编码。