在逻辑中,AND 只有当两个部分都为真时才为真,OR 只要至少一个部分为真就为真。日常语言里,同样的词可能比较松散,所以一个句子必须先加上括号,才能变成条件。
这一课用到计算表达式里的运算符,以及比较表达式里的情形检查。它是布尔逻辑模块里最后一节讲解课。
日常语言在哪里容易误导人?
有三个常见的陷阱。
- 用“和”来列出几组人。“五岁以下的儿童和六十五岁以上的成人免费入场”列出了两组人。一个人不会同时属于两组,所以条件需要用 OR。
- “或”表示二选一。“你可以选茶或咖啡”通常排除两者都要。逻辑 OR 允许两者都要,而 XOR 排除。
- AND 和 OR 混在一起又没有括号。“门是开着的,并且系统没有布防,或者按下了紧急按钮”有两种读法。
怎样翻译句子
- 给每个简单陈述取一个字母。
- **标出句子里的运算词:**和、或、不。
- 问清楚什么被归为一组,然后写出括号。
- 找一个例子来测试,看不同读法会不会得出不同结果。
例题 1
规则:“五岁以下和六十五岁以上的访客免费入场。”
错误的翻译:IF (Age < 5) AND (Age > 65) THEN。测试 Age = 3:(3 < 5) 为真,(3 > 65) 为假,所以 真 AND 假 = 假。三岁的孩子会被拒绝。
正确的写法:IF (Age < 5) OR (Age > 65) THEN。测试 Age = 3:真 OR 假 = 真。测试 Age = 30:假 OR 假 = 假。测试 Age = 70:假 OR 真 = 真。
例题 2
规则:“如果门是开着的,并且系统没有布防,或者按下了紧急按钮,警报就会响。”
设 D = 门开着,S = 系统已布防,P = 按下紧急按钮。
- 读法 1:(D AND NOT S) OR P
- 读法 2:D AND (NOT S OR P)
测试 D = 0、S = 0、P = 1(门关着、系统关闭、按下了紧急按钮)。
读法 1:(0 AND 1) OR 1 = 0 OR 1 = 1。读法 2:0 AND (1 OR 1) = 0 AND 1 = 0。
两种读法得出不同的结果,所以这个句子有歧义。读法 1 在按下紧急按钮时总会响警报,这很可能是本意,但只有写规则的人才能确定。写程序时必须做出选择,括号就是记录这个选择的方式:
IF (Door = TRUE AND Armed = FALSE) OR Panic = TRUE THEN
OUTPUT "ALARM"
ENDIF
常见错误
错误想法:“规则里说了‘和’,所以我到处都用 AND。”
句子里的词并不总是条件所需要的运算符。要根据意思来决定,再用一个例子检验。好习惯是试一个明显应该通过的输入,再试一个明显应该不通过的输入。
自测
1. “访客如果持有门票并且持有通行证,或者是员工,就可以进入。”写出两种带括号的读法。
查看答案
设 T = 门票,P = 通行证,S = 员工。读法 1:(T AND P) OR S。读法 2:T AND (P OR S)。测试 T = 0、P = 0、S = 1:读法 1 得 1,读法 2 得 0,所以两者不同。
2. “不热且潮湿。”给出两种读法,以及一个让它们不同的例子。
查看答案
设 H = 热,U = 潮湿。读法 1:NOT (H AND U)。读法 2:(NOT H) AND U。测试 H = 1、U = 0:读法 1 得 NOT 0 = 1。读法 2 得 0 AND 0 = 0。两者不同。
3. 菜单上写着“汤或沙拉任选一样”。如果不能两样都要,哪一种门符合本意?
查看答案
XOR,因为它只有恰好选了一样时才为 1。OR 连两样都要也会接受。
接下来学什么?
用布尔逻辑练习结束本模块,它综合了五项技能。安全的 Python 推理沙盒可以让你安全地测试警报规则之类的条件。
把文字转成精确条件,是我们的老师在一对一线上计算机科学补习中一题一题带你练的技能。