Skip to content

Brzozowski 导数

Brzozowski derivative

语言或正则表达式对首字符的剩余,表示读入给定前缀后仍可接受的后缀集合。

条目类型
定义

形式陈述

语言 LΣ 对字母 a 的左导数定义为 a1L={w:awL},对字 u 迭代得到 u1L。正则表达式导数满足 Da(R+S)=Da(R)+Da(S)Da(RS)=Da(R)S+ν(R)Da(S)Da(R)=Da(R)R,其中 ν(R) 表示 εL(R)。关键判据是 wL(R) 当且仅当 εL(Dw(R))

直觉

把正则表达式看成“尚待匹配的语言”,导数便是从语言中“剥离”已经读掉的前缀后,为了最终接受而仍可读取的后缀语言。匹配过程因而不必维护当前位置或回溯栈,只需反复把语言本身向前推进;不同前缀若产生同一剩余语言,就对应同一个 DFA 状态。关键在于导数是语义运算,而不是简单删掉表达式开头的字符:并、连接和 Kleene 星号都要按可空性规则传播。

正则式导数逐字匹配
例子与边界

R=(ab)Da(R)=b(ab),再对 b 求导回到 (ab)。对表达式做代数化简后,可达的不同导数只有有限多个,从而直接构造 DFA。若不做等价化简,语法上不同但语言等价的导数可能无限膨胀;“有限”指正则语言的不同左商有限,不保证朴素表达式表示自动保持小规模。

R=(a|b)abb。读入第一个字符 a 后,Da(R) 描述所有能接在这个 a 后面、使整串仍匹配 R 的后缀;继续对输入逐字符求导,最终表达式可空当且仅当原串被接受。以 R=ab|ac 为更小的例子,有 Da(R)=b|cDb(Da(R))=ε,所以 ab 被接受,而 Dd(Da(R))=,所以 ad 被拒绝。

导数的语法表示可能迅速膨胀,例如交换律、幂等律下等价的并表达式会产生许多不同写法。实际构造需要规范化或按语言等价合并状态;若把“表达式文本相同”误当作“语言相同”,得到的自动机通常远大于必要规模。

推论与应用

导数为正则表达式匹配、等价检查和 DFA 构造提供统一方法,尤其适合函数式实现、符号字母表和按需生成状态的匹配器。反复求导并对等价导数做商,可以从 正则表达式 直接构造 DFA,给出 Kleene 定理的一条算法化证明路径。增量词法分析也可每读一个字符就更新当前残余语言,并用可空性判断是否已形成完整 token;与 确定化构造 相比,这种做法把状态生成推迟到实际可达的残余语言上。

参考资料
  • Janusz A. Brzozowski, Derivatives of Regular Expressions, Journal of the ACM 11(4), 1964,pp. 481–494。
  • John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006,Chs. 1–9。
关系图谱5 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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