上下文無關語言的性質

上下文無關語言的封閉性(closure properties)

把上下文無關語言(context-free language, CFL)想成一個門禁森嚴的俱樂部。某些把成員組合起來的方式,產生的人「仍然」可以進俱樂部;另一些方式卻會放進一個不屬於這裡的陌生人。封閉性正是這道門的規則:哪些運算讓你留在上下文無關語言這個家族之內,哪些會把你趕出去。對某些運算,CFL 的門比正規語言(regular language)更寬鬆;對另一些運算卻更嚴格——而看出這個差別,是這套理論最初的重大一課。

具體來說,若 L 與 M 都是上下文無關語言,則以下也都是:聯集 L ∪ M(屬於任一者的字串——只要加一個新的起始符號 S,配上兩套文法的規則 S -> S_L 與 S -> S_M)、串接 LM(先一個 L 的字串、再接一個 M 的字串——用 S -> S_L S_M)、Kleene 星號 L*(把零個或多個 L 的字串黏接起來——用 S -> S_L S | ε)、L 的反轉(每個字串倒著拼——把每條文法規則的右側反轉)、以及 L 在同態(homomorphism,逐符號替換)下的像。還有一個混合運算也留在家族內:一個 CFL 與一個正規語言的「交集」仍是上下文無關語言。每一項封閉性都用一個對文法或下推自動機(pushdown automaton)的明確構造來證明。

但這裡有一道讓初學者吃驚的牆:上下文無關語言對(兩個 CFL 的)「交集」「不」封閉,對「補集」也「不」封閉。正規語言對所有運算都封閉;CFL 並非如此。這不是我們不夠聰明造成的——存在具體的 CFL 配對,其交集可被證明「不」是上下文無關;也存在具體的 CFL,其補集「不」是上下文無關。所以封閉性是每個家族各自的事實,得去查、不能假設:知道一個語言是上下文無關,就告訴你哪些構造是安全的、哪些是被禁止的。

聯集:由產生 { a^n b^n : n >= 0 } 的文法 G1 與產生 { b^m c^m : m >= 0 } 的文法 G2,建出 S -> S1 | S2(並接上 G1、G2)。新文法產生聯集——仍是上下文無關。但這些家族的近親(a^n b^n c^m 與 a^m b^n c^n)的交集「不」是上下文無關,所以交集在這裡不是安全的運算。

對聯集、串接、星號、反轉、同態、與正規語言取交集封閉——但對交集與補集「不」封閉。

別把正規語言的直覺整套搬過來:正規語言對交集與補集封閉,但 CFL 「不」封閉。這個對比是模型本身的真實特性,不是疏漏。

又稱
CFL closure propertiesclosure of the context-free languagesCFL 對運算的封閉性