首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何将CNF的表达重铸为3-CNF?

我如何将CNF的表达重铸为3-CNF?
EN

Stack Overflow用户
提问于 2014-04-08 01:17:35
回答 1查看 4.6K关注 0票数 2

我有一个像这样的CNF表达式,我想把它改写成3-CNF:

代码语言:javascript
复制
(a+b+c+d)(~a)(~b+d)(a+b+~d)

有人知道我是怎么做到的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-07 07:22:28

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

代码语言:javascript
复制
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子句。

最小化解:

代码语言:javascript
复制
(~a)(~b + d)(b + ~d)(c + d)  

正如WolframAlpha所建议的,它是表达式的3-CNF,因为它不包含更长的子句。

对于小案件,你可以填写一个真值表。查看输出为0的所有行,并查找涵盖所有这些行的中间部分。然后,如果您将所有文本倒置到中间层,那么您就有了一个CNF。如果子句有3个以上的文本,则可以通过引入中间变量将它们分解为两个或多个较短的子句。广泛使用的程序称为将军澳变换或将军澳编码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22925923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档