以合取范式书写条件

Posted

技术标签:

【中文标题】以合取范式书写条件【英文标题】:Writing conditions in Conjunctive Normal Form 【发布时间】:2016-07-21 09:34:00 【问题描述】:

合取范式 (CNF) 是命题公式的标准化符号,它规定每个公式都应写为析取的合取。每个布尔公式都可以转换为 CNF。比如:

A | (B & C)

在 CNF 中有这样的表示:

(A | B) & (A | C)

在 CNF 中编写条件语句是编程的最佳实践吗?

【问题讨论】:

你刚刚回答了你自己的问题。 CNF 中的第二个表达式较大,因此评估效率较低且难以阅读。 【参考方案1】:

不,这不是一个好主意。 Conjunctive normal form 主要用于理论计算机科学。 CNF中有求解公式的算法,以及时间复杂度和NP-hardness的证明。

从实用的角度来看,您应该使用最“自然”描述逻辑的布尔运算符编写代码。这意味着要充分利用嵌套表达式、XOR、否定等运算符。正如您举例说明的那样,CNF 经常与“自然”这一目标相矛盾,因为表达式较长且经常重复子表达式。

作为理论上的附注,在最坏的情况下,包含 n 运算符的不受限制的布尔公式可以转换为长度为 n 的指数的 CNF 公式。因此,CNF 可能会大量破坏公式。说明此行为的一系列示例:

(A & B) | (C & D) == (A | C) & (A | D) & (B | C) & (B | D)。 (A & B) | (C&D) | (E & F) == (A | C | E) & (A | C | F) & (A | D | E) & (A | D | F) & (B | C | E) & (B | C | F) & (B | D | E) & (B | D | F)。 (A & B) | (C&D) | (E & F) | (G & H) == (A | C | E | G) & (A | C | E | H) & (A | C | F | G) & (A | C | F | H) & (A | D | E | G) & (A | D | E | H) & (A | D | F | G) & (A | D | F | H) & (B | C | E | G) & (B | C | E | H) & (B | C | F | G) & (B | C | F | H) & (B | D | E | G) & (B | D | E | H) & (B | D | F | G) & (B | D | F | H)。

【讨论】:

以上是关于以合取范式书写条件的主要内容,如果未能解决你的问题,请参考以下文章

将命题转化为主析取命范式和主合取范式

关于合取范式中的公式,下列哪项是正确的?

在 C++ 中将逻辑公式转换为合取范式

在二叉树中将 AND 分布在 OR 上(合取范式)

利用真值表法求取主析取范式以及主合取范式的实现(C++)

数理逻辑命题逻辑的等值演算与推理演算 ( 命题逻辑 | 等值演算 | 主合取 ( 析取 ) 范式 | 推理演算 ) ★★