真值表到表达式生成器
点击输出列,把它调成你需要的形状,工具就会从中读出公式:标准析取范式(积之和)、标准合取范式(和之积),以及最短的等价形式。全部在浏览器中运行,你构建的真值表也保存在链接里。
| p | q | 输出 |
|---|---|---|
| ⊥ | ⊥ | |
| ⊤ | ⊥ | |
| ⊥ | ⊤ | |
| ⊤ | ⊤ |
点击输出值在真(⊤)和假(⊥)之间切换
如何把真值表转换为布尔表达式
每张真值表都是某个公式的真值表,其中两个公式可以直接读出来,无需代数变换,也无需猜测:
- 写出 n 个变量的全部 2ⁿ 行,并标出输出为 ⊤ 的那些行。
- 为每个 ⊤ 行写一个最小项:把所有变量用 AND 连接,对该行取假的变量取反。把这些最小项用 OR 连接,就得到 DNF。
- 为每个 ⊥ 行写一个最大项:把所有变量用 OR 连接,对该行取真的变量取反。把这些最大项用 AND 连接,就得到 CNF。
- 两个公式都恰好具有你开始时的那张表,所以任何一个都是正确答案。如果想要最短的形式,之后再做化简。
最小项
所有变量的合取(每个变量取反或不取反),它在表中恰好一行为真。DNF 是输出为 ⊤ 的各行的最小项的析取,因此每个 ⊤ 行对应一项。
最大项
所有变量的析取(每个变量取反或不取反),它在表中恰好一行为假。CNF 是输出为 ⊥ 的各行的最大项的合取,因此每个 ⊥ 行对应一项。
示例:异或
上面的表就是工具打开时的默认表:p 和 q,恰好在两个输入不同的行上为真。
- 有两行为 ⊤,所以 DNF 有两个最小项:(p ∧ ¬q) ∨ (¬p ∧ q)
- 另外两行为 ⊥,所以 CNF 有两个最大项:(p ∨ q) ∧ (¬p ∨ ¬q)
两者都无法再化简——异或确实需要这两项——这一点值得看一次:标准形式并不总是绕远路。像“p、q、r 中至多一个为真”这样的表,才是最简形式明显占优的地方。
理解布尔综合
析取范式 (DNF)
DNF将公式表示为AND的OR(积之和)。对于输出为真的每一行,我们创建一个最小项,将所有变量用AND连接,对假的变量取反。然后将这些最小项用OR连接形成完整的表达式。
合取范式 (CNF)
CNF将公式表示为OR的AND(和之积)。对于输出为假的每一行,我们创建一个最大项,将所有变量用OR连接,对真的变量取反。然后将这些最大项用AND连接形成完整的表达式。
DNF 与 CNF 对比
| 方面 | 析取范式(积之和) | 合取范式(和之积) |
|---|---|---|
| 构建自 | 输出为 ⊤ 的行,每行一个最小项 | 输出为 ⊥ 的行,每行一个最大项 |
| 形式 | 合取式的析取:AND 的 OR | 析取式的合取:OR 的 AND |
| 适用场景 | 想枚举使公式为真的各种情况,或设计 AND-OR 电路 | 想得到必须同时成立的约束,或 SAT 求解器所需的子句形式 |
真值表会有多大?
n 个变量的函数有 2ⁿ 行,因此每增加一个变量,表就翻一倍:两个变量 4 行,三个 8 行,四个 16 行,五个 32 行,本工具到此为止。DNF 每个 ⊤ 行取一项,CNF 每个 ⊥ 行取一项,两者合起来恰好覆盖每一行一次——而其中总有一个是更短的起点。
真值表综合的应用
将真值表转换为逻辑表达式是计算机科学和数字电子学的基础技术。此工具有助于:
- 数字电路设计 - 根据所需的输入输出行为创建逻辑门的布尔方程
- 软件开发 - 从规格表生成条件逻辑
- 学术研究 - 学习和练习布尔代数和命题逻辑
- 逻辑优化 - 比较DNF和CNF形式以找到更简单的等效表达式
常见问题
关于逻辑计算器使用方式的常见问题解答
“从真值表到表达式”这个工具是做什么的?
它让计算器反过来运行。你逐行点击来设定真值表的输出列,它就生成一个真值表恰好如此的公式,形式可以是析取范式(若干合取式的析取)或合取范式(若干析取式的合取)。
析取范式和合取范式有什么区别?
析取范式是积之和:输出为真的每一行对应一个合取式,全部用“或”连接。合取范式是和之积:输出为假的每一行对应一个析取式,全部用“与”连接。两者描述同一个函数,所以哪个对你的表格更短就用哪个——输出大多为假时析取范式较短,大多为真时合取范式较短。
合成工具最多支持几个变量?
最多五个,也就是 32 行的表格。每加一个变量行数就翻倍,超过五个之后,这张表就不再是能靠手工设定的东西了。
为什么生成的表达式这么长?
范式是一行一行搭起来的:每需要覆盖一行,就有一个包含全部变量的项。所以它的长度跟着真值表走,而不是跟着公式背后的想法走。它按构造保证正确,但不保证简洁。想缩短的话,把它放到计算器里打开,那里会列出等价形式,包括一个最小化的析取范式。
能得到一个公式的简化版本吗?
可以。把它输入计算器,看真值表下方的等价形式。其中既有依代数定律改写得到的形式,也有从真值表读出的析取范式和合取范式,以及一个最小化的析取范式。