4.3 1951 Rice 定理與不可判定問題全景#
前言:一個定理終結一整類問題#
到 1950 年代初,人們已陸續證明停機問題、判定問題等不可判定。每證一個都要重新設計歸約,勞師動眾。1951 年,Henry Rice 發表了一個震撼性的「總結算」:
Rice 定理:設 \(\mathcal{C}\) 是圖靈機語言的任一非平凡性質(即:有些 r.e. 語言具有 \(\mathcal{C}\) 、有些不具),則
不可判定。
翻譯成工程語言:任何一個只關心「程式做什麼」(語言行為)而不關心「程式怎麼寫」(語法實現)的問題,都不可判定。 空語言?不可判定。等於某特定語言?不可判定。是不是正則?不可判定。會不會輸出 42?不可判定。Rice 定理一擊把整個程式行為分析的領域宣告為「一般無解」。
證明:歸約技術的漂亮示範#
證明只用兩個固定語言作為錨點。設 \(\mathcal{C}\) 非平凡,取 \(\emptyset \notin \mathcal{C}\) 與某個 \(L_0 \in \mathcal{C}\) (取反可假設其一;若 \(\emptyset \in \mathcal{C}\) 則對補性質論證)。
給定 \(\langle M, w \rangle\) ,構造機器 \(N\) :
N(x):
先模擬 M(w) (若不停機, N 也不停機)
模擬結束後, 跑 L0 的枚舉器, 逐字輸出
則 \(L(N) = L_0\) (若 \(M\) 接受 \(w\) )或 \(L(N) = \emptyset\) (若不停機)。故:
若 \(L_{\mathcal{C}}\) 可判定,則 \(A_{TM}\) 可判定,矛盾。 \(\blacksquare\)
構造的精髓:把「停機與否」藏進一個行為開關——不停機時 \(N\) 的語言是空的、停機時是 \(L_0\) 。任何語言性質都會被這個開關觸動,因此無一倖免。
flowchart LR
A["⟨M,w⟩ ∈ A_TM?"] -- "構造 N: 行為開關" --> B["L(N) ∈ C ?"]
B -- "若可判定" --> C["A_TM 可判定 → 矛盾"]
C --> D["故所有非平凡語言性質不可判定"]定理的精確適用範圍(工程師必讀的細則)#
Rice 定理有三個常見誤用,值得劃清界線:
- 只適用語言性質。語法性質可判定:「這個程式有沒有 10 行以內」可判(看原始碼);「變數命名是否符合規範」可判。靜態分析中所有能做的檢查,幾乎都是語法/結構性質。
- 只適用 r.e. 語言的全體圖靈機。限定模型後可判定:正則表達式的等價性、CFG 的空性皆可解——第 2、3 章正是這些「島嶼」。
- 不否定半判定。 \(L(M) = \emptyset\) 不可判定,但其「正例」半可判定(枚舉直到接受即知非空);反之空性不能半判定。Rice 的精細版(r.e. 索引集的算術階層位置,Myhill 1955、Shapiro)告訴你每個性質落在 \(\Sigma_k\) 的哪一層——「有多不可判定」本身就是可測量的。
不可判定問題全景圖#
把 1936–1970 年代的主要不可能定理排成一張譜系圖:
flowchart TB
GO["Cantor 對角線法 1891"] --> G["哥德爾不完備 1931<br/>(算術化的自指)"]
G --> T["停機問題 1936<br/>A_TM 不可判定"]
T --> CH["一階邏輯有效性不可判定<br/>(Church-Turing: 判定問題落幕)"]
T --> P1["PCP 1946<br/>(Post)"]
P1 --> R1["CFG 歧義性 1962"]
P1 --> R2["矩陣死亡 / 平鋪 1966-70"]
T --> RI["Rice 定理 1951<br/>所有非平凡語言性質"]
RI --> E1["空性/等價/正則性/停止性<br/>對任意程式皆不可判定"]
T --> H10["Hilbert 第十問題 1970<br/>(丟番圖方程, Matiyasevich)"]
G --> T
style T fill:#fdd
style RI fill:#ffd
style P1 fill:#ffd各行都可再往下延伸(程式終止性、等價性、緩衝區溢位判定、Android app 行為驗證……),但骨架不變:對角線發明一次,歸約複製到處。
為什麼理論仍然有建設性:可判定的島嶼#
Rice 定理的「毀滅性」反而是設計的指南針。它逼出了四條系統性的退路,每一條都長成了獨立的技術工業:
退路一:換模型(抽象解釋 / 抽象域)#
程式的精確行為不可判定,但保守近似可以。抽象解釋(Cousot & Cousot 1977)把無限狀態映到有限抽象域(符號 ±、區間、多面體),保證終止且只會誤報、不會漏報——安全分析的語意就是「寧可錯殺」。
退路二:限資源(有界驗證)#
「 \(n\) 步內是否接受?」可判定(直接模擬)。Bounded Model Checking 把驗證問題變成 SAT 求解;只要接受「僅覆蓋 \(n\) 步內的行為」,就重獲完備性。
退路三:限結構(模型檢查)#
有限狀態系統 + 時序邏輯規格(CTL/LTL):模型檢查(Clarke–Emerson–Quielle 1981; Sifakis)完全可判定且可自動生成反例,工業化為硬體驗證標配(2007 圖靈獎)。其擴展(pushdown 系統、timed automata 的 PSPACE 可判定性)持續把島嶼外擴。
退路四:限義務(半決策與證明輔助)#
不讓機器「自動判定」,讓它檢查人給的證明:證明檢查是可判定的(機械地驗證每一步),因此 Coq/Lean 能承載不可判定的真理——人機分工繞過 Rice 定理。這條線直接追溯到哥德爾:定理不可證明性是「全自動證明」的牆,而「證明可機檢」是另一扇門。
Rice 定理 → 不可判定的汪洋
├─ 換模型: 抽象解釋 (Astrée 驗證 Airbus 航電, 零漏報)
├─ 限資源: BMC → SAT/SMT (CBMC, KLEE)
├─ 限結構: 模型檢查 (SPIN, NuSMV, 工業硬體驗證)
└─ 限義務: 證明檢查器 (Coq 驗證 CompCert 編譯器, seL4 核心)
歷史意義與後續發展#
- 靜態分析與軟體工程的邊界:每個 linter/分析器工具的說明書其實都在回答「這檢查是語法性質(Rice 不適用)還是行為性質(只能啟發式)」。soundness–completeness–decidability 三角是程式分析理論的公理。
- 安全性:Rice 定理 ⇒ 不存在判定「此程式惡意」的演算法 ⇒ 防毒、入侵偵測、混淆與反混淆的軍備競賽是數學必然,不是技術暫時落後。
- 資料庫與知識表示:一階邏輯不可判定,但 SQL 的 SELECT(實為邏輯子集)可判定——查詢語言的設計就是「圈島嶼」;Datalog、描述邏輯(OWL 的子集)皆是可控片段。
- 人工智慧:「判定任意程式是否對齊人類價值」也是語言/行為性質——對齊理論家援引 Rice 定理論證全自動對齊驗證不可能,必須退到退路四(形式規格 + 人類監督)。
重點整理#
- Rice 定理:任何非平凡的「語言性質」(行為性質)對圖靈機全體不可判定;證明是「行為開關」歸約。
- 三條適用細則:只管行為、只管圖靈機全體、不管半判定性——誤用常見,細則即指南。
- 四條建設性退路(換模型/限資源/限結構/限義務)分別長成抽象解釋、BMC、模型檢查、證明檢查器。
- Rice 定理把「不可能」從一個個定理升級為全域地圖,直接塑造靜態分析、安全與形式驗證的工程格局。