2021:Lean 4 VS Code 擴充與 Lake——新一代工具鏈#
事件#
2021 年,隨 Lean 4 問世,官方推出全新的 Lean 4 VS Code extension (vscode-lean4,取代 Lean 3 時代的 vscode-lean),並發佈 Lake(Lean Make,宣告式建構工具)取代 leanpkg + Makefile。
為何重要#
- Lean 4 VS Code extension:
- 基於 Lean 4 內建的 LSP server(本身是 Lean 程式)—— 編輯器與編譯器同一套程式碼,補足 Lean 3「extension 與編譯器 分別維護」的缺陷。
- InfoView 重寫:目標面板、假設區、診斷訊息互動摺疊; 游標移動即時顯示證明狀態。
- 逐行證明除錯:像除錯程式一樣逐步執行 tactic。
- Lake:
lakefile.lean用 Lean 語法本身寫建構腳本—— 補足leanpkg+ Make「兩套語法、跨平台問題多」的缺陷。 - Elan 持續演化:
lean-toolchain檔案成為專案標準, Lean 3/Lean 4 可並存切換。
理論與實用原因#
- 理論原因:LSP 的本質是「把編輯器能力與語言服務分離」—— 與 LCF 傳統「把證明檢查與 tactic 產生分離」同一哲學:介面與核心解耦。
- 實用原因:Lean 3 的 extension 要處理 C++/Haskell 兩種後端、 通訊協定自訂;Lean 4 把 LSP server 寫進語言本體,extension 變薄。 建構系統用 Makefile 在 Windows 上是噩夢——Lake 用 Lean 語法跨平台。
程式範例#
Lake 的 lakefile.lean——建構腳本就是 Lean 程式:
-- lakefile.lean:宣告式依賴與建構目標,語法就是 Lean
import Lake
open Lake DSL
package myproj
@[default_target]
lean_lib Myproj
@[default_target]
lean_exe runner where
root := `Main
require mathlib from git
"https://github.com/leanprover-community/mathlib" @ "master"
# Lake 常用指令(對照 Makefile/leanpkg 的複雜性)
lake build # 建構整個專案與依賴
lake env lean Main.lean # 在專案環境下檢查單檔
lake exe runner # 執行編譯後的可執行檔
VS Code extension 的 InfoView——逐行證明除錯:
theorem mult_comm (a b : Nat) : a * b = b * a := by
-- InfoView 顯示:⊢ a * b = b * a
induction a with
| zero =>
-- InfoView:⊢ 0 * b = b * 0
simp
| succ n ih =>
-- InfoView:⊢ (n+1) * b = b * (n+1)
-- ih : n * b = b * n
simp [Nat.succ_mul, ih]
Elan 與 lean-toolchain——版本並存:
# 專案根目錄的 lean-toolchain 檔案:一行指定版本
# leanprover/lean4:v4.15.0
elan toolchain install leanprover/lean4:v4.15.0
elan default leanprover/lean4:v4.15.0
對照:Lean 3 工具鏈的缺陷:
# Lean 3 時代:leanpkg + Makefile + 自訂通訊協定
leanpkg build # 底層叫 make,Windows 支援差
# extension 要分別處理 C++ (lean) 與 Haskell 後端的訊息格式
彌補了什麼缺陷#
彌補了 Lean 3 時代「extension 與編譯器分別維護、建構系統依賴 Makefile(跨平台差)、版本管理混亂」的缺陷——Lean 4 的 vscode-lean4 + Lake + Elan 形成與 Rust(rust-analyzer + Cargo + rustup)對等的一體化工具鏈。