2.4.3 布尔代数运算定律*
将实际问题所涉及的条件表达成布尔表达式,并且能对布尔表达式进行演算,这是程序员必须具备的重要能力。前面介绍的逻辑运算符用于表达各种复杂条件,下面介绍用于布尔 表达式演算、推导的一些运算定律。
我们不加证明地罗列一些布尔代数中常用的定律如下,其中 a、b、c 代表任意布尔表 达式。为了不与赋值符号=和比较运算符==混淆,我们用<=>来表示左右相等。
(1)a and False <=> False
(2)a and True <=> a
(3)a or False <=> a
(4)a or True <=> True
从以上四条定律可见,and 类似于二进制算术中的乘法运算,or 类似于加法运算,True 类似于 1,False 类似 0。这不是巧合,事实上,布尔代数和二进制代数本质上是一样的。
下面两条定律称为分配律:
(5)a or (b and c) <=> (a or b) and (a or c)
(6)a and (b or c) <=> (a and b) or (a and c)
对否定的否定当然就是肯定,这就是双重否定律:
(7)not(not a) <=> a
下面两条定律称为 De Morgan 定律,用于将 not 深入到被否定表达式的内部。
(8)not(a or b) <=> (not a) and (not b)
(9)not(a and b) <=> (not a) or (not b)
程序设计中布尔代数运算定律可以用来化简复杂的布尔表达式,以便代码更容易理解。
以上面的继续进行一局比赛的条件为例,
not (a == 11 or b == 11)
<=> (not (a == 11) and not (b == 11))
<=> a != 11 and b != 11
原来的继续比赛条件 not (a == 11 or b == 11)可以直接解读为:当“(a 得到 11 分或者 b 得到 11 分)不是事实”。这似乎不太合乎我们的日常表达方式。通过应用 De Morgan 定律,最后化简为等价的 a != 11 and b != 11,这个表达式可解读为“当 a 不是 11 分并且 b 也不是 11 分”,也许更容易理解一些。
上例为我们展示了一条编程经验:将实际应用中涉及的条件翻译成布尔表达式时,如果 很容易表达某种事件的终止条件,却较难表达该事件的继续条件,那么可以先将终止条件写 下来,然后对它用 not 加以否定,就得到了继续条件,最后再利用 De Morgan 定律简化这 个继续条件。