冒號將編程範式分為兩大陣營:
宣告式再分函數式(代數表達式變換)與邏輯式(邏輯推理)。
// C:命令式迭代
int factorial(int n) {
int f = 1;
for (; n > 0; --n) f *= n;
return f;
}
// Lisp:函數式遞歸定義
(defun factorial(n)
(if (= n 0) 1
(* n (factorial (- n 1)))))
// Prolog:邏輯式斷言
factorial(0,1).
factorial(N,F) :- M is N-1, factorial(M,Fm), F is N*Fm.
句號一語中的:「C 給出演算法,Lisp 描述遞歸定義,Prolog 陳述斷言。」
| 命令式變數 | 宣告式變數 |
|---|---|
| 記憶體位址抽象 | 代數符號抽象 |
| 儲存內容可變 | 約束條件下的允許值 |
| = 表賦值 | = 表約束/等式 |
| i = i + 1 合法 | i = i + 1 不合法(除非反證法) |
宣告式無賦值、無副作用、無記憶體管理煩惱,大幅減少 Bug 來源。
| 範式 | 程式視為 | 輸入 | 輸出 | 設計 | 執行 |
|---|---|---|---|---|---|
| 命令式 | 自動機 | 初始狀態 | 最終狀態 | 設計指令 | 指令執行 |
| 函數式 | 數學函數 | 自變量 | 因變量 | 設計函數 | 表達式變換 |
| 邏輯式 | 邏輯證明 | 題設 | 結論 | 設計命題 | 邏輯推理 |
冒號寬慰:理論較深不必強求,種子已撒下,靜待發芽。