3.1 Leonardo de Moura 與 Lean 的誕生#
本節目標#
- 認識 Leonardo de Moura 的技術履歷:從 Z3 SMT 求解器到 Lean 的設計脈絡
- 理解 2013 年 Lean 專案在微軟 Redmond 啟動時的設計目標
- 掌握 elaborator(Elab)在 Lean 架構中的核心角色
- 梳理 Lean 從微軟研究院到 AWS/CMU 的遷移史,以及 Sebastian Ullrich 的維護者角色
一位「求解器的人」決定自己寫一個證明助手#
要在理解 Lean 之前先理解它的作者。Leonardo Mendonça de Moura 是巴西裔計算機科學家,在自動化推理(automated reasoning)領域浸淫了二十多年。他最著名的成就是與 Nikolaj Bjørner 共同開發的 Z3——當今世界上最重要的 SMT(Satisfiability Modulo Theories)求解器。
de Moura 的職業軌跡大致如下:
| 時期 | 單位 | 關鍵工作 |
|---|---|---|
| 2001 年博士 | 巴西 UFRJ / 法國 INRIA | 高階邏輯與自動化推理 |
| 2000 年代 | 微軟研究院 Redmond | Z3 SMT 求解器 |
| 2013 年 | 微軟研究院 Redmond | 開始 Lean 專案 |
| 2017 年前後 | 微軟 → Amazon | Amazon Alexa / 自動化驗證 |
| 2020 年之後 | AWS / 卡內基美隆大學(CMU) | Lean 4 與正式化數學 |
Z3 的設計哲學深刻影響了 Lean。Z3 的核心信念是:強大的預設策略(他律,heuristic)配上高效率的 C++ 實作,才能讓自動化推理真正被工程界使用。Z3 被用在 Windows 驅動程式驗證、程式語言研究、密碼學協議分析等無數場合,也在 2015 年成為開源軟體獎(ACM SIGPLAN)的得主工具。
但 SMT 求解器處理的是一階邏輯的可滿足性問題——它找到答案,但不「證明」答案。de Moura 在多年與 Coq、Isabelle 使用者的合作中意識到一個缺口:互動式定理證明器(interactive theorem prover, ITP)的世界裡,缺少一個「既有真正的數學能力、又像 SMT 求解器一樣快」的系統。
為什麼不是 Coq?設計目標的三個決斷#
Lean 在 2013 年於微軟 Redmond 啟動時,de Moura 對既有的證明助手做了一番診斷:
flowchart LR
A[Coq] -->|偏 CS \n 數學庫零散| D[設計目標]
B[Isabelle/HOL] -->|簡單邏輯 \n 難表達依值型別| D
C[Mizar] -->|弱型別基礎 \n 難自動化| D
D --> E[1. 能寫真正的數學]
D --> F[2. 核心小而可信]
D --> G[3. 自動化要夠強]三個決斷值得逐一展開:
決斷一:擁抱依值型別論(而不是 HOL)。 Isabelle/HOL 建立在簡單型別論上,表達「對所有群 \(G\) ,存在恆等元素」這類量化「型別」的命題時要繞道集合論。Coq 與 Lean 都選了依值型別論(dependent type theory),讓命題與資料共用同一套語言。這是第 3.2 節的主題。
決斷二:數學優先於程式驗證。 Coq 的使用者社群以程式語言理論與形式驗證為主(CompCert 編譯器、Fiat Crypto 都是 Coq 的傑作),對「把實分析、代數幾何搬進電腦」這件事熱情有限。Lean 從設計第一天就以正經數學(serious mathematics)為第一目標——de Moura 說過,他想要一個能夠形式化同倫型別論、乃至菲爾茲獎級工作的系統。
決斷三:效能與自動化是公民權利,不是附加品。 Coq 的核心以 OCaml 寫成, tactic 引擎效率有限;Isabelle 的自動化(Sledgehammer)靠外部求解器。Lean 則把高效能當成核心需求:核心用 C++ 寫、elaborator 支援重寫策略、決策程序可以嵌入型別檢查器。這一點讓 Lean 後來成為 AI 訓練資料的寵兒。
Elaborator:Lean 架構的心臟#
Lean 的架構分三層,理解這三層是理解後續所有章節的前提:
flowchart TD
A[原始碼 .lean] --> B[Elaborator / Elab]
B -->|解析 notations \n 展開 macros \n 推斷隱式參數| C[Elaborated term \n 全顯式的依值型別論項]
C --> D[Kernel type checker \n 小而可信的檢查核心]
D -->|通過| E[Environment \n 環境累積所有定義與定理]
D -->|不通過| F[報錯]Elaborator 不是單純的語法糖展開器。它要做的事情包括:
- 符號與記法:使用者可以自訂 infix、prefix 記法,elaborator 要在解析階段處理
- 隱式參數推斷:
List α中的α通常不用寫,elaborator 用 unification 推出來 - type class 解析:
Add a、BEq a這些 instance 是在 elaboration 時搜尋到的 - tactic 執行:
by區塊裡的 tactic 就是一段 Lean 程式,在 elaboration 期執行、產生 proof term
一個簡單的例子:
theorem add_comm_alt (n m : Nat) : n + m = m + n := by
induction n with
| zero => simp [Nat.zero_add, Nat.add_zero]
| succ n ih => simp [Nat.succ_add, Nat.add_succ, ih]
這段程式碼在 by 之後的部分是** tactics**,它們被 elaborator 當作程式執行,最終產生一個純項(pure term)交給 kernel 檢查。這個「tactic 是 elaborator 裡跑的程式」的設計,是 Lean 4 元程式設計能力的基礎(見 3.4 節)。
從微軟到 AWS 與 CMU:一個系統的遷移史#
Lean 的治理結構經歷了三次轉移,這在開源基礎軟體裡相當少見:
- 2013–2016(微軟研究院):Lean 1 與 Lean 2 開發期。Lean 2 支援 Homotopy Type Theory(HoTT),但為了簡化核心,Lean 3 捨棄了內建 HoTT。
- 2017(Lean 3 釋出):與德國亚琛 /后来的 Karlsruhe 的 Sebastian Ullrich 合作,重寫了 elaborator。此時 Lean 仍主要由微軟資助,但社群(mathlib)已經開始獨立成長。
- 2017–2020(微軟 → Amazon):de Moura 離開微軟研究院加入 Amazon(先 Alexa、後 AWS),Lean 的開發轉由 de Moura 與 Ullrich 主導,成為真正的社群專案。Lean 4 幾乎全部的開發都在這段期間完成。
- 2020 之後(AWS / CMU):de Moura 在 AWS 持續以部分工時投入 Lean 開發(AWS 對形式化驗證有興趣),同時加入 CMU 擔任兼職教授。Lean 與 mathlib 的主要開發動能轉向開源社群。
Sebastian Ullrich 的角色在此必須特別強調。他是 Lean 3 與 Lean 4 elaborator 的共同設計者,Lean 4 的 macro / Elab 框架很大程度是他與 de Moura 共同的產物;他長期擔任主分支維護者,並在 Karlsruhe 理工學院(KIT)以 Lean 為博士論文主題。如果說 de Moura 是 Lean 的「靈魂」,Ullrich 就是把這個靈魂變成可維護軟體的人。Lean 4 的論文(2021 年出版的 Counting Immutable Beans)就是 Ullrich 寫的——講的正是 Lean 4 的記憶體管理如何靠引用計數達到接近手寫 C++ 的效能。
為什麼這段歷史重要#
理解 Lean 的誕生,能解釋它的幾個「氣質」:
- 快:因為 Z3 的基因,Lean 對效能有近乎偏執的要求,kernel 檢查一個 proof term 是毫秒級的
- 元程式設計友善:因為 elaborator 就是 Lean 程式,使用者可以「客製化自己的證明語言」
- 社群驅動:因為離開了微軟的羽翼,mathlib 變成一個獨立的、由數百位貢獻者推動的專案
- AI 友善:因為輕量、快、輸出是純文字的 proof term,Lean 成為 DeepMind 等團隊的首選(見 3.4 節結尾)
小結與練習#
本節重點:
- Leonardo de Moura 是 Z3 SMT 求解器的主要作者,2013 年在微軟 Redmond 開始 Lean 專案
- Lean 的三個設計目標:能寫真正的數學、核心小而可信、自動化夠強
- Elaborator 是 Lean 的心臟:負責記法、隱式參數、type class、tactic 執行
- Lean 的治理經歷微軟 → Amazon → AWS/CMU 的遷移,Sebastian Ullrich 是長期主分支維護者
練習:
- 查閱 Z3 的 GitHub 頁面,比較它與 Lean kernel 的程式碼規模(提示:Z3 大約 30 萬行 C++,Lean 4 kernel 只有數千行)
- 安裝 Lean 4(
elan),寫下你的第一個#eval "hello, lean",確認開發環境可用 - 閱讀 de Moura 與 Ullrich 的論文 The Lean Theorem Prover(2015)的前兩節,標出與本節對應的設計目標
- 思考題:如果 Lean 當初留在微軟內部、沒有獨立治理,你認為 mathlib 的發展會有何不同?