我们知道,正则表达式(和有穷自动机)的数目是可数的,而语言的数目是不可数的,因此存在非正则语言。如何判定一个语言不是正则语言,这需要从正则语言的“本质”特性去讨论。
有穷自动机(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。