跳轉到

附錄 A:從數學符號到程式碼語法對照表#

程式設計與數學的關鍵之一,在於兩者使用「不同的表層語法」表達「相同的深層結構」。本附錄提供一份對照字典,幫助讀者在閱讀論文與撰寫程式之間自由切換。

A.1.1 邏輯符號#

數學符號 讀法 Haskell / Lean 語法 備註
\(\top\) 真 True / True 空命題的證明只有一個
\(\bot\) 假 False / False 在 Curry–Howard 下對應 Void 型別
\(P \land Q\) 且 (P, Q) 積型別,證明是「一對證明」
\(P \lor Q\) 或 Either P Q 和型別,證明是「二選一的證明」
\(P \Rightarrow Q\) 蘊含 P -> Q 函數型別即蘊含
\(\neg P\) 非 P -> Void 定義為蘊含矛盾
\(\forall x \in A\) 全稱量化 forall x, P x 多型函數
\(\exists x \in A\) 存在量化 Σ x, P x 依賴積型別
\(P \leftrightarrow Q\) 若且唯若 (P -> Q, Q -> P) 兩方向的蘊含

A.1.2 集合與型別建構#

數學 說明 Haskell Lean
\(\{0,1,\dots\}\) 自然數 data Nat = Z \| S Nat inductive Nat
\(A \times B\) 卡氏積 (a, b) Prod A B
\(A + B\) 不相交聯集 Either a b Sum A B
\(A^B\) 函數空間 b -> a B -> A
\(A \cong B\) 同構 newtype + 兩向轉換 Equiv / Iso

A.1.3 常用恆等式與其程式對應#

\[ (A \times B) \times C \cong A \times (B \times C) \]

→ tuple 嵌套順序無關緊要(結合律)。

\[ A^{B \times C} \cong (A^B)^C \]

→ 柯里化:curry :: ((a, b) -> c) -> a -> b -> c

\[ (A + B) \times C \cong A \times C + B \times C \]

→ case 表達式(分配律):對和型別分支處理。

A.1.4 λ 演算與程式碼#

數學 Haskell Python
\(\lambda x. x\) \x -> x lambda x: x
\((\lambda x. t)\ u\) (\x -> t) u (lambda x: t)(u)
\(\text{let}\ x = u\ \text{in}\ t\) let x = u in t x = u(再使用)
\(\mu f. f\) (遞迴) fix f = f (fix f) 需明確命名

A.1.5 量詞與依賴型別#

在依賴型別語言中,命題本身就是型別:

-- ∀ n : Nat, n + 0 = n
example (n : Nat) : n + 0 = n := by simp

-- ∃ n : Nat, n * n = 25
example : ∃ n : Nat, n * n = 25 := ⟨5, by rfl⟩

小結#

掌握這張對照表,讀者即可在「讀數學論文」與「寫型別化程式」之間雙向翻譯——這正是本書強調的:兩者是同一套數學結構的兩種表層語法。