我們知道,正則表達式(和有窮自動機)的數目是可數的,而語言的數目是不可數的,因此存在非正則語言。如何判定一個語言不是正則語言,這需要從正則語言的“本質”特性去討論。
有窮自動機(DFA)是正則語言(RL)的識別模型。一個 DFA 只有有窮個狀態,也就是說,當該DFA識別的語言 L 是無窮語言時,L 中必定存在一個足夠長的句子,使得 DFA 在識別該句子的過程中,肯定要重復地經過某些狀態。
我們先不加證明的給出一個定理:設 L 是一個正則語言,則存在正整數 m ≥ 1 使得任一字符串 w ∈ L,只要 |w| ≥ m 就可以寫成 w = xyz,其中 y ≠ e,|xy| ≤ m 且對每一個 i ≥ 0,xyiz ∈ L。
由於 L 是正則的,它被一台確定型有窮自動機 M 接受,對於字符串 w = a1a2…am,識別字符串w的過程中經過的狀態依次為 q0,q1,…,qm,考慮 M 對 w 的前 m 步計算:(q0,a1a2...am) ├M(q1,a2...am)├M...├M(qm,e).其中 q0 是 M 的初始狀態,a1...am是 w 的前 m 個符號。因為 M 只有 m 個狀態,而在上面的計算中有 m+1 個格局,所以根據鴿巢原理,這些狀態中至少有一對是重復的,如 qk 和 qj (k ≠ j 且 0≤ k < j ≤ m)。即字符串 y = ak+1...aj把 M 從狀態 qk 帶回狀態 qj,而且由於 k < j,y 不是空串。於是,可以從 w 中刪去 y 或者接在 w 的第 j 個符號后面重復任意次 y,所得到的字符串仍被 M 接受。即,對於每一個 i ≥ 0,M接受 xyiz,其中x = a1...ak和z = aj+1...an。最后,注意到 xy 的長度 j 根據定義不超過 m,符合要求。
證明語言 L = {aibi:i ≥ 0}不是正則的。
反證法:如果 L 是正則的,則存在滿足定理要求的整數 n。考慮字符串 w = anbn ∈ L。根據定理,將其重寫成 w = xyz 使得 |xy| ≤ n 且 y ≠ e,即 y = ai,其中 i >0。
如果 y 僅含有 a 或僅含有 b,那么xy2z中 a,b 的個數明顯不等,因此 xy2z 不屬於 L。
如果 y 同時含有 a 和 b,那么 y2中一定會出現 a 在 b 之后的情況,因此xy2z 不屬於 L。