正则文法和正则语言
从产生式出发,厘清推导过程,掌握正则语言的边界与等价证明
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
正则文法和正则语言
从产生式出发,厘清推导过程,掌握正则语言的边界与等价证明
为什么需要形式文法
正则语言能描述固定模式,但「我看见你用望远镜」至少两种合法切分——自然语言的歧义超出了正则的承受范围。
法条把行为边界写死,文法把句子边界写死,执行方都按同一规则判定
文法的形式定义
上页我们说,没有形式化就只能凭语感。这页给「形式文法」一个严格的数学骨架——四元组 G = (V, T, P, S)。四个分量各司其职,少一个就无法精确刻画语言。
食材=T、半成品=V、步骤=P、菜品名=S,缺一不可
Chomsky 文法体系
自上而下逐层加约束,约束越多能力越弱;四层语言类嵌套包含:3 ⊂ 2 ⊂ 1 ⊂ 0。
推导与派生树
最左推导、最右推导与语法树
线性文法的定义
从派生树的形态看,3 型文法对应的树最瘦——每个内部节点至多只有两个子节点。这个直观特征背后,是产生式右部「至多含一个非终结符」的硬约束。先把这条规则钉死。
一人紧跟一人往前走,无法同时排进两支队伍——链再长也不分叉
左线性 vs 右线性
左线性与右线性生成的语言完全相同,但产生式形态和推导方向像镜像——容易混淆,一页辨清。
- 产生式:A → Bα(非终结符在右部左端)
- 推导:末端先确定,串从右往左构造
- 派生树:自顶向下、从右向左生长
- 对应自动机:右往左扫描的NFA
- 产生式:A → αB(非终结符在右部右端)
- 推导:前端先确定,串从左往右构造
- 派生树:自顶向下、从左向右生长
- 对应自动机:左往右扫描的DFA/NFA
线性文法与上下文无关文法
左线性、右线性强制递归只能贴在一端。但 aⁿbⁿ 这类嵌套结构要求非终结符夹在中间——必须把限制放宽,这就是上下文无关文法。
套娃大套小再套小,对应 S→aSb 的递归嵌套;线性文法只能从最外或最内开始,无法把递归变量塞到中间
正则文法的定义
上页我们区分了左线性与右线性的形态差别。现在给出正则文法的严格定义,看它到底产生什么样的语言——也就是我们要找的「正则语言」这个语言类。
状态 A 读 a 转移到 B,恰对应一步推导 A ⇒ aB
正则表达式基础
线性文法造出正则语言,那语言之间怎么运算?三种基本操作——并、连接、闭包——就能由小拼大。
并=同色块混用;连接=先拼 A 再拼 B;闭包=同款积木重复堆任意层
正则表达式的构造
用 Python 把右线性文法 S→aA|a, A→bA|b 一步步化简为正则表达式 a b*, 并用 re 模块验证。
四步构造: 产生式列方程 → Arden 引理解递归项 → 回代并用 b+ + ε = b* 化简 → re.fullmatch 双端锚定验证正反例, 得 L(G)=ab*。
正则文法与有限自动机
G ⟺ NFA:每个产生式对应一条状态转移,反向亦然;两者刻画同一正则语言 L。
泵引理与正则语言封闭性
正则文法、自动机、正则表达式殊途同归,描述同一类语言。但遇到陌生语言,怎么证明它不是正则的?两个正则语言做并、交、补,结果还是正则的吗?
路口=p 个状态;过同路口=状态重复;中间路可重复走=泵
正则语言 vs 上下文无关语言
正则语言是 CFL 的严格子集,但很多人误以为能力差不多,边界案例最容易踩坑。
- 识别器:DFA/NFA,无额外存储
- 无法表达 {aⁿbⁿ} 这类嵌套结构
- 泵引理:|xy|≤n 且 |y|≥1 即可
- 对并、交、补、连接、Kleene 星都封闭
- 识别器:PDA,比 FA 多一个栈
- 可表达 aⁿbⁿ、回文等嵌套结构
- 需 Ogden 引理,条件更细致
- 对交和补都不封闭!关键边界
积自动机的概念
判一个语言是否正则,单台DFA就够;但要证正则语言对交集、并集封闭,得把两台DFA「叠」成一台同步跑的机器。这一页就来构造这种积自动机。
各人守住自己的格子,合起来就是一组「联合坐标」
积自动机的构造过程
从两个 DFA 出发,沿箭头看构造的五步流水线:五元组 → 笛卡尔积 → 转移 → 初/终态 → 交集识别。
积自动机实例演示
以两个简单 DFA 为例,演示积自动机的完整构造——从状态对到转移再到终态确认。
积自动机的应用
上一页我们手工搭了一台积自动机,它到底有什么用?这页揭晓——它解决正则语言三大封闭运算中的交运算;并与补各有更简便的招数。
旅客过两关,两边都放行才算通过;状态对=两边各自的位置
正则文法知识地图
- ✓正则语言由文法、表达式、自动机三种方式等价刻画
- ✓泵引理划定能力边界,是证非正则的统一工具
- ✓左/右线性文法等价,仅派生方向相反
- ✓Chomsky层级中表达力递增,可判定性同步下降
- ✓积自动机把并/交/差运算转成可构造状态机
核心概念自测
以下关于正则语言的说法,哪个是正确的?
课后思考
先自己想,再看下面的参考答案。
参考答案两者都和有限自动机一一对应:右线性对应FA正向识别,左线性对应反向回溯。本质是同一种'有限状态记忆',只是方向相反。
参考答案正则:(ab)(a|b)*(ba);文法:S→abA,A→aA|bA|ba。要点:每个正则式都有等价正则文法,反之亦然。
参考答案不是。假设正则,取泵长度 p,串 aᵖbᵖ 在语言中。把前段 a 的子串泵出后,a 的个数改变而 b 不变,结果串不在 aⁿbⁿ 中,矛盾。