1934 年:Gentzen 自然演繹 — 證明的結構重建#
偵探:Gerhard Gentzen(Hilbert 弟子)。案發地:哥廷根。卷宗:自然演繹+矢列演算+切消定理。
案發現場#
1931-Godel不完備定理.md 炸毀了 Hilbert(1900-Hilbert23問題.md)的一致性美夢,1910-PrincipiaMathematica.md 與 1879-Frege概念文字.md 的希爾伯特式公理證明又冗長到反人類:連 \(A ∧ B ⊢ A\) 都要繞經三公理。
Gentzen 接到的報案是雙重的:能否讓證明像自然推理一樣書寫?能否讓證明有可分析的結構,從而挽回一致性證明?
他的回答是自然演繹(Natural Deduction)與矢列演算(Sequent Calculus)LK/LJ,外加皇冠上的切消定理(Hauptsatz)。
偵查過程(含數學式/表格/理論)#
第一條線索:引入/消去規則表#
自然演繹每式為 \(Γ ⊢ A\) ,每個連結詞各有一對引入(I)消去(E)規則:
| 連結詞 | 引入 | 消去 |
|---|---|---|
| \(∧\) | 由 \(A\) 、 \(B\) 得 \(A ∧ B\) | 由 \(A ∧ B\) 得 \(A\) (或 \(B\) ) |
| \(∨\) | 由 \(A\) 得 \(A ∨ B\) | 由 \(A ∨ B\) 、 \(A ⊢ C\) 、 \(B ⊢ C\) 得 \(C\) |
| \(→\) | 由假設 \(A\) 證 \(B\) 得 \(A → B\) | Modus Ponens: \(A\) 、 \(A → B\) 得 \(B\) |
| \(¬\) | 由假設 \(A\) 證 \(⊥\) 得 \(¬A\) | 由 \(A\) 、 \(¬A\) 得 \(⊥\) |
| \(∀\) | 由 \(A(a)\) ( \(a\) 新鮮)得 \(∀x A(x)\) | 由 \(∀x A(x)\) 得 \(A(t)\) |
| \(∃\) | 由 \(A(t)\) 得 \(∃x A(x)\) | 由 \(∃x A(x)\) 、 \(A(a) ⊢ C\) 得 \(C\) |
示例:證 \(A ∧ B ⊢ B ∧ A\) 只需兩次 \(∧\) 消去加一次 \(∧\) 引入,三步收工——希爾伯特式要十數步。
第二條線索:矢列演算 LK/LJ#
矢列形如 \(Γ ⇒ Δ\) ,讀作「 \(Γ\) 合取蘊涵 \(Δ\) 析取」。結構規則+邏輯規則分離:
| 規則類 | 內容 |
|---|---|
| 公理 | \(A ⇒ A\) |
| 結構 | 弱化、收縮、交換(管理假設的增刪重排) |
| 切(Cut) | 由 \(Γ ⇒ A\) 、 \(A ⇒ Δ\) 得 \(Γ ⇒ Δ\) ,即引理使用 |
| 邏輯左右 | 每個連結詞左右各一規則,如 \(→R\) 、 \(→L\) |
古典 LK 右側可多公式,直覺 LJ 右側至多一公式——一字之差劃開古典與構造性世界,後世證明助手的理論分水嶺。
第三條線索:切消定理與正規化#
Hauptsatz:一切切皆可消去。任何用引理(切)的證明都可展開為無切的直接證明:
推論有三:子公式性質(證明只含結論的子公式)、一致性(空矢列 \(⇒\) 證不出,故系統一致)、插值定理。
自然演繹側對應正規化:消去「引入緊接消去」的繞路(detour),如 \(→I\) 後接 \(→E\) 即 \(β\) 化簡。Gentzen 藉此(加超限歸納到 \(ε_0\) )證明了算術一致性——對 1931-Godel不完備定理.md 的部分救贖:有窮不行,超限可以。
結案報告#
Gentzen 結案:證明有了結構理論。推理不再是公理的盲目堆疊,而是引入/消去的對稱舞蹈,切消即計算。
遺產:
- Curry-Howard 對應:自然演繹證明=λ 項,正規化=求值,直通 Coq/Lean。
- LJ 是直覺邏輯與型別論的祖師,LK 是 SAT/SMT 與歸結的對偶鏡像(見 1929-Herbrand定理.md)。
- 證明搜尋從「猜公理實例」變成「由下而上拆解矢列」——現代自動證明與證明助手的 tactics 皆源於此。
第一幕在此落幕:從 -0350-Aristotle三段論.md 的分類,到 1847-Boole布林代數.md 的計算、1879-Frege概念文字.md 的語言、1900-Hilbert23問題.md 的夢想、1910-PrincipiaMathematica.md 的 attempt、1929-Herbrand定理.md 的機械化、1931-Godel不完備定理.md 的極限,終於在 Gentzen 手中長出可計算、可分析的證明結構。
證據與工具#
核心矢列:
最小 Python 演示正規化即求值( \(→I/E\) 對應 \(λ\) /apply):
# (λx. x + 1)(41) -> 42:引入緊接消去 = 繞路,化簡即計算
term = (lambda x: x + 1)(41)
assert term == 42
print("detour eliminated:", term)
延伸閱讀:公理系統的笨拙對照 1879-Frege概念文字.md;機械化前傳 1929-Herbrand定理.md;夢碎與救贖 1900-Hilbert23問題.md、1931-Godel不完備定理.md;一切的起點 -0350-Aristotle三段論.md。