3.1 1956 Chomsky 階層:語言、文法與機器的對應#
前言:語言學家闖進計算的世界#
1956 年,MIT 的語言學家喬姆斯基(Noam Chomsky)發表〈語言描述的三模型〉。他的動機來自語言學而非計算機:行為主義把語言視為刺激—反應的集合,喬姆斯基反駁道——兒童能理解並產出從未聽過的句子,因此語言知識必是一套有限規則生成無限句子的系統,即「文法」。
要科學地比較不同文法的能力,需要一個分類框架。喬姆斯基按「生成規則受限的程度」把文法分為四型,並證明它們分別對應四種計算模型。這個 Chomsky 階層意外地成為語言學、計算機科學、編譯器工程三界通用的地圖。
四型文法與對應機器#
文法 \(G = (V, \Sigma, P, S)\) :非終端符號集 \(V\) 、終端符號集 \(\Sigma\) 、生成規則 \(P\) 、起始符號 \(S\) 。四型的差別只在生成規則的形式限制:
| 型別 | 規則形式 | 語言類 | 認知機器 |
|---|---|---|---|
| 3 型(正則) | \(A \to aB\) 或 \(A \to a\) | 正則語言 | 有限自動機 |
| 2 型(上下文無關) | \(A \to \alpha\) (左端單一非終端) | CFL | 下推自動機 |
| 1 型(上下文有關) | \(\alpha A \beta \to \alpha \gamma \beta\) ( $ | \gamma | \ge |
| 0 型(無限制) | 任意 \(\alpha \to \beta\) | 遞迴可枚舉語言 | 圖靈機 |
flowchart TB
R0["0型: 遞迴可枚舉語言<br/>圖靈機"] --> R1["1型: 上下文有關語言<br/>線性有界自動機"] --> R2["2型: 上下文無關語言<br/>下推自動機"] --> R3["3型: 正則語言<br/>有限自動機"]
style R0 fill:#fdd
style R1 fill:#ffd
style R2 fill:#dfd
style R3 fill:#ddf每往下一型,規則多一個限制、機器少一項資源、語言類嚴格縮小。資源與能力的對應是這張表最深刻的訊息:
- 正則:有限狀態(無記憶體);
- CFL:一個堆疊(後進先出,無隨機存取);
- CSL:長度受限的紙帶;
- r.e.:無限紙帶。
為什麼堆疊恰好配上下文無關?#
考慮語言 \(\{a^n b^n\}\) :正則失敗(2.3 節證明),因為需要無限計數。但「一個堆疊」就夠了:讀到 \(a\) 就壓入、讀到 \(b\) 就彈出一個配對——堆疊的深度就是計數器。後進先出恰好匹配巢狀結構(((()))、HTML 標籤、if...{...} 內嵌 if...{...})。
反過來,語言 \(\{ww \mid w \in \{a,b\}^*\}\) (先讀一半、後半比對)需要先進先出或隨機存取,一個堆疊不夠——CFL 也有它的極限(3.2 節用 CFL 泵引理證明)。
自然語言正是這張地圖最好的測試場:英語的 center-embedding("The rat the cat the dog chased killed died")需要無界巢狀,接近但可能超出 CFL 的描述範圍——這場「自然語言是否 CFL」的辯論(Shieber 1985 對瑞士德語的著名證明)至今仍啟發著計算語言學。
生成文法 vs 自動機:兩種等價描述#
Chomsky 階層的每一層都有「描述」與「機器」兩面,與 Kleene 定理(2.2 節)的方法論一脈相承:
- 正則層:正則表達式 ≡ DFA/NFA(Kleene);
- CFL 層:上下文無關文法 ≡ 下推自動機(Chomsky 1956;Chomsky–Schützenberger 1963 完整證明);
- CSL 層:文法 ≡ 線性有界自動機(Kuroda 1964);
- r.e. 層:文法 ≡ 圖靈機(即「文法生成 ≡ 計算」)。
雙視角各有用途:文法適合人類撰寫規格(BNF、編程語言手冊),自動機適合演算法分析(判定、解析、複雜度)。
無限語言與有限規則:文法的本質#
所有四型文法都是有限的規則集,卻能生成無限的語言——靠的是遞迴規則。例如正則文法 \(S \to aS \mid b\) 生成 \(a^*b\) ;CFL 文法
「非終端符號在推導中再生自己」正是遞迴的文法化身,與 1.3 節 Y 組合子的自我應用、哥德爾的自指句遙相呼應:無限來自有限的自指。
虛擬碼:文法推導與語言枚舉#
def derive(grammar, target, max_depth=20):
"""廣度優先枚舉 0 型文法的推導 (判定問題的樸素半演算法)"""
frontier = [grammar["start"]]
for depth in range(max_depth):
for sym_seq in frontier:
if sym_seq == target:
return True # 找到推導
frontier = [rewrite(g, pos) # 套用每條規則於每個位置
for g in frontier
for rule in grammar["rules"]
for pos in match_positions(g, rule)]
return "unknown" # 注意: r.e. 語言的成員判定無演算法全解!
def rewrite(seq, pos):
lhs, rhs = pos.rule
return seq[:pos.i] + rhs + seq[pos.i + len(lhs):]
注意 unknown 分支的深意:對 0 型文法,成員問題是半可判定的(屬於則可枚舉到,不屬於則可能跑不完);對 1 型(CSL)成員問題是可判定的(PSPACE 完全);對 2 型是 \(O(n^3)\) 可解(3.3 節 CYK);對 3 型是線性。語言層級 = 解析問題的複雜度階層——這正是喬姆斯基分類對工程最實用的預測力。
歷史意義與後續發展#
- BNF 與 ALGOL 60:喬姆斯基的同事、語言學家 Victor Yngve 與 MIT 的關係,使 BNF(Backus–Naur Form,1959–1960)直接採用了上下文無關文法的記法。ALGOL 60 報告用 BNF 定義了史上第一個形式化語法的程式語言——程式語言從此有了數學規格(3.2 節詳述)。
- 編譯器結構:詞法分析(正則)與語法分析(CFL)的分工直接來自階層的頭兩層——「能將就就便宜」是工程鐵律:能用 regex 就不用 parser。
- 形式驗證:1 型與其上的文法理論發展成重寫系統(term rewriting)、程式分析的字串抽象。
- 語言學之外:生物序列(RNA 二級結構是 CFL!)、圖像文法、音樂理論,都借用 Chomsky 階層描述結構層次。
重點整理#
- Chomsky 階層按規則限制分四型,對應正則/CFL/CSL/r.e. 語言,機器為 FSM/PDA/LBA/圖靈機。
- 每一層 = 「多一項記憶資源」;堆疊配巢狀結構正是 CFL 的本質。
- 遞迴規則使有限文法生成無限語言——與自指、遞迴函數一脈相承。
- 層級直接決定解析複雜度:線性/立方/PSPACE/不可判定,BNF 與 ALGOL 60 把 CFL 層商品化。