正则语言与非正则语言的判定

1,563 阅读3分钟

1.正则语言的判定

先来看一个例子,
Σ={0,1,,9}\Sigma = \{ 0,1,\cdots,9 \}LΣL \subseteq \Sigma^*是可以被2或3整除的非负整数的十进制表示的集合(前面没有多余的0)。下面分4个步骤证明LL是正则的。

1.令L1L_1是非负整数十进制表示的集合。可以写作

L1=0    {1,2,,9}ΣL_1 = 0 \; \cup \; \{1,2,\cdots,9\}\Sigma^*

由于L1L_1是用正则表达式表示的,故为正则语言。

能用正则表达式表示的语言是正则语言。

2.令L2L_2是可以被2整除的非负整数十进制表示的集合。即以0,2,4,6,8结尾,可以写作

L2=L1    Σ{0,2,4,6,8}L_2 = L_1 \; \cap \; \Sigma^* \{ 0,2,4,6,8 \}

由于L1L_1是正则的且Σ{0,2,4,6,8}\Sigma^* \{ 0,2,4,6,8 \}是正则的,L2L_2同样正则。

正则语言在 并、连接、Kleene星号、补、交 运算下封闭。

3.令L3L_3是可以被3整除的非负整数十进制表示的集合。构造一台有穷自动机如下

1.png

Elements of the Theory of Computation

于是L3L_3是正则的。

一个语言是正则的当且仅当它能被有穷自动机接受

4.最后L=L2L3L = L_2 \cup L_3 ,它是正则语言。

2.非正则语言的判定

先直观地描述性地给出正则语言共有而非正则语言不具备的两条性质:

  1. 从左到右扫描一个字符串时,为了确定这个字符串最终是否在该语言中,所需要的存储量必须是有界的事先固定的只与该语言有关而与具体的输入字符串无关的
    例如:{anbn:n0}\{ a^nb^n:n \ge 0 \}不是正则的,因为无法让一台有穷自动机记住到达界限前a的个数以及b的个数并进行比较。

  2. 有无穷多个字符串的正则语言用带的有穷自动机或含Kleene星号的正则表达式表示。这样的语言一定有具有某种简单的重复构造的无穷子集。
    例如:{an:n1且是一个素数}\{a^n : n \ge 1且是一个素数\}不是正则的,因为素数不具备简单的周期性。

下面给出一个形式化的定理能够体现上述两个直观的想法。


定理 2.4.1LL是一个正则语言,则存在正整数n1n \ge 1使得任一字符串wLw \in L只要wn|w| \ge n就可以写成w=xyzw = xyz,其中ye,xyny \neq e,|xy| \le n且对每一个i0,xyizLi \ge 0,xy^iz \in L


证明:由于LL是正则的,则它被一台有穷自动机MM接受,设MMnn个状态,wLw \in L是一个长度大于等于nn的字符串。考虑如下计算过程:

(q0,w1w2wn)M(q1,w2wn)MM(qn,e)(q_0,w_1w_2\cdots w_n) \vdash_M (q_1,w_2\cdots w_n) \vdash_M \cdots \vdash_M (q_n,e)

上面的过程存在n+1n+1个格局,而最多只有nn个状态,根据鸽巢原理,必然有至少一个状态能够一步回到自己本身,即存在一个圈。那么在这个状态上可以重复任意次都保证语言被自动机接受。

来看一些例子:

例2.4.2
性质1对应的例子L={aibi:i0}L = \{a^i b^i:i \ge 0\},考虑字符串w=anbnLw = a^nb^n \in L。根据定理,可以把它重写为w=xyzw = xyz,令y=ai,i>0y = a^i,i>0即可满足xyn|xy| \le nyey \neq e,但是考虑xy0z=xz=an1bnLxy^0z = xz = a^{n-1}b^n \notin L,矛盾。

例2.4.3
性质2对应的例子L={an:n是素数}L = \{a^n:n是素数\},考虑x=ap,y=aq,z=arx = a^p,y = a^q,z = a^r,则p+nq+rp+nq+r需要为素数,但是令n=p+2q+r+2n = p+2q+r+2,便存在p+nq+r=(q+1)(q+2q+r)p+nq+r = (q+1)(q+2q+r)是两个大于1的自然数的乘积,矛盾。

例2.4.4

有时使用封闭性证明一个语言不是正则的。

L={w{a,b}:wa,b个数相同}L = \{ w \in \{a,b\}^*:w中a,b个数相同 \}。 由于L    ab={anbn:n0}L \; \cap \; a^*b^* = \{a^nb^n:n \ge 0\}不是正则的,则LL也不是正则的。