跳轉到

1847 年:Boole 布林代數 — 把邏輯變成計算#

偵探:George Boole。案發地:愛爾蘭 Cork 女王學院。卷宗:《思想規律》(The Laws of Thought)。

案發現場#

-0350-Aristotle三段論.md 統治邏輯兩千年,但它只是分類學,不是計算法。數學家追問:邏輯能否像代數一樣算?

Boole 接到的報案來自兩處:一是萊布尼茲「推理演算」(calculus ratiocinator)的未竟遺願,二是當時英國代數學派(Peacock、De Morgan)把代數從數字解放為符號形式的運動。

如果「且」「或」「非」能變成 \(+\) 、 \(×\) 、 \(-\) 那樣的運算,推理就成了方程式求解。這正是 Boole 要破的案。

後續:1879-Frege概念文字.md 批評它不夠強,1900-Hilbert23問題.md 卻繼承了它的代數精神。

偵查過程(含數學式/表格/理論)#

第一條線索:類的外延代數#

Boole 把命題看成類(class)的等式。設 \(x\) 、 \(y\) 為類,則:

邏輯 Boole 寫法 現代讀法
\(x\) 且 \(y\) \(x y\) \(x ∧ y\)
\(x\) 或 \(y\) \(x + y\) \(x ∨ y\) (互斥並,後修正為包含或)
非 \(x\) \(1 - x\) \(¬x\)
全域 \(1\) 、空類 \(0\) \(1\) 、 \(0\) \(⊤\) 、 \(⊥\)

於是「所有 \(S\) 都是 \(P\) 」變成方程式 \(s (1 - p) = 0\) ,即 \(S\) 與非 \(P\) 之交為空。三段論 Barbara 變成代數消元。

第二條線索:冪等律 \(x^2 = x\)#

普通代數中只有 \(0\) 、 \(1\) 滿足 \(x^2 = x\) 。Boole 反其道而行:規定邏輯演算的基本律就是冪等律 \(x^2 = x\) :

\[ x^2 = x \]
\[ x + x = x \]
\[ x (1 - x) = 0 \]

前兩條說「 \(x\) 且 \(x\) 還是 \(x\) 」「 \(x\) 或 \(x\) 還是 \(x\) 」;第三條是矛盾律的代數臉孔。這把邏輯類與數域區分開來:邏輯是「只取 \(0\) 、 \(1\) 值的代數」。

真值表(Boole 時代尚未標準化,後人整理):

\(x\) \(y\) \(x ∧ y\) \(x ∨ y\) \(¬x\)
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

只要列出 \(2^n\) 行,真假無所遁形——這是第一個「判定程序」。

第三條線索:布林代數公理表#

現代抽象版本(Huntington 公理系之一):

公理 \(∧\) 版 \(∨\) 版
交換律 \(x ∧ y = y ∧ x\) \(x ∨ y = y ∨ x\)
結合律 \((x ∧ y) ∧ z = x ∧ (y ∧ z)\) \((x ∨ y) ∨ z = x ∨ (y ∨ z)\)
吸收律 \(x ∨ (x ∧ y) = x\) \(x ∧ (x ∨ y) = x\)
分配律 \(x ∧ (y ∨ z) = (x ∧ y) ∨ (x ∧ z)\) \(x ∨ (y ∧ z) = (x ∨ y) ∧ (x ∨ z)\)
同一律 \(x ∧ 1 = x\) \(x ∨ 0 = x\)
補餘律 \(x ∧ ¬x = 0\) \(x ∨ ¬x = 1\)

滿足此表者皆為布林代數:二值 \(\\{0,1\\}\) 、集合冪集、命題等價類、開關電路皆是同構犯——不同案發現場,同一作案手法。

結案報告#

Boole 結案:邏輯=二值代數。推理即解方程式,真值表即判決書。

遺產:

  1. 命題邏輯獲得計算基礎,直接通往 1929-Herbrand定理.md 與 SAT 求解。
  2. Shannon 1938 年把布林代數接到繼電器電路,今日 CPU 仍是 Boole 代數的肉身。
  3. 界限:仍無量詞,無法處理「對一切 \(x\) 」。Frege 在 1879-Frege概念文字.md 補上這一刀。

從 Hilbert(1900-Hilbert23問題.md)到 Russell(1910-PrincipiaMathematica.md),人人都站在 Boole 的肩膀上把邏輯寫成符號演算。

證據與工具#

關鍵公式:

\[ x (1 - x) = 0 \]
\[ x + (y z) = (x + y)(x + z) \]

Python 驗證冪等律與分配律(窮舉 \(0\) 、 \(1\) ):

for x in [0, 1]:
    assert (x & x) == x          # 冪等
    assert (x | (not x)) == 1    # 補餘
for x in [0, 1]:
    for y in [0, 1]:
        for z in [0, 1]:
            assert (x & (y | z)) == ((x & y) | (x & z))
print("Boole 公理在二值模型成立")

延伸閱讀:想看代數如何長出量詞,請到 1879-Frege概念文字.md;想看命題邏輯如何變成自動證明,請到 1929-Herbrand定理.md;而電路與證明的深層同一性,要等 1934-Gentzen自然演繹.md 的 Curry-Howard 伏筆。