11.1 形式化數學語言:如何用程式碼精確陳述黎曼猜想與費馬大定理#
前言:把人類最深奧的猜想寫給機器看#
一個常見誤解是「形式化就是把定理翻譯成程式」。實際上,陳述一個大猜想往往比證明它還要耗工:費馬大定理的陳述需要橢圓曲線、模形式、Galois 表示;黎曼猜想需要 zeta 函數在複平面的解析延拓。這些「前置工程」正是 10.3 節哲學差異的試金石,也是 2024 年 Lean 中 Fermat 形式化專案的真正難點。
一、基礎:命題、型別、證明#
定義(命題即型別):命題是一個型別為 Prop 的項;其證明是該型別的項。
-- 平凡但完整:一個形式化證明的解剖
example : ∀ n : Nat, n + 0 = n := fun n => Nat.add_zero n
Curry–Howard 對應表(延續 10.2):
| 數學陳述 | 型別論物件 |
|---|---|
| \(P \Rightarrow Q\) | 函數型別 \(P \to Q\) |
| \(\forall x, P(x)\) | 相依函數 \(\prod_{x} P(x)\) |
| \(\exists x, P(x)\) | 相依配對 \(\sum_{x} P(x)\) |
| \(P \land Q\) | \(P \times Q\) |
二、費馬大定理:陳述本身就是一座山#
2.1 經典陳述#
看似簡單——只需自然數。但 Wiles 的證明路徑完全不同:
2.2 Frey 曲線的定義:形式化的第一關#
給定互素三元組 \((a,b,c)\) ,Frey 曲線為
在 Lean 中需要先有橢圓曲線的定義。mathlib 中(簡化示意):
-- mathlib 中的橢圓曲線:Weierstrass 方程 + 非退化條件
structure WeierstrassCurve (R : Type*) [CommRing R] where
a₂ a₄ a₆ b₂ b₄ b₆ b₈ : R
-- 精確陳述 FLT(目標層級,示意)
theorem fermat_last (n : ℕ) (hn : 3 ≤ n)
(a b c : ℤ) (ha : a ≠ 0) (hb : b ≠ 0) (hc : c ≠ 0) :
a ^ n + b ^ n ≠ c ^ n := by
...
真正的工程量:2024 年啟動的 Fermat 專案把證明拆成數百個引理(Galois 上同調、模形式空間的維度計算、 \(R = T\) 定理……),以藍圖(blueprint,用 plausible/GitHub Pages 產生依賴圖)協調國際團隊分工。陳述層的依賴如下:
flowchart BT
A[ℕ 算術] --> B[ℤ 與理想理論]
B --> C[橢圓曲線 Weierstrass]
C --> D[模形式與 Hecke 代數]
D --> E[Galois 表示]
E --> F[Wiles R=T 定理]
F --> G[FLT 陳述]
G -.->|陳述只需 ℕ| A弔詭之處:陳述本身只要 ℕ 算術,證明路徑卻穿過代數幾何最深處——形式化的價值在於把兩者都變成可核對的資料。
三、黎曼猜想:解析延拓與無零點區域#
3.1 陳述#
Zeta 函數的解析延拓 \(\zeta(s) = \sum_{n\ge1} n^{-s}\) ( \(\mathrm{Re}(s) > 1\) )延拓到 \(\mathbb{C}\setminus\{1\}\) ,且非平凡零點都在臨界線 \(\mathrm{Re}(s) = 1/2\) 上。
形式化必須先處理: 1. 無窮級數的一致收斂與解析延拓(需複分析基礎設施); 2. 複數分析在型別論中的存在——mathlib 提供 Complex 與解析函數理論; 3. 「非平凡零點」這個集合的精確定義。
3.2 Lean 中的陳述(示意)#
open Complex
-- ζ(s) 在 Re(s) > 1 的級數定義
noncomputable def riemannZeta' (s : ℂ) : ℂ :=
∑' n : ℕ, ((n + 1 : ℕ) : ℂ) ^ (-s)
-- 黎曼猜想(目標陳述,示意;mathlib 尚無完整 ζ 延拓的 RH 等價形式)
def riemannHypothesis : Prop :=
∀ s : ℂ, riemannZeta' s = 0 →
s ≠ 1 → 0 < s.re → s.re < 1 → s.re = 1/2
難點剖析: - 解析延拓不能用「同一個式子」定義,需透過函數方程 \(\zeta(s) = 2^s\pi^{s-1}\sin(\pi s/2)\Gamma(1-s)\zeta(1-s)\) 在不同區域拼接; - mathlib 已形式化 \(\Gamma\) 函數與部分 ζ 理論(截至 2025 年,臨界帶的完整處理仍在建設中)。
3.3 陳述層的「等價鏈」#
數學家常說 RH 有數十個等價形式;形式化時可分開形式化再證等價:
| 等價形式 | 所需前置 |
|---|---|
| 經典(臨界線零點) | 複分析、解析延拓 |
| Robin 不等式 \(\sigma(n) < e^\gamma n \log\log n\) ( \(n>5040\) ) | 算術函數 σ、常數 \(\gamma\) |
| Lagarias 形式 \(\sigma(n) \le H_n + e^{H_n}\log H_n\) | 調和數 |
| Nyman–Beurling | 函數空間、積分 |
教訓:等價形式中,最「初等」的陳述往往最難形式化背後的等價證明——例如 Robin 形式的等價證明涉及大量解析數論。
四、範例:從 Python 到 Lean 的陳述轉換#
先用 Python 檢查(不是證明)Collatz 或 Robin 不等式,體會「數值證據 ≠ 形式證明」:
from math import isqrt
def sigma(n): # 除數和函數 σ(n)
s, i = 0, 1
while i * i <= n:
if n % i == 0:
s += i
if i != n // i:
s += n // i
i += 1
return s
# Robin 不等式:n > 5040 時 σ(n) < e^γ · n · log log n
import mpmath as mp
gamma = mp.euler
bad = [n for n in range(5041, 10**5) if sigma(n) >= mp.e**gamma * n * mp.log(mp.log(n))]
print("前 10 萬內的反例:", bad) # 空 → 佐證 RH,但不是證明
對應的 Lean 陳述(示意):
def σ (n : ℕ) : ℕ := (n.divisorsFinset.sum fun d => d)
def robinBound (n : ℕ) : ℝ :=
Real.exp 0.5772156649 * n * Real.log (Real.log n)
def robinInequality : Prop :=
∀ n : ℕ, 5040 < n → (σ n : ℝ) < robinBound n
五、形式化陳述的設計原則#
- 最小化依賴:陳述儘量用最基礎的物件(ℕ、ℤ),讓等價形式各自發展。
- 保留結構:不要把「橢圓曲線」內聯展開成座標條件——用結構化定義,否則引理無法複用。
- 區分定義與定理:
def是資料,theorem是型別為Prop的項;兩者的分離讓重構安全。 - 陳述可測試:以
example/#check驗證陳述非空、可例化,避免「vacuously true」陷阱(如定義寫錯使猜想變成 trivially true)。
小結與銜接#
- 形式化陳述大猜想 = 建構完整數學理論基礎設施的工程;FLT 的陳述在 ℕ,證明在 Galois 表示;RH 的陳述在複分析,等價形式散布在數論與函數分析。
- 陳述一旦形式化,等價轉換、數值佐證、AI 輔助證明都能建立在同一份資料上。
- 下一節(11.2)探討另一個基礎問題:構造性與古典邏輯之爭——這決定了「 \(\exists\) 」的證明是否攜帶演算法。
練習#
- 在 mathlib 中找出
Polynomial.eval與Nat.Prime的定義位置,解釋「素數」的形式化為何需要irreducible與not_unit兩個條件。 - 用 Python 驗證 \(n \le 10^6\) 的 Robin 不等式,並解釋為何這不能替代形式證明。
- 假設要在 Lean 中陳述 Goldbach 猜想,寫出你的版本,並說明你選擇「偶數」定義的理由(
Even型別還是謂詞2 ∣ n)。