相关笔记: 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. 正则表达式的等价变换

正则表达式的恒等式

以下恒等式对任意正则表达式 成立:

恒等式说明
是并的幺元
是连接的零元
是连接的幺元
闭包的幂等性
并的交换律
连接对并的分配律
并对连接的分配律
连接的结合律
闭包的展开

正则表达式化简技巧

化简正则表达式时常用以下策略:

  1. 利用 消除含 的连接
  2. 利用 消除冗余的
  3. 利用 简化嵌套闭包
  4. 利用分配律展开或合并表达式

3. Kleene 定理

Kleene 定理(Kleene's Theorem)

一个集合是正则的当且仅当它可以被有限状态自动机识别。

即:正则集合 有限状态自动机识别的语言。

证明思路(正则 DFA 可识别): 由于正则表达式是递归定义的,只需证明以下六点:

  1. 可被 NFA 识别(无接受状态的自动机)
  2. 可被 NFA 识别(起始状态即为接受状态,无转移)
  3. 可被 NFA 识别(起始状态经 到接受状态)
  4. 可被识别,则 可被识别(串联两个自动机)
  5. 可被识别,则 可被识别(并联两个自动机,加新起始状态)
  6. 可被识别,则 可被识别(加新起始状态,从接受状态回到起始状态)

由于 NFA 与 DFA 等价(13.3 节定理 1),以上均可转化为 DFA。

用 Kleene 定理构造自动机

构造识别正则集合 的 NFA。

步骤

  1. 先构造识别 的 NFA(识别 的自动机加 Kleene 闭包构造)
  2. 再构造识别 的 NFA(识别 和识别 的自动机串联)
  3. 最后用并集构造将两者合并(加新起始状态,-转移分别指向两者)

注意:这种构造方法不产生最简自动机。 可以用一个更简单的 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)

题2:构造正则表达式

题目

用正则表达式描述以下集合:(a) 恰好含一个 的位串;(b) 以 结尾且不含 的位串。

题3:用泵引理证明非正则

题目

证明集合 不是正则的。

题4:从 DFA 构造正则文法

题目

给定 DFA:。构造等价的正则文法。

题5:判断字符串是否属于正则集合

题目

判断字符串 是否属于以下正则集合:(a) ;(b) ;(c)

解题思路提示

语言识别问题的解题方法论:

  1. 描述正则集合:从内到外分析正则表达式的结构,先理解基础部分,再理解运算效果
  2. 构造正则表达式:分析目标语言的结构特征,选择合适的基础块和运算组合
  3. 用泵引理证非正则:选择足够长的字符串,利用鸽巢原理找到可”泵”的循环,导出矛盾
  4. 文法与自动机的互转:状态对应非终结符,转移对应产生式,接受状态对应终结产生式

五、视频学习指南

视频资源

资源链接对应内容备注
Rosen 8e Section 13.4教材原文完整定义、定理与例题英文教材
Neso Academy - Regular Expressions链接正则表达式基础英文,适合入门
Neso Academy - Kleene’s Theorem链接Kleene 定理与证明英文
Neso Academy - Pumping Lemma链接泵引理及其应用英文

六、教材原文

教材原文

“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章)

计算建模