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\) 且 \(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 結案:邏輯=二值代數。推理即解方程式,真值表即判決書。
遺產:
- 命題邏輯獲得計算基礎,直接通往 1929-Herbrand定理.md 與 SAT 求解。
- Shannon 1938 年把布林代數接到繼電器電路,今日 CPU 仍是 Boole 代數的肉身。
- 界限:仍無量詞,無法處理「對一切 \(x\) 」。Frege 在 1879-Frege概念文字.md 補上這一刀。
從 Hilbert(1900-Hilbert23問題.md)到 Russell(1910-PrincipiaMathematica.md),人人都站在 Boole 的肩膀上把邏輯寫成符號演算。
證據與工具#
關鍵公式:
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 伏筆。