正则文法和正则语言

官方信息技术老师·21 页·深入(追求细节与边界)·0 次浏览·2 天前
形式语言自动机理论Chomsky 体系正则性质

正则文法和正则语言

从产生式出发,厘清推导过程,掌握正则语言的边界与等价证明

按 空格/→ 演示下一步

1 / 21 页

全部页面点击任意一页,跳回舞台从这页播放

形式语言自动机理论Chomsky 体系正则性质

正则文法和正则语言

从产生式出发,厘清推导过程,掌握正则语言的边界与等价证明

1第 1 页 · 正则文法和正则语言

为什么需要形式文法

正则语言能描述固定模式,但「我看见你用望远镜」至少两种合法切分——自然语言的歧义超出了正则的承受范围。

自然语言的歧义
同一句话常有多重合法解读,歧义可在词汇、句法、语义、语用各层产生
句法歧义经典例
「我看见你用望远镜」:(我用望远镜)看见你 / 我看见(你用望远镜)
机器无法容忍歧义
程序不会「猜」,歧义输入会让同一字符串走出不同执行路径,结果不可预测
形式文法的价值
用严格产生式圈定「合法句子」的边界,让机器有唯一可循的结构规则
法律条文对应 →形式文法

法条把行为边界写死,文法把句子边界写死,执行方都按同一规则判定

2第 2 页 · 为什么需要形式文法

文法的形式定义

上页我们说,没有形式化就只能凭语感。这页给「形式文法」一个严格的数学骨架——四元组 G = (V, T, P, S)。四个分量各司其职,少一个就无法精确刻画语言。

V:非终结符集
推导过程中可被替换的符号,代表语法范畴或「中间状态」
T:终结符集
推导到头会停在这上面,是构成实际句子的最小原子
P:产生式集
形如 α→β 的重写规则,规定哪些符号串可换成哪些
S:开始符号
推导起点,必须属于 V,是被选出来首先展开的那个
V∩T=∅
非终结符与终结符互不相交,符号身份必须泾渭分明
做菜菜谱对应 →形式文法 G

食材=T、半成品=V、步骤=P、菜品名=S,缺一不可

G=(V,T,P,S)G = (V, T, P, S)
3第 3 页 · 文法的形式定义

Chomsky 文法体系

自上而下逐层加约束,约束越多能力越弱;四层语言类嵌套包含:3 ⊂ 2 ⊂ 1 ⊂ 0。

图解渲染中…
L3右线性或左线性,最受限L2左部必须为单个非终结符L1αAβ→αγβ,左部不长于右部L0产生式无任何限制,能力最强
4第 4 页 · Chomsky 文法体系

推导与派生树

最左推导、最右推导与语法树

推导与派生树
最左推导、最右推导与语法树
5第 5 页 · 推导与派生树

线性文法的定义

从派生树的形态看,3 型文法对应的树最瘦——每个内部节点至多只有两个子节点。这个直观特征背后,是产生式右部「至多含一个非终结符」的硬约束。先把这条规则钉死。

右部至多一个非终结符
A → α 中,α 含非终结符个数 ≤ 1,终结符数量不限
三种合法形式
A → w(无非终结符)、A → Bw、A → wB,w 是终结符串
左线性与右线性
非终结符只出现在右部左端是右线性,只出现在右端是左线性
禁止多非终结符并存
A → aBc 合法,A → aBCd 违法——右部两个非终结符会真正分叉
排队前进对应 →线性文法的推导链

一人紧跟一人往前走,无法同时排进两支队伍——链再长也不分叉

AwBwwB,wTA \to w \mid Bw \mid wB, \quad w \in T^*
6第 6 页 · 线性文法的定义

左线性 vs 右线性

左线性与右线性生成的语言完全相同,但产生式形态和推导方向像镜像——容易混淆,一页辨清。

左线性文法
  • 产生式:A → Bα(非终结符在右部左端)
  • 推导:末端先确定,串从右往左构造
  • 派生树:自顶向下、从右向左生长
  • 对应自动机:右往左扫描的NFA
右线性文法
  • 产生式:A → αB(非终结符在右部右端)
  • 推导:前端先确定,串从左往右构造
  • 派生树:自顶向下、从左向右生长
  • 对应自动机:左往右扫描的DFA/NFA
两者生成的语言类完全相同(都是正则语言)。教材默认用右线性,因为与DFA从左到右扫描的习惯天然吻合。
7第 7 页 · 左线性 vs 右线性

线性文法与上下文无关文法

左线性、右线性强制递归只能贴在一端。但 aⁿbⁿ 这类嵌套结构要求非终结符夹在中间——必须把限制放宽,这就是上下文无关文法。

上下文无关的含义
产生式左侧只能是一个非终结符,替换时不必关心它左右两边写的是什么
与线性文法的差异
线性文法规定右侧至多一个非终结符,CFG 不限数量也不限位置
严格的包含链
正则真包含于线性,线性真包含于上下文无关文法
经典反例 aⁿbⁿ
用 S→aSb|ε 可推出,但左/右线性文法无论怎么改都做不到
俄罗斯套娃对应 →CFG 嵌套递归

套娃大套小再套小,对应 S→aSb 的递归嵌套;线性文法只能从最外或最内开始,无法把递归变量塞到中间

SaSbεS \to aSb \mid \varepsilon
8第 8 页 · 线性文法与上下文无关文法

正则文法的定义

上页我们区分了左线性与右线性的形态差别。现在给出正则文法的严格定义,看它到底产生什么样的语言——也就是我们要找的「正则语言」这个语言类。

产生式右部形态
只能是终结符串+单个非终结符,或纯终结符串
形式记法
A → αB 或 A → α,其中 A,B∈V,α∈T*
ε-产生式受限
A→ε 仅当 A 不出现在任何产生式右侧
派生树退化
每个内部节点最多只有一个非终结符孩子
三类等价刻画
右线性文法、正则语言、有穷自动机是同一类
有穷自动机读字符串对应 →右线性文法的推导

状态 A 读 a 转移到 B,恰对应一步推导 A ⇒ aB

AαB 或 Aα(αT)A \to \alpha B \text{ 或 } A \to \alpha \quad (\alpha \in T^*)
9第 9 页 · 正则文法的定义

正则表达式基础

线性文法造出正则语言,那语言之间怎么运算?三种基本操作——并、连接、闭包——就能由小拼大。

并运算
两个语言的所有串合在一起取并集,记作 L₁ ∪ L₂
连接运算
L₁ 串后面接 L₂ 串,按顺序拼接,记作 L₁L₂
闭包运算
同一语言重复连接任意次(含零次),记作 L*
搭乐高积木对应 →正则语言三种运算

并=同色块混用;连接=先拼 A 再拼 B;闭包=同款积木重复堆任意层

L1L2={xxL1xL2}L1L2={xyxL1,  yL2}L=i=0LiL_1 \cup L_2 = \{x \mid x \in L_1 \lor x \in L_2\} \\ L_1 L_2 = \{xy \mid x \in L_1,\; y \in L_2\} \\ L^* = \bigcup_{i=0}^{\infty} L^i
10第 10 页 · 正则表达式基础

正则表达式的构造

python

用 Python 把右线性文法 S→aA|a, A→bA|b 一步步化简为正则表达式 a b*, 并用 re 模块验证。

代码高亮加载中…

四步构造: 产生式列方程 → Arden 引理解递归项 → 回代并用 b+ + ε = b* 化简 → re.fullmatch 双端锚定验证正反例, 得 L(G)=ab*。

11第 11 页 · 正则表达式的构造

正则文法与有限自动机

G ⟺ NFA:每个产生式对应一条状态转移,反向亦然;两者刻画同一正则语言 L。

图解渲染中…
g1右线性文法 G=(V,T,P,S),变量对应 NFA 状态m1NFA M=(Q,Σ,δ,q₀,F),状态对应文法变量l1两者识别的同一正则语言 L(G)=L(M)
12第 12 页 · 正则文法与有限自动机

泵引理与正则语言封闭性

正则文法、自动机、正则表达式殊途同归,描述同一类语言。但遇到陌生语言,怎么证明它不是正则的?两个正则语言做并、交、补,结果还是正则的吗?

泵引理
证明某语言非正则的核心工具
三条件
s=xyz;|xy|≤p;|y|≥1
泵操作
xy^i z ∈ L 对所有 i≥0 成立
反证使用
假设正则,找矛盾即证非正则
正则封闭运算
并、交、补、连接、星闭包保持正则
路口有限的小村走长路对应 →DFA 处理长串的环路

路口=p 个状态;过同路口=状态重复;中间路可重复走=泵

p1,sL,sp,x,y,z:s=xyz,xyp,y1,i0,xyizL\exists p \geq 1, \forall s \in L, |s| \geq p, \exists x,y,z: s=xyz, |xy| \leq p, |y| \geq 1, \forall i \geq 0, xy^iz \in L
13第 13 页 · 泵引理与正则语言封闭性

正则语言 vs 上下文无关语言

正则语言是 CFL 的严格子集,但很多人误以为能力差不多,边界案例最容易踩坑。

正则语言
  • 识别器:DFA/NFA,无额外存储
  • 无法表达 {aⁿbⁿ} 这类嵌套结构
  • 泵引理:|xy|≤n 且 |y|≥1 即可
  • 对并、交、补、连接、Kleene 星都封闭
上下文无关语言
  • 识别器:PDA,比 FA 多一个栈
  • 可表达 aⁿbⁿ、回文等嵌套结构
  • 需 Ogden 引理,条件更细致
  • 对交和补都不封闭!关键边界
需要计数对称或嵌套匹配 → 选 CFL;只是顺序重复或简单模式 → 正则就够。别被语法表象迷惑,看本质结构。
14第 14 页 · 正则语言 vs 上下文无关语言

积自动机的概念

判一个语言是否正则,单台DFA就够;但要证正则语言对交集、并集封闭,得把两台DFA「叠」成一台同步跑的机器。这一页就来构造这种积自动机。

状态空间
积的状态是Q₁×Q₂,两个原状态的笛卡尔积
同步转移
读到同一字符a,两边各自调各自的δ跳一步
起点与接受
起点取各自起点的配对;接受对决定识别集合
接受即语义
接受取F₁×F₂识别交集;(F₁×Q₂)∪(Q₁×F₂)识别并集
两人并排走同一条迷宫小径对应 →两台DFA同步读同一串输入

各人守住自己的格子,合起来就是一组「联合坐标」

δ((q1,q2),a)=(δ1(q1,a), δ2(q2,a))\delta((q_1,q_2),\,a) = (\delta_1(q_1,a),\ \delta_2(q_2,a))
15第 15 页 · 积自动机的概念

积自动机的构造过程

从两个 DFA 出发,沿箭头看构造的五步流水线:五元组 → 笛卡尔积 → 转移 → 初/终态 → 交集识别。

图解渲染中…
Dδ((p,q),a) = (δ1(p,a), δ2(q,a)),两机各跳再拼回F终态是笛卡尔积,必须两边同时接受GA = (Q1×Q2, Σ, δ, (q01,q02), F1×F2)
16第 16 页 · 积自动机的构造过程

积自动机实例演示

以两个简单 DFA 为例,演示积自动机的完整构造——从状态对到转移再到终态确认。

1
定义两个 DFA
给出 DFA₁ 与 DFA₂ 的完整五要素,各识别一种性质
2
构造状态对集
取 Q₁ × Q₂ 的笛卡尔积,每对 (p,q) 是同步快照
3
定义转移函数
δ((p,q), a) = (δ₁(p,a), δ₂(q,a)),两分量并行推进
4
确定初态与终态
初态 (q₁₀,q₂₀);终态取两分量都在各自终态的对
5
用串验证
取一个串分别跑两个 DFA 与积,确认同步接受行为
17第 17 页 · 积自动机实例演示

积自动机的应用

上一页我们手工搭了一台积自动机,它到底有什么用?这页揭晓——它解决正则语言三大封闭运算中的交运算;并与补各有更简便的招数。

交运算(主战场)
两个 DFA 同步逐字符推进,状态对 (q₁,q₂) 同时变化;两台都接受才接受
并运算(不用积)
加一个新初态与两条 ε 转移分别指向原初态,更简洁,无需状态组合
补运算(更简单)
对完整 DFA 把接受态集合换成其补集即可,一步到位
使用边界
NFA 须先确定化;补运算要求 DFA 完整,缺转移要先补死状态
机场两道安检门对应 →积自动机的交运算

旅客过两关,两边都放行才算通过;状态对=两边各自的位置

L1L2={wwL1 且 wL2}L_1 \cap L_2 = \{ w \mid w \in L_1 \text{ 且 } w \in L_2 \}
18第 18 页 · 积自动机的应用

正则文法知识地图

  • 正则语言由文法、表达式、自动机三种方式等价刻画
  • 泵引理划定能力边界,是证非正则的统一工具
  • 左/右线性文法等价,仅派生方向相反
  • Chomsky层级中表达力递增,可判定性同步下降
  • 积自动机把并/交/差运算转成可构造状态机
延伸主题:下推自动机与上下文无关文法最小DFA与状态最小化正则性判定与极小构造
19第 19 页 · 正则文法知识地图

核心概念自测

点击作答

以下关于正则语言的说法,哪个是正确的?

20第 20 页 · 核心概念自测

课后思考

先自己想,再看下面的参考答案。

1左线性文法和右线性文法生成的,为什么恰好是同一类语言?

参考答案两者都和有限自动机一一对应:右线性对应FA正向识别,左线性对应反向回溯。本质是同一种'有限状态记忆',只是方向相反。

2给你一个具体的字符串模式,比如「以 ab 开头、以 ba 结尾」,你能同时写出正则表达式和等价的右线性文法吗?

参考答案正则:(ab)(a|b)*(ba);文法:S→abA,A→aA|bA|ba。要点:每个正则式都有等价正则文法,反之亦然。

3aⁿbⁿ 是正则语言吗?如何用泵引理论证?

参考答案不是。假设正则,取泵长度 p,串 aᵖbᵖ 在语言中。把前段 a 的子串泵出后,a 的个数改变而 b 不变,结果串不在 aⁿbⁿ 中,矛盾。

21第 21 页 · 课后思考