用解谜来理解与、或、非(AND、OR、NOT)

AND(与)、OR(或)、NOT(非)是计算机判断条件时用到的最基本的操作,叫作逻辑运算。孩子一开始学编程,马上就会以“如果 A 并且 B”“如果 A 或者 B”的形式遇到它们。
名字听起来很难,内容却和日常用语几乎一样。这篇文章用身边的例子说明这三种操作,再把它们变成在家就能玩的谜题。
真和假
逻辑运算处理的不是数,而是“对还是不对”。对的叫作“真”,不对的叫作“假”。英语是 true 和 false。
“今天在下雨”这句话,下雨天是真,晴天是假。“7比10大”永远是假。逻辑运算就是把这种真或假的答案组合起来,或者反过来的操作。
NOT(非):反过来
NOT 把真变成假,把假变成真。
如果“在下雨”是真,“没在下雨”就是假;如果“在下雨”是假,“没在下雨”就是真。中文里的“不”“没”,就相当于 NOT。
连续两次 NOT,就回到原来的样子。“不是没在下雨”,和“在下雨”是一个意思。这和数学里乘两次 −1 就回到原数有点像。
AND(与):两个都满足
AND 只有在两个条件都为真时才是真。中文里就是“并且”。
想一条规则:如果在下雨,并且很冷,就穿大衣出门。只有又下雨又冷的日子才穿大衣。下雨但暖和的日子,或者冷但晴天的日子,都不穿。
把这条规则的所有组合列成表。这样的表叫作“真值表”。
| 在下雨 | 很冷 | 穿大衣(AND) |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 假 |
| 假 | 假 | 假 |
四行里只有一行是真。可以说,AND 是让条件变严格的操作。
OR(或):只要有一个
OR 只要两个条件中有一个为真,就是真。中文里就是“或者”。
想一条规则:如果在下雨,或者风很大,就不骑车,改成走路。
| 在下雨 | 风很大 | 走路(OR) |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 真 |
| 假 | 真 | 真 |
| 假 | 假 | 假 |
这次四行里有三行是真。OR 是让条件变宽松的操作。
这里有一个孩子常常弄错的地方,就是第一行:又下雨、风又大的日子。逻辑上的 OR,两个都为真时也是真。可是日常说的“或者”,像“咖啡还是红茶”那样,常常是二选一的意思。我觉得最好明确说一次:逻辑上的 OR 是“其中一个,或者两个都”。只有一个为真时才为真的操作另有名字,叫 XOR(异或)。
用开关电路来想
用电池、小灯泡和开关组成的电路来想,AND 和 OR 的区别就看得见了。
把两个开关串在同一条路上(串联),只有两个开关都合上,灯泡才亮,这就是 AND。把两个开关分别放在两条路上(并联),合上其中任何一个,灯泡就亮,这就是 OR。把“开关合上”当作真,把“灯泡亮”当作真,结果和上面的真值表完全一样。
我认为这个比喻很值得用。因为在计算机内部,真正做逻辑运算的,正是非常小的电子开关的组合。这与其说是比喻,不如说几乎就是事实。
在家能玩的语言谜题
不需要任何工具,用语言就能做成谜题。
指着屋里的东西问:“哪些东西又红又圆?”这是 AND。苹果符合,红色的书或白色的球不符合。接着问:“哪些东西是红的或者圆的?”这是 OR,苹果、红色的书、白色的球都符合。
让孩子来出题也很有意思。请他“用 NOT 出一道题,让屋里只有一样东西符合”,就会出现“不是方的,而且在桌子上的东西”这样的题。把条件组合起来,把答案缩小到一个,这和编程时写条件用的是同一种思考方式。
熟练之后,还可以出难一点的题。“不是(又红又圆)的东西”和“不红或者不圆的东西”,指的是同样的东西吗?答案是一样的。这叫作德摩根定律。即使不知道名字,用屋里的东西验证一下,孩子也能体会到。
和编程的联系
很多学校使用的 Scratch 里,有“与”“或”“不成立”这几个积木,它们就是 AND、OR、NOT。把它们放进“如果……那么”积木里,就能做出这样的条件:如果按下空格键,并且碰到了地面,就跳起来。
条件不按预想运行时,我建议画一张真值表。写出四行,确认每种情况下希望发生什么,就能发现是不是把 AND 和 OR 弄反了,或者 NOT 放错了位置。日本小学编程教育的目标,写在日本小学的编程教育学什么里;解谜能培养的思考方式,写在什么是计算思维里。
Math Gates 的“逻辑电路”
Math Gates 是我做的一款回路解谜游戏。在盘面的空格里放上改变数值的“门”和让路线转90度的“镜子”,然后按“运行”,带着数字的比特就会沿直线前进。终点的出口只接收满足条件的值。
七个世界中的最后一个“逻辑电路”,讲的就是这篇文章的内容。比特经过 v>n、v<n 这样的比较门,数就会变成真或假。接着经过 NOT、AND、OR 逻辑门,最后以满足出口条件的值到达,就算成功。有的出口以“真”为条件。放下棋子的那一刻,比特的路线和数值的变化就会用虚线画在盘面上,所以在运行之前,就能用眼睛追踪真和假在哪里翻转。过关后,会得到一张发现卡,给你刚才做的事情配上名字和式子。
一共7个世界140道题,面向8岁以上。可以免费玩,过关之间会有广告,一次性购买可以去除广告。玩法写在 Math Gates 上手指南 里。
我认为,与、或、非并不是计算机专用的特别词语,而是给我们平时说的“并且”“或者”“不”,赋予了严格的形式。
