1989 年 ACL2:工業級歸納的封山探案#
報案人:Robert Boyer、Matt Kaufmann、J Strother Moore(德州奧斯汀)。 涉案物:一門 Common Lisp 子集。戰績:AMD 與 Motorola 晶片驗證。
案發現場#
1980 年代末,Boyer-Moore 證明器(Nqthm)雖在學界封神, 卻有三個進不了工廠的毛病:
- 邏輯是自創的 Lisp 方言,與工業界用的程式語言脫節。
- 速度太慢,百萬門級的硬體模型跑不動。
- 與編譯器、測試工具鏈不相容,工程師不願重寫模型。
與此同時,AMD 的 K5 浮點除法、Motorola 的 DSP 晶片正為正確性焦頭爛額。 Intel 後來的 Pentium FDIV bug(1994)尚未爆發,但烏雲已在地平線。 工業界需要一台「說工程師語言、跑得動大模型」的證明器。
1989 年,Boyer、Kaufmann、Moore 交出 ACL2(A Computational Logic for Applicative Common Lisp)。 它賭上一切:邏輯即程式語言,證明器即 Lisp。
偵查過程#
線索一:Common Lisp 子集——可執行的邏輯#
ACL2 的絕招是「一語雙用」:同一個函數定義既是邏輯公理, 也是可在 Common Lisp 上直接執行的程式。
(defun app (x y)
(if (endp x) y
(cons (car x) (app (cdr x) y))))
(defthm app-assoc
(equal (app (app a b) c) (app a (app b c))))
\(defun\) 引進遞迴函數(需附終止證明,多用測度 \(measure\) 遞減), \(defthm\) 宣告定理,證明器自動嘗試證明,失敗則退回給人類補引理。
| ACL2 構造 | 邏輯角色 | 執行角色 |
|---|---|---|
| \(defun\) | 公理化遞迴函數 | 可編譯執行的 Lisp |
| \(defthm\) | 待證定理 | 通過即存為重寫規則 |
| \(encapsulate\) | 抽象介面+約束 | 模組化驗證 |
| \(measure\) | 終止性證據 | 保證邏輯一致 |
因為就是 Lisp,ACL2 模型可直接跑測試、跑模擬, 「測試+證明」在同一語義下無縫銜接,工程師零翻譯成本。
線索二:工業級歸納——瀑布的量產版#
ACL2 繼承 Nqthm 的瀑布模型並工業強化:重寫器更快、 歸納啟發式更準、內建算術決策過程(線性算術、BDD 式推理)。
證明 \(app\) 結合律時,系統自動:
- 化簡:展開 \(app\) 定義,消 \(if\) 與 \(car\) 、 \(cdr\) 。
- 泛化:把複雜子項抽象為變元 \(z\) ,強化猜想。
- 歸納:偵查 \(app\) 在首參數的遞迴模式,對 \(a\) 做 \(nil\) 與 \(cons\) 分案。
- 產生的基例 \(app(app(nil, b), c) = app(nil, app(b, c))\) 化簡為 \(app(b, c) = app(b, c)\) 。
- 歸納步用歸納假設重寫,證畢。
公式層面仍是結構歸納:
不同的是工程:龐大的引理庫、快速重寫、CLOS 級的執行速度, 讓它吞得下百萬項級的硬體模型。
線索三:AMD/Motorola——晶片廠的驗收單#
本案最硬的證據是兩張工業驗收單:
| 案件 | 驗證對象 | 結果 |
|---|---|---|
| Motorola CAP DSP(1990s) | 數位訊號處理器微碼 | 首個大規模機器驗證的商用晶片之一 |
| AMD K5/Athlon 浮點(1990s-2000s) | \(add\) 、 \(div\) 、 \(sqrt\) 微碼與 RTL | 抓出模擬沒抓到的角落 bug,後成標準流程 |
| Rockwell、Centaur 等 | 浮點單元、協定 | ACL2 進駐產線 |
以浮點除法為例,規格是 IEEE-754 的數學定義 \(q = round(a/b)\) , 實作是迭代微碼。ACL2 證明二者等價,覆蓋一切捨入模式與非規格數。 模擬只能抽樣,證明一次包辦 \(2^{64}\) 種輸入。
結案報告#
ACL2 於 1989 年前後問世,1990 年代打入工業界, 2005 年 Boyer、Kaufmann、Moore 同獲 ACM Software System Award。 它破了「定理證明能否進工廠」的案件,也為第三幕封山。
全幕結案陳詞:1972 年 Prolog 讓邏輯跑起來, 1973 年 Boyer-Moore 讓歸納自動化,1977 年 LCF 立下可信核心、 Pnueli 立下時序規格,1981 年模型檢測舉起窮舉大旗, 1986 年 HOL 與 Isabelle 分頭建城,1988 年 CoC 安上心臟, 1989 年 Coq 與 ACL2 分別以構造與工業之姿出世。 證明,從此工程化。
證據與工具#
- 終止公式: \(measure(m, x)\) 在每次遞迴嚴格遞減,保證 \(defun\) 邏輯一致。
- 歸納模式: \(P(nil)\) 與 \(P(x) \to P(cons(a, x))\) 得 \(\forall x \, P(x)\) ,歸納變元由 \(defun\) 的遞迴模式反推。
- 最小 ACL2 劇本:
(defun app (x y)
(if (endp x) y (cons (car x) (app (cdr x) y))))
(defthm app-assoc
(equal (app (app a b) c) (app a (app b c))))
;; :instructions 提示歸納變元 a,觀察瀑布各池輸出
- 實驗:在 ACL2(或線上 ACL2s)中輸入上例, 觀察證明器自動選的歸納模式,再故意刪去終止測度, 看系統如何拒絕不終止的 \(defun\) ,體會「可執行」與「一致」的綁定。
- 文獻:Kaufmann 等《Computer-Aided Reasoning: An Approach》, Hunt 等 AMD 浮點驗證報告,Young 等 Motorola CAP 驗證報告。