跳到主要内容

若 A 则 B — 最容易读错的那一个,以及反过来说靠不靠得住

这一章讲三件事: 「若 A 则 B」为什么在前提不成立时反而算真; 「反过来说」有两种,一种靠不住、另一种永远靠得住; 以及取反一个 && 条件时,那条唯一不会出错的改法。

它在全书链条里的位置: 第 03 章把五个连接词钉死了,但都是「平的」—— 这一章开始出现方向:一件事推出另一件事。 而「推出」这个方向能不能倒过来走,是这一章的核心, 也是第 07、15、16、17 章反复要用的东西。 需要的基础: 第 02 章的命题与真假、第 03 章的真值表与文氏图。

1. 先看现象:一位 8 岁的乘客,和一句听起来废话的判断

原书自己给这一节挂了免责声明:蕴涵这个运算,不熟悉的话是非常难以理解的1。 这是全书少见的一次「作者提前认输」,所以我们放慢走。

先看一句没有争议的话。设两个命题2:

  • A =「这位乘客的年龄为 10 岁以上」
  • B =「这位乘客的年龄为 6 岁以上」

这时「若 A 则 B」是成立的:一个人只要满了 10 岁,他当然也满了 6 岁。

全章的主走查:一位 8 岁的乘客
─────────────────────────────────────────────────────
A =「年龄 10 岁以上」→ 假(他 8 岁)
B =「年龄 6 岁以上」 → 真
─────────────────────────────────────────────────────
A ⇒ B 若 A 则 B → 真 ← §2:前提为假时恒真
B ⇒ A 反过来说 → 假 ← §4:他就是那个反例
(¬B) ⇒ (¬A) 两头取反再对调 → 真 ← §5:和原句同真同假
(¬A) ∨ B 换个写法 → 真 ← §6:和 A ⇒ B 是同一件事
¬(A ∧ B) 不是「A 并且 B」 → 真 ┐ §7:德摩根定律
(¬A) ∨ (¬B) 不是 A,或者不是 B → 真 ┘ 两边一样
─────────────────────────────────────────────────────

图说:一个 8 岁的人,六个式子。他的特别之处在于「A 假、B 真」——
这一行正是所有直觉出错的地方。

2. 那条反直觉的规定:前提为假时,整句算真

这一节回答:「若 A 则 B」的表长什么样,以及为什么第三、四行那么怪。

「若 A 则 B」叫作蕴涵,写成 A ⇒ B3。原书提醒说,这个真值表看着简单、 却最容易出错,要仔细读4:

ABA ⇒ B
前提成立,结论也成立 → 这句话没毛病
前提成立,结论却不成立 → 这句话被推翻了
← 怪在这里
← 也怪在这里

第二行很好懂: 前提为真而结论为假,「若 A 则 B」就不成立5只有这一行是假的,其余三行都是真。

后两行才是要命的地方:只要前提 A 为假,不管 B 是真是假,整句一律算真6这就是逻辑上「如果」的定义——不是习惯,是定义。

走查第一步: 我们那位 8 岁乘客,A 为假、B 为真,落在第三行, 所以「若他 10 岁以上,则他 6 岁以上」这句话对他而言为真注意,他根本不满 10 岁,可这句话照样成立。

为什么日常语感会反对? 因为日常说「若 A 则 B」时,我们常常悄悄多要一层: A 不成立的时候,B 也别成立。 原书把这两种意思分得很清楚7:

你心里想的逻辑里的写法
A 真则 B 真;A 假则 B 假这是 A = B(第 03 章那个「相等」)
A 真则 B 真;A 假的时候 B 随便这才是 A ⇒ B

3. 为什么必须这么定:那张陷阱图

这一节回答:上一节那条规定不只是「规定」,它有一个能想明白的形状。

原书给了一个我们认为是全书最好的比方8。把文氏图看成从上往下拍的俯视图:

┌──────────────────────────────────────┐
│▓▓▓▓▓▓▓▓▓▓▓ 混凝土(安全)▓▓▓▓▓▓▓▓▓▓▓▓│
│ ╭─────────╮ │
│ │ A 的地盘│ │
│ │ ┌──────┼────────╮ │
│ │ │ │▓▓ B ▓▓ │ │
│ │空│ │▓▓▓▓▓▓▓ │ │
│ │洞│ │▓▓▓▓▓▓▓ │ │
│ ╰──┼──────╯ │ │
│ ╰───────────────╯ │
└──────────────────────────────────────┘

图说:阴影是浇好的混凝土,站上去没事;白的那块是张着口的陷阱。
陷阱只有一处:在 A 里面、却不在 B 里面。
想不掉下去,只有两条路 —— 别踏进 A,或者待在 B 里。

这张图和上一节那张表逐行对得上: 只有「A 真、B 假」那一格是空的(陷阱), 其余三格都是混凝土(为真)。

于是那句怪话变得能理解了:「如果你站在 A 里面,那你一定站在 B 里面」—— 因为只要在 A 里而不在 B 里,你就已经掉下去了9没踏进 A 的人,当然没掉下去,所以对他而言这句话成立。

4. 反过来说,靠不住:8 岁那位就是反例

这一节回答:「若 A 则 B」成立,「若 B 则 A」跟着成立吗。

把箭头掉个头,写成 B ⇒ A,这叫 A ⇒ B 的逆命题10

代进我们那位 8 岁的乘客: B 为真(他满 6 岁),A 为假(他不满 10 岁)。 对照上一节那张表的第二行——前提真、结论假,所以 B ⇒ A 为假。这是走查第二步。

一个 8 岁的人就把「反过来说」整个推翻了。 所以有那句常听见的话:逆命题不一定为真11。 画成文氏图也一眼看得出:B ⇒ A 的阴影和 A ⇒ B 的阴影根本不一样12

这条在写代码时的对应: 「传进去的值不合法 ⇒ 函数返回 -1」成立, 不等于「函数返回 -1 ⇒ 传进去的值不合法」——它也可能是别的原因返回的 -1。 拿返回值倒推原因,是这类错误最常见的样子。

(这条判断在第 07 章还会以另一种形式出现: 一套判定能证明「铺不满」,却不能反过来保证「铺得满」。)

5. 但有一种反过来,永远靠得住

这一节回答:既然逆命题靠不住,有没有一种倒过来说是安全的。

有。把两头都取反,再对调,得到 (¬B) ⇒ (¬A),这叫逆否命题13

代进 8 岁那位: ¬B =「不满 6 岁」为假,¬A =「不满 10 岁」为真。 前提为假 → 整句为真。这是走查第三步,结果和 A ⇒ B 一样是真。

这不是巧合。 原书的结论是:原命题为真,它的逆否命题也为真; 原命题为假,逆否命题也为假14——它们的文氏图完全一样。

这条极其有用,因为它给了你一条换个方向证明的路: 想证「若下雨则地湿」,可以改证「若地不湿则没下雨」。两句是同一句话。 (第 15 章的反证法和这条是近亲,但不是同一件事——那里假设的是结论的否定。)

6. 「若 A 则 B」其实不用新符号

这一节回答:蕴涵是不是一种必须单独记的新运算。

不是。A ⇒ B 等于 (¬A) ∨ B——「不是 A,或者是 B」15

代进 8 岁那位: ¬A 为真(他确实不满 10 岁),B 为真(他满 6 岁), 「真或者真」还是真。走查第四步,和 §2 的结果一致。

用陷阱图来读这句话,它就顺了16:

  • 不踏进 A,绝不会掉下去——因为陷阱只在 A 里面;
  • 或者待在 B 里面,也绝不会掉下去——因为 B 里面没有陷阱。

只要「不踏进 A」和「待在 B 里」至少满足一个,你就是安全的。 这正好就是那句「如果你站在 A 中,那你一定站在 B 中」。

7. 德摩根定律:取反一个 &&,该怎么改

这一节是这一章最实用的部分。

先看问题:A ∧ B 的否定怎么写?很多人会顺手写成 (¬A) ∧ (¬B),这是错的。

正确的改法是把「并且」换成「或者」:

¬(A ∧ B) = (¬A) ∨ (¬B) 不是「A 并且 B」= 不是 A,或者不是 B
¬(A ∨ B) = (¬A) ∧ (¬B) 不是「A 或者 B」= 不是 A,并且不是 B

图说:取反的时候,∧ 和 ∨ 会互换。这两条合起来叫德摩根定律。

这就是德摩根定律17。用文字念出来会觉得绕:「非 A 或者非 B」和 「非『A 与 B』」是等价的18——但它可以逐行核对,也可以看文氏图,一验就准19

代进 8 岁那位(走查第五步):

式子代入 A 假、B 真结果
A ∧ B假 ∧ 真
¬(A ∧ B)不是假
(¬A) ∨ (¬B)真 ∨ 假 ← 两边一致
(¬A) ∧ (¬B)真 ∧ 假假 ← 如果照错的改法写,结果反了

最后一行就是代价:错的改法在这位乘客身上直接给出相反的答案。

这条定律在代码里的样子,原书给了一个几乎可以照抄的例子20:

if (!(x >= 0 && y >= 0)) { // 「不是(x 非负 并且 y 非负)」

}
↓ 用德摩根定律改写
if (x < 0 || y < 0) { // 「x 是负的 或者 y 是负的」

}

为什么值得改? 因为下面那一行是人脑读得动的,上面那一行要在脑子里绕两圈。 而绕圈的地方就是出 bug 的地方。

记法上还有个小捷径,原书管它叫对偶性: 在一个式子里把 真和假对调、A 和 ¬A 对调、∧ 和 ∨ 对调,得到的就是原式的否定21记住「三样东西一起翻」,德摩根定律就不用背了。

8. 顺带算一笔账:两个命题一共能组合出几种运算

这一节回答:我们学了六个符号,还有没有漏掉的。

有,而且能数清楚。 两个命题的真假组合一共 4 种(第 03 章那四行), 每种组合的运算结果可以是真或假两种,所以运算的种类一共是 2 × 2 × 2 × 2 = 16 种22

我们已经见过的六个(¬、∧、∨、⊕、=、⇒)只是其中一部分, 剩下的还有「恒为真」「恒为假」这类看着没用、其实在化简时会冒出来的。

原书还留了一个漂亮的小发现: 把那张 16 列的大表里的假写成 0、真写成 1, 从下往上读每一列,正好是 0 到 15 的二进制23。 比如「恒为假」那一列是 0000,「A ∨ B」那一列是 0111(也就是 7)。 用二进制来编号,就能保证这 16 种不漏不重——第 02 章那两条底线,又用上了一次。

9. 作者的判断、我们的判断,以及这一章的边界

说法书里给了什么
蕴涵在前提为假时恒真给了定义(真值表)+ 一个能想明白的形状(陷阱图)
逆命题不一定为真给了证明:两张文氏图不一样
逆否命题与原命题同真同假给了证明:两张文氏图一样
蕴涵这个运算「基本上不用做运算」是作者的说法,原文说它与「或」「与」不同,基本不参与计算
16 种运算的编号规律给了观察,让读者自己发现,没有证明

判断(我们的,不是书里的):这一章最该记住的不是符号,是「哪种反过来说安全」。 蕴涵的符号 在写代码时基本用不上, 但「A 推出 B,能不能倒过来用」这个判断,在查故障、看报警信息时天天要做。 一条规律是:倒过来(逆命题)不安全,两头取反再倒过来(逆否命题)永远安全。 如果错,会错在: 如果一个人处理的是「A 和 B 本来就等价」的场合 (比如一一对应的编码和解码),那逆命题当然成立,这条谨慎就是多余的。 判据是:那两件事之间是不是真的一一对应。

这一章的边界:

  • 原书对蕴涵为什么这么定,只给了「陷阱」这个比方,没有从形式系统的角度解释, 也没有提「实质蕴涵」在哲学上的长期争议;
  • 16 种运算只列了表,没有逐个命名(其中几个在电路设计里有专门的名字);
  • 对偶性只给了记法,没有证明;
  • 德摩根定律在三值逻辑里还成不成立,这一章没答——第 05 章第 8 节答。

10. 可带走的

  1. 「若 A 则 B」叫蕴涵,写成 A ⇒ B;四行里只有一行是假的(A 真而 B 假);
  2. 前提为假时,整句一律为真——这是定义,不是笔误;
  3. 陷阱图是理解它的钥匙:陷阱只在「A 里面而不在 B 里面」那一块;
  4. 逆命题(B ⇒ A)不一定为真——8 岁那位乘客就是反例;
  5. 逆否命题((¬B) ⇒ (¬A))永远和原命题同真同假,想换个方向证明就用它;
  6. A ⇒ B 等于 (¬A) ∨ B,不需要新符号;
  7. 德摩根定律:取反的时候「并且」和「或者」互换, !(x >= 0 && y >= 0) 应该改成 x < 0 || y < 0;
  8. 对偶性是它的记法:真假对调、A 与 ¬A 对调、∧ 与 ∨ 对调,三样一起翻;
  9. 两个命题一共只能组合出 16 种运算,而且可以用 0 到 15 的二进制给它们编号。

11. 原文地图

主题原书章原文位置
蕴涵难懂的预告、两个命题的例子第2章 逻辑text/07-ch02.txt:613(搜「如果不熟悉它的话是非常难以理解」) · :617(搜「乘客的年龄为 10 岁以上」)
蕴涵的真值表第2章 逻辑text/07-ch02.txt:621(搜「称为蕴涵」) · :643(搜「只有 A 为 true 并且 B 为 false 的时候」) · :646(搜「注意真值表的最后两行」)
日常「若 A 则 B」的两种意思第2章 逻辑text/07-ch02.txt:650(搜「我们平时说」) · :655(搜「在逻辑上这两者是有区别的」)
陷阱逻辑第2章 逻辑text/07-ch02.txt:673(搜「混凝土浇灌而成」) · :675(搜「如果你站在 A 里面」)
A ⇒ B 等于 (¬A) ∨ B第2章 逻辑text/07-ch02.txt:695(搜「等于 (¬A) ∨ B」) · :699(搜「若不踏入 A」)
逆命题与逆否命题第2章 逻辑text/07-ch02.txt:718(搜「称作 A ⇒ B 的」) · :719(搜「逆命题不一定为真」) · :740(搜「那么它的逆否命题也为真」)
16 种运算第2章 逻辑text/07-ch02.txt:763(搜「算种类有」) · :786(搜「即为数 0, 1, 2」)
德摩根定律与对偶性第2章 逻辑text/07-ch02.txt:799(搜「这称为德摩根定」) · :806(搜「和非「A 与 B」是等价的」) · :838(搜「这称作逻辑表达式的对偶性」)
用德摩根定律改写 if第2章 逻辑text/07-ch02.txt:1227(搜「可将 if 语句如下变形」) · :1229(搜「x >= 0 && y >= 0」)

Footnotes

  1. 出处:「第2章 逻辑——真与假的二元世界」第 613 段(text/07-ch02.txt:613,搜「如果不熟悉它的话是非常难以理解」)。原文的原话是:对于这个蕴涵的运算,如果不熟悉它的话是非常难以理解的,请读到这里的朋友们注意一下。

  2. 出处:「第2章 逻辑——真与假的二元世界」第 617 段(text/07-ch02.txt:617,搜「乘客的年龄为 10 岁以上」)。原文用的正是这一对命题,理由是「如果乘客的年龄为 10 岁以上,那么该乘客的年龄当然在 6 岁以上」。

  3. 出处:「第2章 逻辑——真与假的二元世界」第 621 段(text/07-ch02.txt:621,搜「称为蕴涵」)。原文说这个运算「基本上不用做运算」,但由 A 和 B 构成的「若 A 则 B」是可以判定真假的命题。

  4. 出处:「第2章 逻辑——真与假的二元世界」第 628 段(text/07-ch02.txt:628,搜「看上去简单」)。原文的原话是:A ⇒ B 看上去简单,却容易出错,请仔细阅读真值表。

  5. 出处:「第2章 逻辑——真与假的二元世界」第 643 段(text/07-ch02.txt:643,搜「只有 A 为 true 并且 B 为 false 的时候」)。原文说这一行「在直觉上也是可以理解的」。

  6. 出处:「第2章 逻辑——真与假的二元世界」第 646 段(text/07-ch02.txt:646,搜「注意真值表的最后两行」)与第 649 段(text/07-ch02.txt:649,搜「这就是逻辑上的」)。原文强调这两行「必须非常仔细地解读」。

  7. 出处:「第2章 逻辑——真与假的二元世界」第 650 段(text/07-ch02.txt:650,搜「我们平时说」)与第 655 段(text/07-ch02.txt:655,搜「在逻辑上这两者是有区别的」)。原文明确写出:(1) 是 A = B,(2) 是 A ⇒ B。

  8. 出处:「第2章 逻辑——真与假的二元世界」第 673 段(text/07-ch02.txt:673,搜「混凝土浇灌而成」)。原书把这一小节直接命名为「陷阱逻辑」,并说明这是从上空往地面方向的俯视图。

  9. 出处:「第2章 逻辑——真与假的二元世界」第 675 段(text/07-ch02.txt:675,搜「如果你站在 A 里面」)。原文的原话是:图 2-21 是为了将人置于「若在 A 中,则必须在 B 中」的状况而挖掘的陷阱。

  10. 出处:「第2章 逻辑——真与假的二元世界」第 718 段(text/07-ch02.txt:718,搜「称作 A ⇒ B 的」)。原书是让读者先画出 B ⇒ A 的文氏图,再对比。

  11. 出处:「第2章 逻辑——真与假的二元世界」第 719 段(text/07-ch02.txt:719,搜「逆命题不一定为真」)。

  12. 出处:「第2章 逻辑——真与假的二元世界」第 717 段(text/07-ch02.txt:717,搜「和表示逻辑表达式 A ⇒ B 的文氏图不同」)。原书用的正是「两张图不一样」这一条作为证据。

  13. 出处:「第2章 逻辑——真与假的二元世界」第 736 段(text/07-ch02.txt:736,搜「我们将」)与第 740 段(text/07-ch02.txt:740,搜「那么它的逆否命题也为真」)。原书的推导是:A ⇒ B 就是 (¬A) ∨ B,所以 (¬B) ⇒ (¬A) 就是 ¬(¬B) ∨ (¬A),画出来和 A ⇒ B 一样。

  14. 出处:「第2章 逻辑——真与假的二元世界」第 740 段(text/07-ch02.txt:740,搜「那么它的逆否命题也为真」)。原文两个方向都写了:原命题为真则逆否命题为真,原命题为假则逆否命题为假。

  15. 出处:「第2章 逻辑——真与假的二元世界」第 695 段(text/07-ch02.txt:695,搜「等于 (¬A) ∨ B」)。原书是通过让读者画 (¬A) ∨ B 的文氏图、发现它和 A ⇒ B 的图相同得出这一条的。

  16. 出处:「第2章 逻辑——真与假的二元世界」第 699 段(text/07-ch02.txt:699,搜「若不踏入 A」)与第 703 段(text/07-ch02.txt:703,搜「就绝对不会落入陷阱」)。

  17. 出处:「第2章 逻辑——真与假的二元世界」第 799 段(text/07-ch02.txt:799,搜「这称为德摩根定」)。原书给的英文是 De Morgan's laws,两条等式并列给出。

  18. 出处:「第2章 逻辑——真与假的二元世界」第 806 段(text/07-ch02.txt:806,搜「和非「A 与 B」是等价的」)。原书自己也承认「以上文字表达虽然看起来晦涩难懂」。

  19. 出处:「第2章 逻辑——真与假的二元世界」第 809 段(text/07-ch02.txt:809,搜「不过我们通过画真值表和文氏图可以确认它的正」)。原书给了一张四行真值表,把四个式子并排列出来逐行比对。

  20. 出处:「第2章 逻辑——真与假的二元世界」第 1227 段(text/07-ch02.txt:1227,搜「可将 if 语句如下变形」)与第 1229 段(text/07-ch02.txt:1229,搜「x >= 0 && y >= 0」)。这段代码在原书里出现在讲三值逻辑的那一节(也就是我们的第 05 章),我们把它提到这里,因为它是德摩根定律最直接的用法。

  21. 出处:「第2章 逻辑——真与假的二元世界」第 831 段(text/07-ch02.txt:831,搜「就能简单地记住德摩根定律了」)与第 838 段(text/07-ch02.txt:838,搜「这称作逻辑表达式的对偶性」)。

  22. 出处:「第2章 逻辑——真与假的二元世界」第 763 段(text/07-ch02.txt:763,搜「算种类有」)。原文的算法是:4 种真假组合,每种的结果有 2 种可能,所以是 2 的 4 次方等于 16 种。

  23. 出处:「第2章 逻辑——真与假的二元世界」第 786 段(text/07-ch02.txt:786,搜「即为数 0, 1, 2」)。原文举了两个例子:最左列「恒为 false」从下往上是 0000,第 7 项「A ∨ B」从下往上是 0111。