目标:
编写一个完整的程序或函数,该程序或函数接受命题逻辑中的一个公式(以下称为逻辑表达式或表达式),并以合并正规形式输出该公式。有两个常量,⊤
并⊥
代表真假,一元运算符¬
代表否定,和二元运算⇒
,⇔
,∧
,和∨
代表暗示,对等,协同和脱节,其分别遵守所有常见的逻辑运算(德·摩根定律,双重否定消除等)。
合并范式定义如下:
- 任何原子表达式(包括
⊤
和⊥
)都是合取范式。 - 任何先前构建的表达式的取反是合取范式。
- 先前构造的任何两个表达式的析取为合取范式。
- 任何两个先前构造的表达式的合取为合取范式。
- 其他任何表达式都不是合取范式。
任何逻辑表达式都可以以合取范式形式(非唯一)转换为逻辑等效表达式(请参见此算法)。您无需使用该特定算法。
输入:
您可以采用任何方便的格式输入;例如,符号逻辑表达式(如果您的语言支持),字符串,其他某种数据结构。您不需要像我在此处那样对true,false和逻辑运算符使用相同的符号,但是您的选择应保持一致,如果不清楚,则应在答案中说明您的选择。您可能不接受任何其他输入或以您的输入格式对任何其他信息进行编码。您应该有一些表达任意数量的原子表达式的方法;例如整数,字符,字符串等。
输出:
公式可以是合取范式,也可以是任何方便的格式。它的格式不必与您输入的格式相同,但是您应该解释是否存在任何差异。
测试用例:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
笔记:
P
且(P ∨ Q) ∧ (P ∨ (¬Q))
都为合取范式。