Skip to content

正则语言

Regular language

存在有限状态识别器的有限字语言,也就是只需固定有限种前缀摘要即可判断的语言。

条目类型
定义

形式陈述

语言 LΣ 称为正则语言,当且仅当存在某台DFA M 使

L=L(M).

这是一个存在性定义:给出的某台自动机可以有不可达状态或重复状态,只要至少有一台有限 DFA 识别 L,正则性就成立。状态名称、图布局和具体编码不会改变语言是否正则。

Kleene 定理与 DFA–NFA 等价,以下描述刻画同一类语言:DFA、NFA、ε-NFA、经典正则表达式和右线性文法。Myhill–Nerode 定理又给出不依赖某个表示的语义刻画:L 正则,当且仅当它的不同右商只有有限多个。

“正则”因此是语言的性质,不是某段 regex 文本或某张状态图的外观。一个表达式可能写得极长,一台 DFA 也可能远非最小;这些现象影响表示复杂度,不影响 L 是否落在正则类中。

直觉

读完前缀 x 后,识别器只需知道后续哪些字还能使 xz 落入 L。若所有前缀能够按这种未来行为归入有限多类,就可用一个状态代表一类;反之,若不断出现需要区别的新前缀,任何固定状态集都会过早遗忘信息。

正则语言擅长有限记忆:是否见过某个标记、当前位置处于有限协议的哪一阶段、计数模固定常数的余数、最近若干字符形成什么后缀。它不擅长无界配对:任意深度的括号、两段长度精确相等、后半段复制前半段。分界不在输入是否很长,而在决定未来时需要保留的信息种类是否有固定上界。

有限自动机中的环解释了正则语言为何可以无限。机器每次回到同一状态,就可以再次处理相似片段;它无需记住环走了多少圈,只需知道当前未来行为没有改变。星号与自动机环正是同一有限记忆现象的代数和图形两种表达。

例子与边界

典型 ASCII 标识符语言由“首字符是字母或下划线,后续字符是字母、数字或下划线”组成。扫描器只需区分起点、已进入合法标识符、已经失败三种情况,不必保存标识符内容,因此该语言正则。保留具体文本供符号表使用是后续处理,不属于判断词法形状所需的控制状态。

包含固定字节模式 \r\n\r\n 的输入也正则。自动机只需记当前后缀与目标模式前缀重合到多长;模式固定时,可能长度有限。即使输入有数 GB,状态数也不随之增长。

语言

{(n)n:n0}

不是正则语言,因为读取左括号后必须保留无界深度,才能核对后续右括号。若产品规范把最大嵌套深度固定为 32,它反而成为正则语言:状态可以记录 032 的当前深度,再加一个溢出/错误状态。理论边界取决于约束是否真正固定,而不是业务上“通常不会太深”。

每个有限语言都是正则语言,可以为所有字建立前缀树并把未匹配输入送入死状态;无限语言也完全可能正则,例如 0。因此语言的基数不是判据。泵引理或 Myhill–Nerode 证明的是无界信息需求,而不是简单宣称“集合无限所以不正则”。

实际 regex 引擎也不能反向定义正则类。回溯、捕获和匹配优先级属于实现语义;反向引用等扩展甚至能描述非正则语言。判断一个模式的理论性质时,应先把它还原到明确的经典构造。

推论与应用

正则语言拥有稳定的构造与判定工具。它们对有限布尔运算、连接、星、反转、同态与逆同态封闭;给定 DFA 后,成员资格可在线线性扫描,空性可做可达性搜索,有限性可检查初态到接受态路径上是否存在可重复环,等价与包含可化为乘积图上的空性。

闭包性质负责安全地组合已有识别器;DFA 最小化给同一语言找到状态最少的规范表示;泵引理和 Myhill–Nerode 则从有限记忆的必然后果出发证明某些语言不正则。三类工具分别回答“怎样构造”“怎样压缩”和“为什么做不到”。

持续系统的无限轨迹属于 Σω。相应的 ω-正则语言以 Büchi 等接受条件描述“运行中无限反复发生什么”,不在读完后检查终态。有限字与无限字模型都使用有限控制,但论域和接受量词不同。

参考资料
  • 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.
关系图谱8 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组