第 4 章 正则语言的性质
泵引理、封闭性、判定性质与 DFA 最小化
Source scope
主要依据教材第 4 章:中文印刷页 85–113,对应 PDF p.98–126。本文将教材中的定理、构造和证明方法整理成可独立学习的版本。
1 0. 本章解决四类问题
学会识别正则语言之后,更重要的是回答:
- 非正则性:怎样证明一个语言不可能由有限自动机识别?
- 封闭性:对正则语言做某种运算,结果仍正则吗?
- 判定性:给定自动机,能否算法化地判断空性、成员性、等价性?
- 最小化:一个正则语言至少需要多少个 DFA 状态?
2 1. 正则语言的泵引理
2.1 1.1 定理陈述
若 \(L\) 是正则语言,则存在整数 \(n\ge1\)(泵长度),使得任意满足
\[ w\in L,\qquad |w|\ge n \]
的串都可分解为
\[ w=xyz \]
并满足:
- \(|xy|\le n\);
- \(|y|>0\);
- 对所有 \(i\ge0\), \[xy^iz\in L.\]
2.2 1.2 为什么成立
设一个识别 \(L\) 的 DFA 只有 \(n\) 个状态。处理长度至少为 \(n\) 的串时,观察读完前 \(0,1,\dots,n\) 个字符后的 \(n+1\) 个状态。
根据鸽巢原理,必有两个时刻落在同一状态。两次访问同一状态之间读到的非空片段就是 \(y\)。
既然读 \(y\) 会从某状态回到自己,就可以把这个环走任意多次:
\[ xy^iz. \]
2.3 1.3 泵引理证明非正则的逻辑顺序
这是最容易写反量词的一类证明。
要证 \(L\) 非正则:
- 假设 \(L\) 正则;
- 令 \(n\) 为泵长度;
- 由我们选择一个长度至少 \(n\) 的 \(w\in L\);
- 对任意满足条件的分解 \(w=xyz\);
- 找到某个 \(i\),使 \(xy^iz\notin L\);
- 矛盾。
关键是:分解不是我们选的。
2.4 1.4 典型例子:\(\{0^m1^m\mid m\ge0\}\)
假设该语言正则,泵长度为 \(n\)。取
\[ w=0^n1^n. \]
因为 \(|xy|\le n\),所以 \(y\) 完全落在前面的 0 区,设 \(y=0^k\),\(k>0\)。
取 \(i=0\):
\[ xy^0z=0^{n-k}1^n, \]
0 和 1 数量不同,不在语言中。矛盾。
2.5 1.5 泵引理的限制
泵引理提供的是正则语言的必要条件,不是充分条件。
因此:
- 违反泵引理 $ Rightarrow$ 非正则;
- 满足某种“看起来可泵”的性质,并不能直接推出正则。
3 2. 正则语言的封闭性
3.1 2.1 布尔运算
若 \(L_1,L_2\) 正则,则下列语言也正则:
\[ L_1\cup L_2, \quad L_1\cap L_2, \quad \overline{L_1}, \quad L_1-L_2. \]
3.1.1 乘积自动机
设
\[ A_1=(Q_1,\Sigma,\delta_1,q_1,F_1), \quad A_2=(Q_2,\Sigma,\delta_2,q_2,F_2). \]
构造状态集合
\[ Q_1\times Q_2 \]
并定义
\[ \delta((p,q),a)=(\delta_1(p,a),\delta_2(q,a)). \]
只需改变接受集合即可得到并/交/差等语言。
3.2 2.2 补运算
对一个完整 DFA,把接受和非接受状态互换即可识别补语言:
\[ F' = Q-F. \]
若输入表示是 NFA,不能直接把双圈翻转;应先确定化。
3.3 2.3 反转
若 \(L\) 正则,则
\[ L^R=\{w^R\mid w\in L\} \]
也正则。
一种构造:把 NFA 的边全部反向,原接受状态变为新初始来源,原初态变成接受状态;若原来有多个接受状态,引入新的 \(\varepsilon\) 初态。
3.4 2.4 同态与逆同态
同态 \(h\) 由字母映射扩展到串:
\[ h(a_1a_2\cdots a_k)=h(a_1)h(a_2)\cdots h(a_k). \]
正则语言对同态和逆同态都封闭。
逆同态:
\[ h^{-1}(L)=\{w\mid h(w)\in L\}. \]
它在后面不可判定性、编译与编码问题中非常重要。
4 3. 正则语言的判定性质
因为正则语言有 DFA 这种有限表示,许多问题可以直接转成有限图上的算法。
4.1 3.1 成员性
给定 DFA \(A\) 和串 \(w\),计算
\[ \hat\delta(q_0,w) \]
并检查是否落入 \(F\)。时间复杂度为 \(O(|w|)\)。
4.2 3.2 空性
\(L(A)=\emptyset\) 当且仅当从初态不可达任何接受状态。
因此做一次 DFS/BFS 即可。
4.3 3.3 无穷性
一个 DFA 的语言无限,当且仅当存在某个从初态可达、又能到达接受状态的环。
直觉:只要在“有效路径”上有环,就能把环重复任意多次产生无限多不同长度的串。
5 4. 状态等价与 DFA 最小化
5.1 4.1 不可区分状态
对 DFA 中状态 \(p,q\),若对任意 \(w\in\Sigma^*\),都有
\[ \hat\delta(p,w)\in F \iff \hat\delta(q,w)\in F, \]
则称 \(p,q\) 等价或不可区分。
若存在某个 \(w\) 使一边接受一边拒绝,则 \(w\) 是区分这两个状态的区分串。
5.2 4.2 表填充算法
常用算法:
- 列出所有无序状态对 \(\{p,q\}\);
- 若一个接受、一个不接受,立即标记为可区分;
- 反复检查未标记对:若对某个符号 \(a\), \[ \{\delta(p,a),\delta(q,a)\} \] 已标记,则标记 \(\{p,q\}\);
- 收敛后,未标记对即为等价状态。
5.3 4.3 最小化算法
完整流程:
- 删除不可达状态;
- 求状态等价类;
- 每个等价类合并为一个状态;
- 继承转移关系。
5.4 4.4 为什么不能比最小 DFA 更小
最小 DFA 的每个状态代表一种不同的“未来行为”。如果两个状态被错误合并,就存在某个后缀能把它们区分,合并后将无法同时给出正确答案。
这与后面 Myhill–Nerode 思想一致:
一个正则语言需要多少状态,本质上取决于有多少种互不等价的右上下文。
6 5. 证明策略选择
面对“某语言是否正则”,不要默认先用泵引理。
推荐顺序:
- 能直接构造 DFA/RE:直接证明正则;
- 能通过闭包性质从已知语言得到:用闭包;
- 若要证非正则:优先考虑闭包反证;
- 再考虑泵引理。
例如若 \(L\) 与一个正则语言相交后得到已知非正则语言,则 \(L\) 不可能正则。
7 6. 常见错误
- 泵引理中自己选择 \(x,y,z\);
- 忘记 \(|y|>0\);
- 证明补封闭时直接翻转 NFA 接受状态;
- 最小化前不删除不可达状态;
- 把“等价状态”与“状态名字相似”混为一谈;
- 判定无穷性时只检查有没有环,而忽略该环是否位于可接受路径上。
8 7. 本章知识地图
Regular Language
├─ 非正则证明:Pumping Lemma
├─ 封闭性:Boolean / reverse / homomorphism / inverse homomorphism
├─ 判定:membership / emptiness / infiniteness / equivalence
└─ 规范表示:DFA minimization