本篇把布尔表达式作为函数来研究:怎样表示、证明恒等式,以及化简实现。二元布尔代数连接了命题真值表与数字逻辑。命题和量词的基础用法见数学基础,形式推导和推理算法则在后续独立章节中展开。
这里主要研究二元布尔代数,不试图完整分类抽象布尔代数。基本运算是与、或、补,异或属于派生运算。本篇回顾真值表,是为了建立代数等价与函数表示,不再重复基础篇的证明方法训练。
布尔表达式与真值表
布尔代数之所以叫“代数”,是因为它和普通代数一样,有一套对任意取值都成立的运算律。先回顾数的运算律,再把同样的思路搬到真值上。列全输入组合后得到的表,就是真值表。
代数运算的性质
对普通的数 x、y、z,加减乘除服从下表中的定律。
| 定律 | 加法形式 | 乘法形式 |
|---|
| 单位元 | x+0=x | x⋅1=x |
| 零元 | | x⋅0=0 |
| 逆元 | x+(−x)=0 | x⋅x−1=1(x=0) |
| 交换律 | x+y=y+x | x⋅y=y⋅x |
| 结合律 | (x+y)+z=x+(y+z) | (x⋅y)⋅z=x⋅(y⋅z) |
| 分配律 | | x⋅(y+z)=x⋅y+x⋅z |
普通代数定律
这里的 x、y、z 和程序里的变量一样,定律对它们的一切允许取值都成立。代数等式之所以能证,正是因为这些定律可以反复使用。以 (−1)×(−1) 为例:很多人脱口而出答案是 1,但为什么?下面只用表中的定律来证。
例证明 (−1)(−1)=1 证明 (−1)×(−1)=1。
证明
(−1)×(−1)=((−1)×(−1))+0=((−1)×(−1))+((−1)+1)=(((−1)×(−1)+(−1))+1)=(((−1)×(−1)+((−1)×1))+1)=((−1)×((−1)+1))+1=((−1)×0)+1=0+1=1+0=1.表里加法单位元只写成 x+0=x,所以要把 0+1 换成 1+0,再用一次加法交换律,才能套上已知结论。
当然,平时算 (−1)×(−1) 不必每次都写这么长。真正要记住的是:数学结论不能停留在“负负得正”这类口诀上,必须能给出可核对、可重复的证明。
布尔表达式与真值表
为什么布尔代数还要先翻一遍小学算术?因为后面证明布尔等式的方法完全一样。先引入布尔值及其运算。
定义布尔值
在数学和计算机科学里,布尔值是布尔域 B 中的元素,可写成
B={0,1}其中 0 表示假,1 表示真。
这和第一章里命题的真假是同一件事:在给定条件下成立就取真,不成立就取假。布尔值是布尔表达式的取值基础,为变量给定取值后,布尔表达式才能求得一个布尔值;赋值之前,它通常表示一个函数,而不是常量。
定义布尔代数
布尔代数在布尔值上定义与、或、非、异或等运算,规定如下。
- 与(∧):两个运算元都为真时结果为真,否则为假。
- 或(∨):至少一个运算元为真时结果为真,否则为假。
- 非(¬):一元运算,真变假、假变真。
- 异或(⊕):两个运算元不同时结果为真,相同时为假。
后面还会引入更多派生运算。
在程序里,布尔值决定条件语句和循环是否执行;在硬件里,它们对应门电路的电平。下面用真值表列出这些基本运算:左列是输入组合,右列是输出。
基本布尔运算的真值表
| A | B | A∧B |
|---|
| F | F | F |
| F | T | F |
| T | F | F |
| T | T | T |
基本布尔运算的真值表
| A | B | A∨B |
|---|
| F | F | F |
| F | T | T |
| T | F | T |
| T | T | T |
基本布尔运算的真值表
| A | B | A⊕B |
|---|
| F | F | F |
| F | T | T |
| T | F | T |
| T | T | F |
基本布尔运算的真值表
不同运算的元数不必相同。¬ 只吃一个输入,其余三个都是二元运算。
布尔空间取 B={0,1},对应两个真值。四则运算里只有加法和乘法会在 {0,1} 上封闭成一张小表;布尔表达式则通常由 ¬、∧、∨ 生成,其余运算都能用这三者写出来。例如
A⊕B=(A∧¬B)∨(¬A∧B).
0 与 1 的乘法表、加法表如下。
| A | B | A×B |
|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
0 与 1 的乘法与加法
| A | B | A+B |
|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
0 与 1 的乘法与加法
对照前面的真值表就会发现:这两张表正是 ∧ 和 ∨ 的真值表。布尔加法在这里取的是 1+1=1,不是普通算术里的 2。
布尔恒等式
刚才写过 A⊕B=(A∧¬B)∨(¬A∧B)。右端不能直接套 ∨ 的两行真值表读出答案,必须按子表达式逐步填表。
| A | B | ¬B | A∧¬B | ¬A | ¬A∧B | (A∧¬B)∨(¬A∧B) |
|---|
| F | F | T | F | T | F | F |
| F | T | F | F | T | T | T |
| T | F | T | T | F | F | T |
| T | T | F | F | F | F | F |
(A∧¬B)∨(¬A∧B) 的真值表
用同样的办法可以给更复杂的表达式造表。左右两端各自列表、逐行相同,就证明了一条恒等式。下面这些是最常用的基本布尔恒等式。
| 恒等式 | 与形式 | 或形式 |
|---|
| 幂等律 | x⋅x=x | x+x=x |
| 单位律 | x⋅1=x | x+0=x |
| 支配律 | x⋅0=0 | x+1=1 |
| 补元律 | x⋅¬x=0 | x+¬x=1 |
| 双重否定律 | ¬(¬x)=x | ¬(¬x)=x |
| 交换律 | x⋅y=y⋅x | x+y=y+x |
| 结合律 | x⋅(y⋅z)=(x⋅y)⋅z | x+(y+z)=(x+y)+z |
| 分配律 | x⋅(y+z)=(x⋅y)+(x⋅z) | x+(y⋅z)=(x+y)⋅(x+z) |
| 德摩根律 | ¬(x+y)=¬x⋅¬y | ¬(x⋅y)=¬x+¬y |
| 吸收律 | x⋅(x+y)=x | x+(x⋅y)=x |
基本布尔恒等式
这些定律和普通代数定律地位相当:化简复杂表达式时几乎步步都要用。本节习题会要求用真值表核对其中几条。对某一条有疑问,就把左右两端分别列表,行行对照即可。
表还没列全。两条与派生运算有关的定律暂时留到下一小节,其中一条已经出现过,就是 ⊕。
有了基本定律,可以推出更有用的定理。化简时常用的一条是合意定理,也叫冗余定理。
定理合意定理
合意定理删掉布尔表达式里的冗余项。它和前面的恒等式一样,有或形式与与形式。对布尔变量 x、y、z,
xy∨xˉz∨yz=xy∨xˉz,这等价于
(x∨y)(xˉ∨z)(y∨z)=(x∨y)(xˉ∨z).
证明
或形式可以由下面的计算得到:
xy∨xˉz∨yz=xy∨xˉz∨(x∨xˉ)yz=xy∨xˉz∨xyz∨xˉyz=(xy∨xyz)∨(xˉz∨xˉyz)=xy(1∨z)∨xˉz(1∨y)=xy∨xˉz.改成加法记号,同一条恒等式是
xy+xz+yz=xy+xz+(x+x)yz=xy+xz+xyz+xyz=(xy+xyz)+(xz+xyz)=xy(1+z)+xz(1+y)=xy+xz.
派生布尔运算
定义派生布尔运算
由基本运算可以定义下列派生运算。
- 实质蕴涵:x→y=¬x∨y
- 实质双条件:x↔y=(x∧y)∨(¬x∧¬y)
- 异或:
x⊕y=¬(x↔y)=(x∨y)∧(¬x∨¬y)=(x∧¬y)∨(¬x∧y)
它们的真值表如下。
| x | y | x→y | x↔y | x⊕y |
|---|
| 0 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 | 0 |
实质蕴涵、双条件与异或在全部输入上的真值
→ 满足 x→x=1:只要 x=y,蕴涵就为真。派生运算以及蕴涵相关的恒等式,是本章要补上的最后一批布尔恒等式。
-
实质蕴涵(→)。读作“若 x 则 y”,或“x 蕴涵 y”。只有 x 真且 y 假时,x→y 为假;其余情形都为真。x 为假时,无论 y 取什么,蕴涵都为真,这一点常常反直觉。用基本运算写就是 ¬x∨y。
-
实质双条件(↔)。也叫逻辑等价:当且仅当 x 与 y 同真或同假时为真。读作“x 当且仅当 y”。写成基本运算是 (x∧y)∨(¬x∧¬y)。
-
异或(⊕)。x 与 y 一真一假时为真。它和普通或的差别在于:两者都真时异或为假。写成 (x∧¬y)∨(¬x∧y)。
有了这些运算和恒等式,不必每次都画真值表,可以直接用代数变形证明更多定理。下面几条就用这个办法。
例用前面的恒等式表证明下列等式
用前面给出的恒等式表证明下列等式。
| 表达式 | 名称 |
|---|
| (x→False)=(¬x) | 把 ¬ 写成 → |
| (x→y)=(¬y→¬x) | 逆否 |
| ((x→y)∧(x→z))=(x→(y∧z)) | 蕴涵对合取的分配 |
| ((x→y)∧(¬x→y))=y | 归谬 |
| (x→(¬x))=(¬x) | 矛盾 |
证明
把 ¬ 写成 →,只需用 → 的定义:
x→ False=¬x∨False=¬x+0=¬x,最后一步是或的单位律。
逆否命题说 (x→y) 与 (¬y→¬x) 逻辑等价:
x→y≡¬x∨y≡y∨¬x≡¬y→¬x.中间用了或的交换律。这正说明第一章里“逆否证明”为什么合法。
蕴涵对合取的分配,要证明 (x→y)∧(x→z) 等价于 x→(y∧z):
(x→y)∧(x→z)≡(¬x∨y)∧(¬x∨z)≡¬x∨(y∧z)≡x→(y∧z).归谬恒等式说 (x→y)∧(¬x→y) 等价于 y:
(x→y)∧(¬x→y)≡(¬x∨y)∧(x∨y)≡y∨(x∧¬x)≡y∨False≡y.矛盾恒等式说 x→(¬x) 等价于 ¬x:
x→(¬x)≡¬x∨(¬x)≡¬x.
回头看整段推导,其实就是在化简布尔表达式:定律用熟了,就不必反复列表。
习题
练习用表 1 证明 (x+x)=(2×x) 利用前面的普通代数定律表,以及 1+1=2,证明 (x+x)=(2×x)。
证明
(2×x)=(1+1)×x=1×x+1×x=x+x.第一步用 1+1=2,第二步用分配律,第三步用乘法单位元。
练习证明 ((−1)×x)+x=0 用定律表证明 ((−1)×x)+x=0。
证明
((−1)×x)+x=x(−1+1)=x×0=0.依次用分配律、加法逆元、乘法零元。
练习证明 (x+(((−1)×(x+y))+z))+y=z 证明
(x+(((−1)×(x+y))+z))+y=z,可以用上一题的结论。
证明
为了看清层次,用方括号和花括号区分括号层。
{x+[((−1)×(x+y))+z]}+y={x+[((−1)×x)+((−1)×y)]+z}+y={x+((−1)×x)+[((−1)×y)+z]}+y={((−1)×x)+x+ [((−1)×y)+z]}+y=0+{[((−1)×y)+z]+y}={[((−1)×y)+z]+y}+0={[((−1)×y)+z]+y}=((−1)×y)+(z+y)=(z+y)+((−1)×y)=z+[y+((−1)×y)]=z+[((−1)×y)+y]=z+0=z.用到的依次是分配律、加法结合律、加法交换律、上一题结论、加法单位元,以及再次使用结合律和交换律。
练习用真值表验证德摩根律
用真值表说明德摩根律成立。
证明
德摩根第一定律:¬(A∧B)=¬A∨¬B。
| A | B | A∧B | ¬(A∧B) | ¬A∨¬B |
|---|
| 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 |
德摩根第二定律:¬(A∨B)=¬A∧¬B。
| A | B | A∨B | ¬(A∨B) | ¬A∧¬B |
|---|
| 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 |
证明
| x | y | x∨y | x∧(x∨y) |
|---|
| T | T | T | T |
| T | F | T | T |
| F | T | F | F |
| F | F | F | F |
| x | y | x∧y | x∨(x∧y) |
|---|
| T | T | T | T |
| T | F | F | T |
| F | T | F | F |
| F | F | F | F |
练习写出 x∨((¬y)∧(¬z)) 的真值表 写出 x∨((¬y)∧(¬z)) 的真值表。
三个变量时,输入组合有 23=8 种。
| x | y | z | ¬y | ¬z | (¬y)∧(¬z) | x∨((¬y)∧(¬z)) |
|---|
| 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 |
x∨((¬y)∧(¬z)) 的真值表
练习证明四个表达式等价并化简
给定
1.2.3.4.(x→y)∧(¬x→¬y)((¬x)∨y)∧(x∨(¬y))¬((x∧(¬y))∨((¬x)∧y))¬((x∨y)∧(¬x∨¬y)),证明它们彼此等价,并求出共同的化简形式。
证明
(x→y)∧(¬x→¬y)≡(¬x∨y)∧(x∨¬y)≡(x∨¬y)∧(¬x∨y)≡(x∨¬y)∧(y∨¬x).第一步用蕴涵的定义,后面两步分别用或、与的交换律。
((¬x)∨y)∧(x∨(¬y))≡(y∨¬x)∧(x∨¬y)≡(x∨¬y)∧(y∨¬x).¬((x∧(¬y))∨((¬x)∧y))≡¬(x∧(¬y))∧¬((¬x)∧y)≡(¬x∨y)∧(x∨¬y)≡(x∨¬y)∧(y∨¬x).前两步都是德摩根律。
¬((x∨y)∧(¬x∨¬y))≡¬(x∨y)∨¬(¬x∨¬y)≡(¬x∧¬y)∨(x∧y)≡(x∧y)∨(¬x∧¬y)≡(x∨¬y)∧(y∨¬x).最后一步用分配律,把合取的析取写成析取的合取。四个表达式都可以化成 (¬y∨x)∧(¬x∨y),也就是 (y→x)∧(x→y),即 x↔y:x 与 y 同真或同假。
练习证明合意定理的两种形式等价
证明合意定理的两种形式等价:
xy∨xˉz∨yz=xy∨xˉz与
(x∨y)(xˉ∨z)(y∨z)=(x∨y)(xˉ∨z).
把积形式展开,化成和形式:
(x∨y)(x∨z)(y∨z)=xx∨xz∨yx∨yz∨xy∨xz∨y2∨yz=0∨xz∨yx∨yz∨xy∨xz∨y∨yz=xz∨yx∨yz∨xy=xy∨xz∨yx.
右端与或形式在吸收 yz 之前的展开一致,再对或形式用合意定理去掉 yz,两种写法表示同一个函数。
布尔函数
普通代数里可以把 2x+3 看成函数 f(x)=2x+3。布尔运算同样可以定义布尔函数。
定义布尔函数
布尔函数对每一种布尔输入组合返回一个布尔值。写成 f:Bn→B,即从 n 元布尔组到布尔值的映射,其中 B={0,1}。
基本运算都可以写成函数。
-
代数记号:
- 与:f(x,y)=x⋅y 或 f(x,y)=xy
- 或:f(x,y)=x+y
- 非:f(x)=x′ 或 f(x)=x
-
逻辑记号:
- 与:f(x,y)=x∧y
- 或:f(x,y)=x∨y
- 非:f(x)=¬x
真值表其实就是函数表:每个输入对应一个输出。实函数 f:R→R 的表列不完,因为实数无穷多。布尔函数好办得多:每个输出只有一个比特,而 ∣B∣=2,于是 n 个输入只有 2n 种情形。2n 看起来不小,但实际电路里变量个数多半不超过五个,表仍然画得下。
布尔函数的表示
多数时候,函数是从一张真值表造出来的。任意布尔函数都可以写成析取范式(积之和,SOP)或合取范式(和之积,POS)。
定义积之和形式
积之和(SOP),也叫析取范式(DNF),把布尔函数写成若干积项的和(逻辑或)。每个积项由文字(变量或其补)组成,对应函数值为 1 的那些输入,也就是小项。一般形状是
f(x1,x2,…,xn)=i=1∑mj=1∏nxj(i),其中 m 是小项个数,n 是变量个数,xj(i) 在第 i 个小项里取 xj 或 xj′,由该小项中 xj 的取值决定。
定义和之积形式
和之积(POS),也叫合取范式(CNF),把布尔函数写成若干和项的积(逻辑与)。每个和项由文字组成,对应函数值为 0 的那些输入,也就是大项。一般形状是
f(x1,x2,…,xn)=i=1∏Mj=1∑nxj(i),其中 M 是大项个数,n 是变量个数,xj(i) 在第 i 个大项里取 xj 或 xj′,由该大项中 xj 的取值决定。
为什么只盯着某一行输出是 1 还是 0?因为构造布尔函数就是在做 Bn 到 B 的映射,而 B={0,1},输出只有两种可能。因此只需掌握全部出 1 的情形,或全部出 0 的情形,另一种就自动确定。这正是标准型定理的内容。
定理布尔函数的标准型
任意布尔函数都可以写成下面两种标准型之一。
- 积之和(SOP / DNF):函数等于若干小项的析取。小项是文字的合取,对应真值表中函数值为 1 的行。
- 和之积(POS / CNF):函数等于若干大项的合取。大项是文字的析取,对应真值表中函数值为 0 的行。
证明
任取布尔函数 f(x1,x2,…,xn),分别构造 SOP 与 POS。
SOP(DNF)。
- 对真值表中函数值为 1 的每一行,把该行的输入写成一个小项:变量取 1 时用原变量,取 0 时用补。
- 把这些小项全部析取,得到 SOP。
每个出 1 的输入都对应一个小项,这些小项的析取恰好在这些输入上为 1,所以 SOP 与原函数相同。
POS(CNF)。
- 对函数值为 0 的每一行,把该行的输入写成一个大项:变量取 0 时用原变量,取 1 时用补。
- 把这些大项全部合取,得到 POS。
每个出 0 的输入都对应一个大项,这些大项的合取恰好在这些输入上为 0,所以 POS 与原函数相同。
因此任意布尔函数都可以写成 SOP 或 POS。
例由真值表写 XNOR 的 SOP 与 POS
考虑
| x | y | f(x,y) |
|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
熟悉运算的话会看出这就是 XNOR,也就是异或的否定。下面分别写出代数表达式的 POS 与 SOP。
解SOP 与 POS
SOP 方面:
- 函数值为 1 的输入组合对应小项 m0=x′y′,m3=xy。
- SOP:f(x,y)=m0+m3=x′y′+xy。
POS 方面:
- 函数值为 0 的输入组合对应大项 M1=x+y′,M2=x′+y。
- POS:f(x,y)=M1⋅M2=(x+y′)(x′+y)。
同一张真值表可以在两种标准型之间转换。
变量再多,手续不变,只是行数变多。更多例子见本节习题。
布尔函数的性质
下面讨论完备性与对偶,然后给出布尔代数基本定理,也就是 Boole 展开(Shannon 展开)。它是组合逻辑设计和实现的基础。
定理函数完备性
一组布尔运算称为函数完备,如果只用这组运算就能写出每一个布尔函数。下面几组是函数完备的。
- {AND, OR, NOT},标准基底。
- {NAND},只用与非门。
- {NOR},只用或非门。
数字电路设计依赖这条性质:门的种类可以很少,但仍然能实现任意布尔函数。
证明与、或、非为什么足够
对每个使 f=1 的输入行构造一个合取:该行第 i 位为一就用 xi,为零就用 ¬xi。这个合取恰好只在该行成立。把所有这样的合取析取起来,就在每一行都与 f 相同。若没有真行,取常量零;有输入变量时也可写成 x∧¬x。因此任意有限元布尔函数都能由这组算子表示。下面再把这组算子分别用 NAND 或 NOR 实现;零输入函数则需要明确提供常量。
换句话说,任意布尔函数都可以只用 {AND, OR, NOT} 来写,也可以只用 NAND,或只用 NOR。第一点已经清楚:派生运算都能改写成这三者。NAND 与 NOR 能生成全部基本门,证明如下。
证明
所有布尔运算都能用 ¬,∧,∨ 写出。因此只需证明 {AND, OR, NOT} 都能用 NAND 实现,也都能用 NOR 实现。
-
只用 NAND:
- 非门:把 NAND 的两个输入短接,就得到非。
- 与门:NAND 的输出再接一个非(仍用 NAND)就是与。
- 或门:用德摩根律,x+y=(x′⋅y′)′。
-
只用 NOR:
- 非门:把 NOR 的两个输入短接,就得到非。
- 或门:NOR 的输出再接一个非就是或。
- 与门:用德摩根律,x⋅y=(x′+y′)′。
三种基本门都能只用 NAND 或只用 NOR 实现,完备性得证。
定理对偶原理
对由与、或、非及常量构成的表达式,交换与和或、零和一,同时保留变量及非运算,就得到对偶表达式。对应函数满足
fD(x1,…,xn)=¬f(¬x1,…,¬xn).因此对偶不依赖同一函数选用哪种表达式,且 (fD)D=f;任意恒等式两边同时取对偶,仍为恒等式。
证明
按表达式结构归纳。单个变量时,右边为 ¬¬x=x,所以 xD=x,不是 ¬x;常量零和一则互换。假设公式对 g,h 成立,由德摩根律,
¬(g(¬x)∧h(¬x))=gD(x)∨hD(x).交换与和或,得到另一个二元构造的情形。对于非运算,¬(¬g(¬x))=g(¬x)=¬gD(x),也满足所需公式。所有构造均已覆盖。公式只取决于函数值,故与表达式的选择无关;连续应用两次,输入和输出的两次否定各自抵消,便得双重对偶。相等函数同时替换输入再否定输出仍相等,因此恒等式也保留。
例如 (x∨¬y)D=x∧¬y,((a∨b)∧¬c)D=(a∧b)∨¬c。NAND 与 NOR 互为对偶;蕴涵 ¬x∨y 的对偶是 ¬x∧y,不是逆蕴涵。对偶改变的是连接词结构,不能额外把每个文字都取反。
下面的定理按某个变量的取值分解函数。
定理Boole 展开定理
Boole 展开(Shannon 展开)是恒等式
F=x⋅Fx+x′⋅Fx′,其中 F 是任意布尔函数,x 是一个变量,x′ 是它的补,Fx 与 Fx′ 分别是把 F 中的 x 固定为 1 和固定为 0 得到的函数。这两个子函数也叫 F 关于 x 的正、负 Shannon 余因子,可由限制运算 restrict(F,x,1) 与 restrict(F,x,0) 算出。写得更显式一些:
f(X1,X2,…,Xn)=X1⋅f(1,X2,…,Xn)+X1′⋅f(0,X2,…,Xn).
证明
设 f(x1,x2,…,xn) 是 n 元布尔函数,选定变量 xi。定义两个子函数:
fxifxi=f(x1,x2,…,xi=1,…,xn)=f(x1,x2,…,xi=0,…,xn).考虑表达式
f=xi⋅fxi+xi⋅fxi=(xi⋅1+xi⋅0)⋅fxi+(xi⋅0+xi⋅1)⋅fxi=xi⋅fxi+xi⋅fxi.对任意输入 (x1,x2,…,xn),xi 与 xi 恰好一个为真。因此两个积项里恰有一项为 0,另一项等于 f 在该输入上的值。
若 xi 为真,则 xi⋅fxi=fxi 且 xi⋅fxi=0,表达式等于 fxi,这正是 xi 为真时 f 的值。
若 xi 为假,则 xi⋅fxi=0 且 xi⋅fxi=fxi,表达式等于 fxi,这正是 xi 为假时 f 的值。
因此 xi⋅fxi+xi⋅fxi 在全部输入上都等于 f,Shannon 展开成立。
记 f1,f0 为分别固定 x=1,0 后的余因子,其对偶只针对剩余变量。对 Shannon 表达式取对偶,得到
fD=(x∨f1D)∧(¬x∨f0D).
当 x=0,该式为 f1D;当 x=1,为 f0D。因此也可写成积之和:
fD=(¬x∧f1D)∨(x∧f0D).
分支值交换,是因为对偶的语义公式先对输入取反,再计算 f。
布尔函数的化简
化简布尔函数是数字逻辑设计的关键步骤:在不改变真值表的前提下减少表达式的复杂度。办法很多,下面只写最常用的几种。
用布尔定律化简
上一节的恒等式已经能化简表达式。变量一多,真值表就变得笨重:四个输入已有 24=16 行,SOP 或 POS 也可能含很多项。更大规模时,通常改用卡诺图或算法化的最小化方法。
用卡诺图化简
卡诺图(K-map)是最多六个变量时的可视化化简工具。它把计算负担转成人眼对相邻格子的识别。
卡诺图本质上是排成网格的真值表。每个格子对应一种输入,相邻格子只差一个变量。因此相邻的 1 可以圈在一起,对应布尔代数里“只差一个文字的两项可以合并、消掉那个文字”。合并规则于是变成圈格子。
例四变量真值表的卡诺图化简
考虑下面的真值表。
| X1 | X2 | X3 | X4 | Z1 |
|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 | 0 |
找出小项,得到四变量 SOP:
F1(X1,X2,X3,X4)=X1 X2 X3 X4+X1 X2 X3X4+X1 X2X3X4+X1X2X3X4+X1X2X3X4+X1X2X3X4+X1 X2 X3X4+X1X2X3X4+X1X2X3 X4+X1X2X3X4.用定律硬化简会很慢。改画卡诺图。变量组合的顺序必须按 格雷码:相邻编码只翻一比特。两个变量时顺序是 00,01,11,10。要写 SOP,就把所有 1 按下面的规则圈起来。
卡诺图圈组的规则来自布尔代数,目的是尽量少留文字。
- 二的幂。 每组格子数必须是 1,2,4,8,…,这样才能对应一个化简后的积项。
- 尽量大。 组越大,积项里剩下的变量越少。
- 允许重叠。 为了得到更大的组,格子可以属于多个组。
- 可以卷边。 卡诺图在拓扑上是环面:上下边相邻,左右边相邻。
- 罩住全部 1。 每个 1 至少进一个组。
- 0 一般不进组。 除非为了凑更大的 1 的组(通常不这么做;无关项另说)。
- 本质质蕴涵。 若某组罩住了一个别的组都罩不到的小项,这个组必须进入最终表达式。

按这些规则得到右图的分组。逐组消去组内不一致的变量。
- 绿组含 X1 X2 X3 X4 与 X1X2X3 X4,消掉 X2,留下 X1 X3 X4。
- 红组含 X1 X2 X3X4 与 X1X2 X3X4,消掉 X1,留下 X2 X3X4。
- 蓝组含 X1 X2X3X4 与 X1X2X3X4,消掉 X2,留下 X1X3X4。
- 紫组含 X1X2X3X4 与 X1X2X3X4,消掉 X4,留下 X1X2X3。
- 黄组含 X1X2X3 X4 与 X1X2X3X4,消掉 X4,留下 X1X2X3。
- 粉组只有一格,必须保留 X1X2X3X4。
各项用 + 连接,得到化简后的 SOP:
F1=X1 X3 X4+X2 X3X4+X1X3X4+X1X2X3+X1X2X3+X1X2X3X4.
十项收成六项,看起来像变魔术。可它并不能包办一切:变量到七个及以上,图就画不住了。
SOP 会了,POS 也可以:对图中的 0 重复同一套圈组规则,再把每组不一致的变量消掉,写成和之积。
卡诺图通常只用到四到六个变量,原因是实际限制,不是理论上不能画更大的图。
- 视觉复杂度。 卡诺图靠空间排列让人眼发现模式。超过六个变量后,格子排布很难一眼读懂。
- 认知负担。 人脑同时处理的视觉信息有限,每多一个变量,出错机会都明显上升。
- 格子数目。 每加一个变量,格子数翻倍。六变量已有 64 格,七变量 128 格,手工圈组不再现实。
- 效率与错误。 变量一多,圈组更容易漏或重。这时更适合程序化方法,例如后面的奎因-麦克拉斯基算法,或 二叉决策图(BDD)。
因此,六个变量以上虽然理论上还能画卡诺图,实际上会改用别的最小化方法。
从集合角度看,每个格子对应变量取值域幂集里的一个元素,也就是一种取值组合。相邻格子只差一个坐标,对应集合论里“相差最少条件”的相邻。圈组相当于把共享同一特征的子集并起来,从而在表达式里只留下必要变量。化简后的函数就是这些组的并。目标是:用尽可能少、尽可能大的相邻组罩住全部 1(函数的真值集),再把各组译回布尔表达式。
用奎因-麦克拉斯基方法化简
奎因-麦克拉斯基方法由 W. V. Quine 与 E. J. McCluskey, Jr. 在二十世纪五十年代给出。它提供机械化的化简手续,适用面比卡诺图更广。
该方法也叫质蕴涵法:先找出函数的全部质蕴涵,再从中抽出本质质蕴涵,得到最简表达式。与卡诺图不同,它不依赖视觉模式,因此适合编程,也能处理变量很多的函数。
步骤如下。
- 把函数的小项写成二进制。
- 按二进制表示里 1 的个数分组。
- 在相邻组中比较每一对小项,找出恰好差一比特的对,合并成新项,并给被合并的小项做标记。
- 重复直到不能再合并。留下未标记的项,就是质蕴涵。
- 用质蕴涵表找出本质质蕴涵,并选出函数的最小覆盖。
写成伪代码如下。
算法 1 奎因-麦克拉斯基化简
Require: 布尔函数 f
Ensure: 化简后的布尔表达式
1:把 f 的每一项写成二进制,得到小项。
2:按二进制表示中 1 的个数把小项分组。
3:while 还能继续合并 do
4:把相邻组中恰好差一比特的对合并。
5:给被合并的小项做标记。
6:end while
7:收集未标记的项,作为质蕴涵。
8:构造质蕴涵表并选出最小覆盖。
9:return 化简后的函数
习题
练习把异或和蕴涵写成布尔函数
把异或和蕴涵写成布尔函数。
解异或与蕴涵
F(x,y)=x⊕y=(x∧¬y)∨(¬x∧y)=xy′+x′y.F(x,y)=x→y=¬x∨y=x′+y.
练习用表列出下列布尔函数的取值
用表列出下列布尔函数在全部输入上的值。
- F(x,y,z)=xy
- F(x,y,z)=x+yz
- F(x,y,z)=xy+(xyz)
- F(x,y,z)=x(yz+yz)
第三个函数由吸收律化为 xy;第四个利用 y+y=1 化为 xz。
| x | y | z | xy | x+yz | xy+xyz | x(yz+yz) |
|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 |
练习用代数方法证明布尔函数的对偶
用代数方法证明布尔函数的对偶原理。
证明
前面的结构归纳证明已经覆盖变量、常量、两个二元连接词及非运算。特别地,对 f=x∨¬y,直接取对偶与计算 ¬f(¬x,¬y)=¬(¬x∨y),都会得到 x∧¬y。
练习用卡诺图化简下列真值表给出的函数
用卡诺图化简下列真值表给出的布尔函数。
| X1 | X2 | X3 | X4 | Z1 |
|---|
| 0 | 0 | 0 | 0 | 1 |
| 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 | 0 |
函数的 SOP 为
F2(X1,X2,X3,X4)=X1 X2 X3X4+X1 X2X3X4+X1 X2X3X4+X1X2X3 X4+X1X2X3X4+X1X2 X3 X4+X1X2 X3X4+X1X2X3X4+X1X2X3 X4+X1X2X3X4.卡诺图如下。

- 蓝组含 X1 X2X3X4 与 X1X2X3X4,消掉 X2,留下 X1X3X4。
- 黄组含 X1X2X3 X4 与 X1X2X3 X4,消掉 X1,留下 X2X3 X4。
- 红组有四格,可以消掉两个变量;此处 X3 与 X1 在组内不固定,留下 X2X4。
- 绿组也是四格,消掉 X2 与 X4,留下 X1X3。
因此化简后的 SOP 为
F2=X1X3 X4+X2X3 X4+X2X4+X1X3.
练习只用与和非表示下列函数
只用运算 ⋅(与)和补(非)表示下列布尔函数。
- x+y+z
- x+y(x+z)
- x+y
- x(x+y+z)
解用德摩根律消去或
每次出现 s+t,都换成 s⋅t,必要时再用双重否定化简。
- x+y+z=x⋅y⋅z。
- 先写 x+z=x⋅z,于是
x+y(x+z)=x⋅y⋅x⋅z.
- x+y=x⋅y。
- x+y+z=x⋅y⋅z,因此
x(x+y+z)=x⋅x⋅y⋅z.
求布尔函数 F(x1,x2,x3,x4,x5) 的积之和展开,使得该函数取 1 当且仅当 x1,x2,x3,x4,x5 中至少三个取值为 1。
解列出全部至少三个原变量的小项
需要列入所有至少三个变量以原变量(不取补)出现的项。五个变量里取三个、四个、五个的组合数是 10+5+1=16,所以共 16 项:
F(x1,x2,x3,x4,x5)= + + + + + + + x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5x1x2x3x4x5+x1x2x3x4x5.
练习满足对称翻转条件的三元函数个数
有多少个不同的布尔函数 F(x,y,z) 满足:对布尔变量 x,y,z 的一切取值,都有
F(x,y,z)=F(x,y,z)=F(x,y,z)?
解由两个自由值决定其余取值
先指定 F(0,0,0)。条件迫使 F(0,0,0)=F(1,1,0) 以及 F(0,0,0)=F(1,0,1),从而也有 F(1,1,0)=F(0,1,1),到此仍未限制其余点。再指定 F(1,1,1)(此前对它没有限制),同样的关系就决定了 F(0,0,1)、F(0,1,0)、F(1,0,0)。函数至此完全确定。F(0,0,0) 有两种选法,F(1,1,1) 也有两种,因此一共 2×2=4 个这样的函数。
练习布尔域 Bn 的几何图像 第一部分讨论过欧氏空间的可视化。现在说明怎样想象 Bn。
- B、B2、B3 各是什么几何对象?
- 怎样借助 B3 来理解 B4?
解超立方体
集合 B 是布尔域,只有两个元素 0 和 1。更高维时:
- B2 可以看成二维网格上的正方形,四个顶点对应 (00,01,10,11)。
- B3 把这件事抬成三维立方体,八个顶点对应 (000,001,010,011,100,101,110,111)。
B4 无法直接用三维空间看完。可以把它想成超立方体(镶嵌体):每个顶点对应一个四元布尔组,从 0000 到 1111。虽然不能在空间里“看见”四维,但仍可以用四维二进制网格来标记每个点。
下面把布尔域画成欧氏空间中的点集。

谓词与量词
布尔函数以真值为输入,谓词则描述指定论域中的对象,量词在这个论域中取值。基本定义和否定律见命题与公理系统;形式语法、变量作用域、替换和量词推理规则则集中在形式逻辑与自然演绎。
推理与演绎
代数化简保持函数不变,推理则研究哪些结论能从前提得到。建议依次阅读形式逻辑与自然演绎、命题逻辑的自动推理,以及一阶逻辑的归结与定理证明。这里学到的 CNF 会成为归结和 SAT 的输入,卡诺图与布尔化简则继续保留在代数主线上。
评论