以合取范式书写条件
Writing conditions in Conjunctive Normal Form
合取范式 (CNF) 是命题公式的标准化符号,规定每个公式都应写成析取的合取。每个布尔公式都可以转换为 CNF。例如:
A | (B & C)
在 CNF 中有这样的表示:
(A | B) & (A | C)
在 CNF 中编写条件是编程的最佳实践吗?
不,这不是个好主意。 Conjunctive normal form 主要用于理论计算机科学。 CNF有解公式的算法,有时间复杂度和NP-hardness的证明
从实用的角度来看,您应该使用布尔运算符编写代码,这些运算符最能 "naturally" 描述逻辑。这意味着充分利用嵌套表达式、XOR、否定等运算符。正如您举例说明的那样,CNF 经常与 "naturalness" 的目标相矛盾,因为表达式更长并且经常重复子表达式。
作为理论上的旁注,在最坏的情况下,包含 n 运算符的无限制布尔公式可以转换为 CNF 公式,其长度在 n 中呈指数形式。因此,CNF 可能会大量破坏公式。说明此行为的一系列示例:
- (A & B) | (C & D) ==
(A | C) & (A | D) & (B | C) & (B | D)。
- (A & B) | (C & D) | (英文 & 英文) ==
(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) | (英文和英文) | (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)。
合取范式 (CNF) 是命题公式的标准化符号,规定每个公式都应写成析取的合取。每个布尔公式都可以转换为 CNF。例如:
A | (B & C)
在 CNF 中有这样的表示:
(A | B) & (A | C)
在 CNF 中编写条件是编程的最佳实践吗?
不,这不是个好主意。 Conjunctive normal form 主要用于理论计算机科学。 CNF有解公式的算法,有时间复杂度和NP-hardness的证明
从实用的角度来看,您应该使用布尔运算符编写代码,这些运算符最能 "naturally" 描述逻辑。这意味着充分利用嵌套表达式、XOR、否定等运算符。正如您举例说明的那样,CNF 经常与 "naturalness" 的目标相矛盾,因为表达式更长并且经常重复子表达式。
作为理论上的旁注,在最坏的情况下,包含 n 运算符的无限制布尔公式可以转换为 CNF 公式,其长度在 n 中呈指数形式。因此,CNF 可能会大量破坏公式。说明此行为的一系列示例:
- (A & B) | (C & D) ==
(A | C) & (A | D) & (B | C) & (B | D)。 - (A & B) | (C & D) | (英文 & 英文) ==
(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) | (英文和英文) | (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)。