上下文無關語言的性質

上下文無關語言對補集不封閉(not closed under complement)

對確定型有限自動機(DFA)來說,取補集幾乎免費:把接受狀態與拒絕狀態對調,就辨識「其餘所有」字串。你可能會希望同樣的把戲對上下文無關語言也行。並不行。上下文無關語言對補集「不」封閉:存在某些上下文無關語言,其補集(字母表上「不」屬於該語言的所有字串)完全逃出了家族。

看清這件事最乾淨的方法,是把兩個你已經信得過的事實組合起來。第一,CFL 對聯集「是」封閉的。第二,它對交集「不」封閉。現在回想集合論的笛摩根定律:L1 ∩ L2 等於 ( (L1 的補集) ∪ (L2 的補集) ) 的補集。為了反證,假設 CFL「真的」對補集封閉。那麼由兩個 CFL L1 與 L2 出發,我們可以各取補集(仍是 CFL)、取聯集(仍是 CFL,因為聯集是安全的)、再取一次補集(仍是 CFL)——而這整個式子等於 L1 ∩ L2。我們等於對「任意」兩個 CFL 都把它們的交集建成了 CFL。但我們知道交集不封閉。矛盾。所以補集不可能是安全的運算。

更深的理由,是交集失敗背後同一個單一堆疊的限制,再加上非確定性的不對稱:PDA 只要「某一條」計算接受就接受,而你無法像對 DFA 那樣輕易把它翻成「沒有任何一條計算接受」。(較小的「確定型上下文無關語言」家族「確實」對補集封閉——正因為 DPDA 像 DFA 一樣只有一條計算可供否定——這也是確定型 CFL 確實是一個不同的、較小家族的一個具體跡象。)

若補集是安全的:取兩個 CFL,各取補集(依假設安全)、取聯集(永遠安全)、再取補集(依假設安全)。結果恰好是它們的交集——這會讓「每一個」CFL 的交集都是 CFL。但 a^n b^n c^n 顯示交集不封閉。所以那個假設必為假。

補集封閉加上聯集封閉,會逼出交集封閉——但交集封閉不成立,所以補集不封閉。

不封閉「不」表示「永遠不封閉」——許多特定 CFL 的補集仍是上下文無關。而較小的「確定型」CFL 家族「確實」對補集封閉;不封閉是針對完整上下文無關類別的性質。

又称
non-closure under complementCFL 補集不封閉