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 定律简化这 个继续条件。