算法之布尔表达式化简
概念介绍
布尔基础:
逻辑表达式: 由逻辑变量和与 ,或 ,非 3种运算符连接所构成的表达式。
析取式: 表达式之间都通过逻辑或连接的复合表达式。
合取式: 表达式之间都通过逻辑与连接的复合表达式。
合取范式 (Conjunctive Normal Form)2 是命题公式的一个标准型,它由一系列析取子句 用合取操作连接而来。如
与之相反,析取范式 (Disjunctive Normal Form) 是命题公式的另一个标准型,它由一系列 合取子句 用 析取操作 连接而来。如
表达式化简:
- 表达式相等: 两个表达式具有同样的变量,且对于变量的任意一组取值,表达式的值均相等,这两个表达式是相等的
- 最小项: 如果某个表达式的某个乘积(与)项包含了表达式的全部变量,其中每个表达式都以原变量或是反变量的形式出现。n个变量可以有2^n个最小项。
- 主析取式: 可以将表达式化简为全部由最小项组成的唯一表达式,也被称为主析取式(符合析取范式).
矩阵化提取析取范式
析取范式矩阵
设表达式出现的所有布尔变量为xi(i=1,2…n),n为布尔变量的个数,m为表达式的最小项个数。
例如 x1 x3 x5 + x2 x4 + x1 x2 x4 x5 可以写成:
1 | [ |
单个布尔变量可以看成一个特殊的析取范式,只有一个最小项,且最小项只有一个布尔变量。
矩阵的计算
或运算
表达式 A 与表达式 B 的或运算,只需要将A和B的矩阵各行合并在一起,就可以得到结果
1 | a11 a12 a13 ... a1n b11 b12 b13 ... b1n a11 a12 a13 ... a1n |
其中 n 为A和B 使用的布尔变量个数,m 为A 中最小项个数,g 为B 中最小项个数。
单行析范矩阵的与操作
对于两个单行析范矩阵,他们的与操作也是一个单行析范矩阵,该矩阵的元素分别是两个矩阵对应元素的计算结果:
1 | [a1 a2 ... an] * [b1 b2 ... bn] = [a1b1 a2b2 ... anbn] |
析范矩阵的与操作
布尔表达式A 与 布尔表达式B 进行与操作,只要将A与B的矩阵的各行两两进行单行析范矩阵的与操作。
- 1*1 = 1
- 1*0 =1
- 0*1 =1
- 0*0 =0
1 | 1 1 0 0 1 0 1 0 1 1 1 0 |
析范矩阵的吸收操作
在矩阵中,如果某行含有另一行的所有非0元素,那么这行要被删除.
1 | 1 1 0 0 |
如何从语法树生成析范矩阵
- 如果当前语法节点是叶子节点(
atom
或者 notatom
), 生成当前节点的一阶析范矩阵 - 如果当前不是叶子节点:
- 获取第一个子节点和第二个子节点
- 根据与,或规则进行计算
- 使用吸收,化简矩阵
- 根节点的矩阵就是化简结果
问题
本方法的问题是在化简过程中未对"非"操作的布尔变量做处理。最终结果中可能会存在仍有进一步结合的可能性("非"A 或 A),或者是可以消去的子集("非"A 与 A)。
矩阵化提取析取范式V2
这一节优化了上一版本的问题,即添加了对“非”操作布尔变量的处理。
提取矩阵
设表达式出现的所有布尔变量为xi(i=1,2…n),n为布尔变量的个数,m为表达式的最小项个数。
例如 x1 x3 x5 + x2 x4 + x1 x2 x4 x5 可以写成:
1 | [ |
例如 x1 !x3 x5 + x2 !x4 + x1 x2 x4 x5 可以写成:
1 | [ |
对于不可拆分的原子布尔变量,如果表达式存在该表达式填写1,不存在该表达式填写0,存在该表达式的非填写-1.
或运算
表达式 A 与表达式 B 的或运算,只需要将A和B的矩阵各行合并在一起,就可以得到结果
1 | a11 a12 a13 ... a1n b11 b12 b13 ... b1n a11 a12 a13 ... a1n |
其中 n 为A和B 使用的布尔变量个数,m 为A 中最小项个数,g 为B 中最小项个数。很显然或运算中不涉及值的计算。
与操作
计算真值表:
A\B | -1 | 0 | 1 | Ø |
---|---|---|---|---|
-1 | -1 | -1 | Ø | Ø |
0 | -1 | 0 | 1 | Ø |
1 | Ø | 1 | 1 | Ø |
Ø | Ø | Ø | Ø | Ø |
Ø 表示 A 与 A’ , 即 永远是false.
单行析范矩阵的与操作
对于两个单行析范矩阵,他们的与操作也是一个单行析范矩阵,该矩阵的元素分别是两个矩阵对应元素的计算结果:
1 | [a1 a2 ... an] * [b1 b2 ... bn] = [a1b1 a2b2 ... anbn] |
析范矩阵的与操作
布尔表达式A 与 布尔表达式B 进行与操作,只要将A与B的矩阵的各行两两进行单行析范矩阵的与操作。
1 | 1 1 0 0 1 0 1 0 1 1 1 0 |
析范矩阵的简化操作
在矩阵中,如果某行含有Ø元素,那么这行要被删除.
1 | -1 Ø 0 0 |
在矩阵中,如果某行含有另一行的所有非0元素,那么这行要被删除.
1 | 1 1 0 0 |
在矩阵中,如果某行与另一行,除了一个互斥,其他所有非0元素相同,那么这两行要被合并.
1 | 1 1 0 0 |
参考资料
[1] 任春玲,刘晓平.矩阵化方法在布尔表达式化简中的应用.计算机技术及应用进展.北京,2004:1174-1177.
[2] github示例代码