跳转至

正则语言的性质

  • 如何判定一个语言是否是正则语言?
  • 一个正则语言可以有多种描述形式,能否找到最小的一个DFA?

正则语言的泵引理

如何证明一个语言L不是正则语言?

正向证明是十分困难的,需要证明没有任何一个DFA或者NFA能够接受L

可以使用泵引理进行证明

鸽巢原理(抽屉原理)

如果把每只鸽子都放到鸽巢中,那么必定有一个鸽巢当中存在至少两只鸽子

泵引理

如果语言L是正则的,那么存在正整数N,对\(w\in L\),只要\(|w|≥N\),就可以将w分成三部分w=xyz,满足:

  • |y|>0
  • |xy|≤N
  • \(\forall k≥0,xy^kz\in L\)

可以理解为:一个有N个状态的路径,任何从开始状态到接收状态的路径,如果长度超过N,那么一定会经过N+1个状态,那么必定会有一个重复状态,因此可以形成一个循环,多次经过这个循环后仍然可以沿着原路径到达接收状态

泵引理可以用来确定特定语言不是正则语言,泵引理是判定正则语言成立的必要条件,而非充分条件

例:证明\(L=\{a^{n!}|n>0\}\)

有限的语言必定是正则语言,取N为有限语言最长字符串长度+1,不存在\(w\in L(|w|≥N)\)

封闭原理

正则语言在经过一些运算后仍然可以保持新语言正则

  1. 反转
  2. 同态
  3. 逆同态

同态:若\(\Sigma\)\(\Gamma\)是两个字母表,同态定义为函数\(h:\Sigma\to\Gamma^*\)(将\(\Sigma\)上的一个符号映射为\(\Gamma\)上的符号串)

\[\forall a\in \Sigma,h(a)\in \Gamma^*\]

扩展h定义至字符串:

\[\begin{split}h(\epsilon)=\epsilon\\h(xa)=h(x)h(a)\end{split}\]

在扩展到语言,对\(\forall L\subseteq \Sigma^*\)

\[h(L)=\{h(w)|w\in L\}\]

交运算

若DFA \(A_L,A_M和A\)的定义如下:

\[A_L=(Q_L,\Sigma,\delta_L,q_L,F_L)\]
\[A_M=(Q_M,\Sigma,\delta_M,q_M,F_M)\]
\[A=(Q_L\times Q_M,\Sigma,\delta,(q_L,q_M),F_L\times F_M)\]

其中\(\delta((p,q),a)=(\delta_L(p,a),\delta_M(q,a))\)

对于任意\(w\in \Sigma^*,\hat{\delta}((q_L,q_M),w)=(\hat{\delta}(q_L,w),\hat{\delta}(q_M,w))\)

例:\(L_1:1*0(0+1)*\quad L_2:0*1(0+1)*\),求\(L_1\cap L_2\)

定理:如果\(L_1,L_2\)都是正则语言,那么\(L_1\cap L_2\)一定是正则语言

假如\(L_1,L_2\)都不是正则的,\(L_1\cap L_2\)也不一定就是非正则语言

例:\(L_1=\{0^n1^n|n>0\}\quad L_2=\{a^nb^n|n>0\}\),两者的交为\(L_1\cap L_2=\{\epsilon\}\)是正则语言

判定性质

3个典型的判定问题

  1. 以某种形式化模型描述的语言是否为空? 是否无穷?
  2. 某个特定的串w是否属于所描述的语言?
  3. 以两种方式描述的语言, 是否是相同的? — 语言的等价性。

定理

  • 具有n个状态机的有穷自动机M接受的集合S
    • S是非空的,当且仅当M接受某个长度小于n的串
    • S是无穷的,当且仅当M接受某个长度为m的串,n≤m≤2n