相关笔记: 13.3 不带输出的有限状态机 | 13.5 图灵机
概览
本节回答了一个核心问题:有限状态自动机能识别哪些集合?答案是正则集合(regular set)。本节首先给出正则表达式(regular expression)的递归定义,包括基础元素(、、单符号)和三种运算(连接、并、Kleene 闭包),然后给出正则表达式的等价变换恒等式。核心结果是Kleene 定理:一个集合是正则的当且仅当它可以被有限状态自动机识别。此外,本节证明了正则集合与正则文法(3 型文法)的等价性,并利用泵引理(pumping lemma)的思路展示了非正则集合的例子(如 )。最后简要介绍了下推自动机和图灵机等更强大的计算模型。
- 正则表达式:在字母表 上递归定义的表达式,基础为 、、,运算为连接 、并 、Kleene 闭包
- 正则集合:由正则表达式表示的集合
- Kleene 定理:集合是正则的 它可以被有限状态自动机识别
- 正则文法(3 型文法):产生式形如 、、 的文法
- 泵引理:判断集合非正则的重要工具
- 下推自动机:带栈的有限状态机,识别上下文无关语言
一、知识结构总览
graph TB A["13.4 语言识别<br>Language Recognition"] --> B["正则表达式"] A --> C["Kleene 定理"] A --> D["正则集合与正则文法"] A --> E["非正则集合"] A --> F["更强大的计算模型"] B --> B1["基础:∅, λ, x∈I"] B --> B2["运算:连接 AB"] B --> B3["运算:并 A∪B"] B --> B4["运算:Kleene 闭包 A*"] B --> B5["等价变换恒等式"] C --> C1["正则 ⟹ DFA 可识别"] C --> C2["DFA 可识别 ⟹ 正则"] C --> C3["NFA 构造法"] D --> D1["正则文法 ⟹ 正则集合"] D --> D2["正则集合 ⟹ 正则文法"] D --> D3["文法与自动机的对应"] E --> E1["泵引理(Pumping Lemma)"] E --> E2["例:{0ⁿ1ⁿ | n≥0} 非正则"] E --> E3["鸽巢原理的应用"] F --> F1["下推自动机(PDA)"] F --> F2["线性有界自动机"] F --> F3["图灵机"]
二、核心思想
核心思想
本节的核心思想是正则表达式、有限状态自动机和正则文法三者描述的是完全相同的语言类——正则语言。Kleene 定理建立了正则表达式与有限状态自动机之间的桥梁,而正则文法则从文法(生成式)的角度刻画了同一类语言。这三种等价的描述方式各有优势:正则表达式简洁直观,适合声明式描述模式;有限状态自动机适合算法实现和高效匹配;正则文法则将语言识别与形式文法理论联系起来。此外,本节还展示了有限状态自动机的局限性——存在不能被任何有限状态自动机识别的集合(如 ),引出了更强大的计算模型。
1. 正则表达式的定义
正则表达式(Regular Expression)
字母表 上的正则表达式递归定义如下:
基础:
- 是正则表达式(表示空集)
- 是正则表达式(表示集合 )
- 是正则表达式,其中 (表示集合 )
递归规则:若 和 是正则表达式,则以下也是正则表达式:
- :表示集合 和 的连接
- :表示集合 和 的并
- :表示集合 的Kleene 闭包
由正则表达式表示的集合称为正则集合(regular set)。
正则表达式及其表示的集合
正则表达式 表示的集合 后跟任意多个 (含零个),即 任意多个 的连接(含空串),即 字符串 或字符串 以 开头的所有位串 不以 结尾的所有位串
构造正则表达式
(a) 偶数长度的位串:每个长度为 的块可以是 ,因此正则表达式为 。
(b) 以 结尾且不含 的位串:每个块要么是 ,要么是 (因为不能出现 ,每个 后面必须跟 ),因此正则表达式为 。
(c) 含奇数个 的位串:这样的位串可以分解为若干块,每块形如 (含一个 ),因此正则表达式为 。
2. 正则表达式的等价变换
正则表达式的恒等式
以下恒等式对任意正则表达式 成立:
恒等式 说明 是并的幺元 是连接的零元 是连接的幺元 闭包的幂等性 并的交换律 连接对并的分配律 并对连接的分配律 连接的结合律 闭包的展开
正则表达式化简技巧
化简正则表达式时常用以下策略:
- 利用 消除含 的连接
- 利用 消除冗余的
- 利用 简化嵌套闭包
- 利用分配律展开或合并表达式
3. Kleene 定理
Kleene 定理(Kleene's Theorem)
一个集合是正则的当且仅当它可以被有限状态自动机识别。
即:正则集合 有限状态自动机识别的语言。
证明思路(正则 DFA 可识别): 由于正则表达式是递归定义的,只需证明以下六点:
- 可被 NFA 识别(无接受状态的自动机)
- 可被 NFA 识别(起始状态即为接受状态,无转移)
- 可被 NFA 识别(起始状态经 到接受状态)
- 若 和 可被识别,则 可被识别(串联两个自动机)
- 若 和 可被识别,则 可被识别(并联两个自动机,加新起始状态)
- 若 可被识别,则 可被识别(加新起始状态,从接受状态回到起始状态)
由于 NFA 与 DFA 等价(13.3 节定理 1),以上均可转化为 DFA。
用 Kleene 定理构造自动机
构造识别正则集合 的 NFA。
步骤:
- 先构造识别 的 NFA(识别 的自动机加 Kleene 闭包构造)
- 再构造识别 的 NFA(识别 和识别 的自动机串联)
- 最后用并集构造将两者合并(加新起始状态,-转移分别指向两者)
注意:这种构造方法不产生最简自动机。 可以用一个更简单的 3 状态自动机识别。
4. 正则集合与正则文法
正则集合与正则文法的等价性(定理 2)
一个集合由正则文法生成当且仅当它是正则集合。
证明思路(正则文法 正则集合): 设 是正则文法。构造 NFA :
- 每个非终结符对应一个状态,另加一个接受状态
- 起始状态 对应起始符号
- 产生式 对应转移
- 产生式 对应转移
- 若 在 中,则 也是接受状态
证明思路(正则集合 正则文法): 设 是识别正则集合的 DFA。构造正则文法 :
- 每个状态对应一个非终结符
- 终结符集 = 输入字母表
- 若 ( 非接受状态),则
- 若 ( 是接受状态),则
- 若 ,则
从正则文法构造 NFA
正则文法 :,,产生式为 ,,,,,。
构造 NFA:
- (对应 ),(对应 ),(接受状态)
- ,,,,
- 也是接受状态(因为 )
从 DFA 构造正则文法
DFA:,,,,,,,。
正则文法 :,,产生式为 ,,,,,,,,,。
5. 非正则集合
泵引理(Pumping Lemma)
设 是 DFA, 且 ,则存在 使得:
- 对所有 ,
直观理解:如果字符串足够长(至少等于状态数),则在处理前 个符号时,由鸽巢原理必然有某个状态被重复访问。因此存在一个”循环”(对应 ),可以重复任意多次而不影响最终是否到达接受状态。
证明 不是正则集合
反证法:假设该集合是正则的,则存在 DFA 识别它。设 有 个状态。
考虑字符串 。处理前 个符号(即 )时,由鸽巢原理, 个状态中必有重复。设第 个和第 个状态相同(),令 。
这意味着从状态 出发,读入 个 后回到 (存在循环)。
现在考虑字符串 。额外的 个 使我们多绕循环一次,最终仍到达与处理 时相同的状态(接受状态)。但 中 的个数多于 的个数,不属于 ,矛盾!
因此 不是正则集合。
更多非正则集合的例子
以下集合都不是正则的(可用泵引理证明):
- ( 的个数为 的幂)
- 上所有回文串的集合
6. 更强大的计算模型
下推自动机(Pushdown Automaton)
下推自动机是在有限状态自动机的基础上增加了一个栈(stack)的计算模型。
- 栈提供无限记忆,但只能按后进先出(LIFO)方式访问
- 下推自动机识别的语言类恰好是上下文无关语言(由 2 型文法生成的语言)
- 例如, 可以被下推自动机识别(用栈记录 的个数),但不能被有限状态自动机识别
线性有界自动机与图灵机
- 线性有界自动机:比下推自动机更强大,可以识别上下文有关语言(1 型文法)
- 图灵机:最通用的计算模型,可以识别所有由短语结构文法(0 型文法)生成的语言
- 图灵机具有双向无限带,读写头可以左右移动并改写带上的符号
三、补充理解与易混淆点
补充理解
补充1:Kleene 定理的历史意义
Kleene 定理由美国数学家 Stephen Kleene 于 1956 年证明,是自动机理论中最重要的基础定理之一。这一定理建立了正则表达式(一种代数/描述性工具)与有限状态自动机(一种机器模型)之间的精确对应关系。在实际应用中,这一对应关系使得我们可以用简洁的正则表达式声明式地描述模式,然后通过算法自动将其编译为高效的有限状态自动机来执行匹配。现代编程语言中的正则表达式引擎(如 PCRE、Java 的 java.util.regex)正是基于这一理论基础。
来源:Kleene, S. C. (1956). “Representation of Events in Nerve Nets and Finite Automata.” Automata Studies, 34, 3-41.
补充2:正则表达式的实际应用与局限性
正则表达式是计算机科学中最广泛使用的模式匹配工具之一。在文本编辑器(如 vim、emacs)中用于搜索替换,在编程语言中用于输入验证(如邮箱格式、电话号码格式),在编译器中用于词法分析,在网络安全中用于入侵检测系统的规则匹配。Friedl 的《Mastering Regular Expressions》是这一领域的经典参考书。然而,正则表达式只能描述正则语言,无法处理需要”计数”的模式(如匹配成对的括号、检查 HTML 标签是否正确嵌套等)。这些任务需要上下文无关文法或更强大的工具来处理。
来源:Friedl, J. E. F. (2006). Mastering Regular Expressions (3rd ed.). O’Reilly Media.
易混淆点
误区1:正则表达式的连接 vs 字符串的连接
- ❌ 混淆正则表达式层面的连接与字符串层面的连接
- ✅ 正则表达式 表示集合 中每个字符串与集合 中每个字符串的连接,结果是集合的连接
- 例如,(所有长度为 2 的位串)
误区2: 包含空串
- ❌ 认为 不包含空串
- ✅ ,而 ,因此 始终包含空串
- 例如,
误区3:正则表达式 编程语言中的正则表达式
- ❌ 将理论上的正则表达式与现代编程语言中的”正则表达式”(如 PCRE)等同
- ✅ 理论上的正则表达式只能描述正则语言;现代正则表达式引擎通常支持回溯引用(backreference)等扩展特性,可以描述非正则语言
- 例如,
(a|b)\1可以匹配 和 但不匹配 和 ,这种”回溯引用”能力超出了正则表达式的理论范畴
四、习题精选
习题概览
题号范围 核心考点 难度 1-2 描述正则表达式表示的集合 ⭐ 3-4 判断字符串是否属于正则集合 ⭐⭐ 5-7 用正则表达式描述给定集合 ⭐⭐ 8-10 构造 DFA/NFA 识别正则集合 ⭐⭐ 11 正则集合的逆也是正则的 ⭐⭐⭐ 12-13 用 Kleene 定理构造 NFA ⭐⭐⭐ 15-17 构造正则文法 ⭐⭐ 23-25 用泵引理证明非正则 ⭐⭐⭐
题1:描述正则表达式表示的集合
题目
用文字描述以下正则表达式表示的集合:(a) ;(b) ;(c) ;(d) 。
解答
(a) :任意多个 (含零个)后跟一个 。即所有以 结尾的位串。
(b) :任意多个 后跟至少一个 ,再跟任意多个 。即所有至少含一个 的位串。
(c) :字符串 或字符串 。
(d) :由任意多个块组成,每个块要么是 ,要么是 。即所有不含连续奇数个 的位串(或者说,每个 都必须成对出现,除非 出现在末尾且前面有奇数个 …实际上更精确地说,是所有由 和 组成的位串)。
题2:构造正则表达式
题目
用正则表达式描述以下集合:(a) 恰好含一个 的位串;(b) 以 结尾且不含 的位串。
解答
(a) 恰好含一个 :这个 可以出现在任意位置,其余全是 。
(b) 以 结尾且不含 :每个 块的长度不超过 。 简化思路:不含 意味着连续的 最多两个,所以每个 -块是 或 ,后面必须跟 (除了末尾)。因此:
题3:用泵引理证明非正则
题目
证明集合 不是正则的。
解答
反证法:假设该集合是正则的,则存在 DFA 识别它,设 有 个状态。
取 (因为 )。由泵引理,,其中 ,且对所有 ,。
取 ,则 。要使 ,需要 (某个 )。
但 (因为 ),而 和 之间没有 的幂,矛盾!
因此该集合不是正则的。
题4:从 DFA 构造正则文法
题目
给定 DFA:,,,,,,,,。构造等价的正则文法。
解答
设 (起始符号)对应 , 对应 , 对应 。
转移对应产生式:
- ( 非接受):
- ( 非接受):
- ( 是接受):
- ( 非接受):
- ( 是接受):
- ( 是接受):
正则文法 ,其中 ,,产生式为 ,,。
题5:判断字符串是否属于正则集合
题目
判断字符串 是否属于以下正则集合:(a) ;(b) ;(c) 。
解答
(a) :以 开头,后跟任意多个 ,再跟任意多个 。 以 开头, 部分为 ""(一个 ), 部分为 ""(两个 )。属于。
(b) :以任意多个 开头,后跟若干块(每块为 或 )。 不以 开头, 部分为空串。剩余 "" 需要分解为 和 的连接:。属于。
(c) :以 开头,后跟若干 块,再跟任意多个 。,其中 部分为 "", 部分为 ""。属于。
解题思路提示
语言识别问题的解题方法论:
- 描述正则集合:从内到外分析正则表达式的结构,先理解基础部分,再理解运算效果
- 构造正则表达式:分析目标语言的结构特征,选择合适的基础块和运算组合
- 用泵引理证非正则:选择足够长的字符串,利用鸽巢原理找到可”泵”的循环,导出矛盾
- 文法与自动机的互转:状态对应非终结符,转移对应产生式,接受状态对应终结产生式
五、视频学习指南
视频资源
六、教材原文
教材原文
“The regular expressions over a set are defined recursively by: the symbol is a regular expression; the symbol is a regular expression; the symbol is a regular expression whenever ; the symbols , , and are regular expressions whenever and are regular expressions.”
“A set is regular if and only if it is recognized by a finite-state automaton.”
“A set is generated by a regular grammar if and only if it is a regular set.”
“Suppose that this set were regular. Then there would be a nondeterministic finite-state automaton recognizing it… This contradiction shows that is not regular.”
—— Rosen, Section 13.4, pp. 917-925
参见 Wiki
- 递归定义 — 正则表达式的递归定义(第5章)