“$L$ 是正则语言,当且仅当 $\equiv L$ 的等价类个数有限;”
形式陈述 ​
语言
这是一个存在性定义:给出的某台自动机可以有不可达状态或重复状态,只要至少有一台有限 DFA 识别
由Kleene 定理与 DFA–NFA 等价,以下描述刻画同一类语言:DFA、NFA、ε-NFA、经典正则表达式和右线性文法。Myhill–Nerode 定理又给出不依赖某个表示的语义刻画:
“正则”因此是语言的性质,不是某段 regex 文本或某张状态图的外观。一个表达式可能写得极长,一台 DFA 也可能远非最小;这些现象影响表示复杂度,不影响
直觉
读完前缀
正则语言擅长有限记忆:是否见过某个标记、当前位置处于有限协议的哪一阶段、计数模固定常数的余数、最近若干字符形成什么后缀。它不擅长无界配对:任意深度的括号、两段长度精确相等、后半段复制前半段。分界不在输入是否很长,而在决定未来时需要保留的信息种类是否有固定上界。
有限自动机中的环解释了正则语言为何可以无限。机器每次回到同一状态,就可以再次处理相似片段;它无需记住环走了多少圈,只需知道当前未来行为没有改变。星号与自动机环正是同一有限记忆现象的代数和图形两种表达。
例子与边界
典型 ASCII 标识符语言由“首字符是字母或下划线,后续字符是字母、数字或下划线”组成。扫描器只需区分起点、已进入合法标识符、已经失败三种情况,不必保存标识符内容,因此该语言正则。保留具体文本供符号表使用是后续处理,不属于判断词法形状所需的控制状态。
包含固定字节模式 \r\n\r\n 的输入也正则。自动机只需记当前后缀与目标模式前缀重合到多长;模式固定时,可能长度有限。即使输入有数 GB,状态数也不随之增长。
语言
不是正则语言,因为读取左括号后必须保留无界深度,才能核对后续右括号。若产品规范把最大嵌套深度固定为 32,它反而成为正则语言:状态可以记录
每个有限语言都是正则语言,可以为所有字建立前缀树并把未匹配输入送入死状态;无限语言也完全可能正则,例如
实际 regex 引擎也不能反向定义正则类。回溯、捕获和匹配优先级属于实现语义;反向引用等扩展甚至能描述非正则语言。判断一个模式的理论性质时,应先把它还原到明确的经典构造。
推论与应用
正则语言拥有稳定的构造与判定工具。它们对有限布尔运算、连接、星、反转、同态与逆同态封闭;给定 DFA 后,成员资格可在线线性扫描,空性可做可达性搜索,有限性可检查初态到接受态路径上是否存在可重复环,等价与包含可化为乘积图上的空性。
闭包性质负责安全地组合已有识别器;DFA 最小化给同一语言找到状态最少的规范表示;泵引理和 Myhill–Nerode 则从有限记忆的必然后果出发证明某些语言不正则。三类工具分别回答“怎样构造”“怎样压缩”和“为什么做不到”。
持续系统的无限轨迹属于
参考资料
- Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013, §§1.1–1.4.
- John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006, Chapters 2–4.