上下文無關文法與推導

上下文無關語言(context-free language)

從任何單一文法退後一步問:這類文法「究竟」能描述哪些語言(作為字串集合)?上下文無關語言就是某個上下文無關文法所能生成的語言。它是正規語言之上一層的自然類別——恰好是那些具有巢狀、遞迴、配對結構,有限自動機無法捕捉、但堆疊可以的語言。

形式上,字母表 Σ(Sigma)上的語言 L 是上下文無關的,當存在一個上下文無關文法 G 使其生成的語言 L(G) 等於 L。經典例子有 { a^n b^n : n ≥ 0 }(等量的 a 後接等量的 b)、平衡括號的語言,以及回文——這些全都「不」是正規語言,因為記錄無界的巢狀數量需要有限自動機所缺的無界記憶體。等價地,依一條基本定理,上下文無關語言恰好是下推自動機所接受的語言:有限狀態控制器加上一個堆疊。這唯一的堆疊正是讓你能配對巢狀結構的額外記憶體(進去時壓入,出來時彈出)。

上下文無關語言端坐於喬姆斯基階層的正中央:每個正規語言都是上下文無關的,反之不然;每個上下文無關語言都是上下文相關的,反之亦不然。它們有有用但「部分」的封閉性——對聯集、串接與 Kleene 星號封閉,但對交集或補集「不」封閉——而且有誠實的極限:{ a^n b^n c^n } 不是上下文無關的(CFL 的幫浦引理可證),而關於 CFG 的若干自然問題,如兩個文法是否生成相同語言,是不可判定的。所以上下文無關對程式語言語法已夠強大,但遠非全能。

L = { a^n b^n : n ≥ 0 } = {ε, ab, aabb, aaabbb, ...} 是上下文無關的(文法 S → a S b | ε),但不是正規語言。相對地,{ a^n b^n c^n }「不」是上下文無關的——堆疊能把 a 與 b 配對,但之後無法再去和 c 配對。

CFL = 某個 CFG 所生成 = 某個下推自動機所接受;它捕捉一層的巢狀配對。

CFL 對聯集、串接與 Kleene 星號封閉,但對交集或補集「不」封閉——這是真實的極限。而 { a^n b^n c^n } 不是上下文無關的,所以這個類別確實比完整的圖靈能力弱。

又称
CFL前後文無關語言