上下文無關語言的性質

a^n b^n c^n 不是上下文無關(not context-free)

語言 { a^n b^n c^n : n >= 0 } 是上下文無關文法(context-free grammar)爬不上去的著名高牆。它是每個「先若干個 a、再「同樣」多個 b、再「同樣」多個 c」的字串:ε、abc、aabbcc、aaabbbccc,依此類推。它的雙字母近親 a^n b^n「是」上下文無關(一個堆疊把 a 對上 b),所以人們很想以為加上第三個字母也不會更難。其實更難——而原因就是下推自動機那一個堆疊。

用白話說出障礙。要接受 a^n b^n c^n,一台 PDA 會為每個 a 推入一個標記,再為每個 b 彈出一個標記,確認 b 與 a 相符。但等到 b 比對完,堆疊已經空了——關於 n 的記憶已經花光。沒有東西能再拿來和 c 比對。一個堆疊只能恰好鎖住「一」對相等的個數;第三組無人看守。再怎麼用單一堆疊耍聰明都繞不過去,而上下文無關語言的幫浦引理把這個直覺變成嚴謹的證明。

它的重要性有兩面。它是「上下文無關類別「嚴格」小於上一層」的標準見證(這類三方計數的語言住在上下文相關(context-sensitive)類別裡),也是不封閉結果背後的引擎:把兩個 CFL——a^n b^n c^m 與 a^m b^n c^n——取交集,恰好產生 a^n b^n c^n,從而證明 CFL 對交集不封閉。每當你看到一個語言要求三組或更多組獨立的相等個數,你「大概不是上下文無關」的警報就該響起。

成員:ε、abc、aabbcc、aaabbbccc。非成員:ab(個數 1,1,0 不相等)、aabbc(a=b=2 但 c=1)、aabbbccc(b 與 a 不相等)。「a=b=c」這個定義性要求,正是單一堆疊無法強制的。

三組獨立的相等個數:一個堆疊只能鎖一對,所以這個語言不是上下文無關。

破壞上下文無關性的是「三方」相等;雙組的 { a^n b^n } 是上下文無關,甚至 { a^n b^n c^m }(只要 a 與 b 相符)也是上下文無關。加上第三個被綁定的組才是致命的。

又称
three-equal-counts language三段相等語言anbncn