上下文无关语言的性质

官方信息技术老师·27 页·深入(追求细节与边界)·0 次浏览·2 天前
形式语言计算理论泵引理可判定性

上下文无关语言的性质

穿透 CFL 的能力边界:泵引理、封闭性、可判定性,一次搞透

按 空格/→ 演示下一步

1 / 27 页

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

形式语言计算理论泵引理可判定性

上下文无关语言的性质

穿透 CFL 的能力边界:泵引理、封闭性、可判定性,一次搞透

1第 1 页 · 上下文无关语言的性质

CFL的必要条件回顾

我们已经认识了两类机器——DFA 只能沿输入带前进,PDA 多了一个可推可弹的栈。既然 PDA 是「带栈的升级版」,那原来 DFA 能做的事,PDA 还能做吗?

正则 ⊆ CFL
每个正则语言都是上下文无关语言
DFA 是 PDA 特例
DFA 可视为「栈永不动」的 PDA
正则式 → CFG
任何正则表达式都能机械改写为 CFG
反向严格失败
{aⁿbⁿ} 是 CFL 但不是正则语言
带便签本做题的学生对应 →PDA 模拟 DFA

学生有「超能力」但可以选择不用,至少做不出原来能做的题

LREGLCFLL_{REG} \subsetneq L_{CFL}
2第 2 页 · CFL的必要条件回顾

泵引理的核心思想

上一页梳理了CFL的必要条件,但满足必要条件≠是CFL。要一锤否定一个语言不是CFL,需要泵引理。它为什么能做到?核心藏在语法树的「高度」上。

前提:语法有限
CFG只有有限多个变量,是后面所有推论的根基,不会随串长增长。
长串逼出深树
串越长,语法树越高——叶子太多装不下,路径只能拉长。
深路必有重复
根到叶路径长度超过变量数,鸽笼原理保证至少一个变量出现两次。
重复即可泵
同一变量推导出的子串可以再嵌入一次,新串仍合法——这就是「泵」。
层级太深的组织架构对应 →高度过大的语法树

岗位就那几个,层级多了同一岗位必然在两条层级链上重复出现

uvnxynzL, n0uv^nxy^nz \in L,\ \forall n \geq 0
3第 3 页 · 泵引理的核心思想

泵引理的形式化表述

泵引理把CFL的「能拆能泵」拆成五个变量和一个保证。

1
存在泵长度 p
若L是CFL,必存在常数p(泵长度),只跟L本身有关
2
任取长串 s
在L中挑任何|s|≥p的串s;不够长就没有可泵的中间段
3
切成五段
把s拆成u·v·x·y·z,两头贴边,中间三段才是泵的对象
4
两个尺寸约束
①|vxy|≤p,中间三段不能太长;②|vy|≥1,v和y至少一段非空
5
任意泵仍属L
③对所有i≥0,u·vⁱ·x·yⁱ·z仍在L里——泵多少次都不脱队
4第 4 页 · 泵引理的形式化表述

泵引理的图示解释

树形结构视角:证明存在重复的变量推导

泵引理的图示解释
树形结构视角:证明存在重复的变量推导
5第 5 页 · 泵引理的图示解释

用泵引理证明非CFL

用泵引理证非CFL,分三步完成反证。

1
反证假设
假设L是CFL,由泵引理得到泵长度p
2
构造字符串
选s∈L、|s|≥p,结构上让任何泵浦失效
3
导出矛盾
|vxy|≤p限制位置,泵i后串必掉出L
6第 6 页 · 用泵引理证明非CFL

泵引理证明实例:anbncn

python

把泵长 p 直接设成 n,穷举候选串 aⁿbⁿcⁿ 的合法泵分拆并检查 i=0。

代码高亮加载中…

令 n=p 后,三个符号块都达到长度上界;程序穷举 u、v、w、x、y。删去 v、x 后字符计数不可能相等,因此任意正整数 p 都不是泵长度。

7第 7 页 · 泵引理证明实例:anbncn

泵引理自测

点击作答

关于「任意非上下文无关语言都能用泵引理证明它不是 CFL」这一论断,下列分析正确的是?

8第 8 页 · 泵引理自测

闭包性概述

泵引理判定『不是 CFL』,是排除法。换个角度:对 CFL 做某个运算,结果仍属于 CFL 吗?这就是闭包性问题,也是正则语言与 CFL 区别最显眼的地方。

闭包性
对语言做某种运算后,结果仍属于原语言类
正则语言全封闭
并、交、补、差、连接、星号全部保持正则
CFL部分封闭
并、连接、星号、逆转保持 CFL;代换、同态亦封闭
CFL对交/补不封闭
两个 CFL 相交或取补,结果可能跳出 CFL
两份各自合法的菜单对应 →两个 CFL 的交集

各自点菜都行;但找『两份菜单共同的菜』,反而可能凑不出

L1={anbnc},  L2={abncn}L1L2={anbncn}CFLL_1=\{a^n b^n c^*\},\; L_2=\{a^* b^n c^n\} \Rightarrow L_1\cap L_2=\{a^n b^n c^n\} \notin CFL
9第 9 页 · 闭包性概述

闭包性全景图

看图:从左侧 CFL 输入出发,经五种操作后全部汇入「结果仍为 CFL」——五条路径全封闭。

图解渲染中…
O4h 为同态:把每个字母替换成字符串O5h⁻¹ 为逆同态:取原象的运算
10第 10 页 · 闭包性全景图

并集闭包的构造证明

证明并集封闭的关键一招:让一个新符号同时牵出两套文法。

1
明确两个已知文法
设 G1=(V1,Σ1,R1,S1)和 G2=(V2,Σ2,R2,S2)分别生成 L1、L2
2
引入新起始符 S
挑一个不属于 V1∪V2 的符号 S,避免和原有符号混用
3
加歧义式 S→S1|S2
让 S 可以选择从 S1 或 S2 启程,两路并联任挑一条
4
合并并验证等价
并集全部产生式,新文法语言 L=G 等于 L1∪L2,双向证
11第 11 页 · 并集闭包的构造证明

连接与Kleene星闭包

连接与星闭包都靠构造新文法:把已有产生式稍作改造,就能让新文法产生拼接或迭代后的语言。

1
准备两个文法
已有 G1 生成 L1、G2 生成 L2,各有开始符号 S1、S2 和各自的产生式集
2
构造拼接文法
新增开始符号 S,加产生式 S → S1S2,合并两份产生式集
3
验证拼接结果
S 先推 S1S2,再分别走 G1、G2 推导,恰好生成 L1·L2
4
切换到迭代思路
星闭包要求拼接 L1 任意次:0 次、1 次、n 次都要支持
5
构造星闭包文法
加 S → S1S(继续递归拼接)和 S → ε(随时停),合并 G1 的产生式
12第 12 页 · 连接与Kleene星闭包

CFL不封闭的运算

交运算与补运算:CFL的边界在哪里

CFL不封闭的运算
交运算与补运算:CFL的边界在哪里
13第 13 页 · CFL不封闭的运算

闭包性质自测

点击作答

设L1={a^n b^n c^m | n,m≥1}, L2={a^m b^n c^n | n,m≥1}。L1∩L2仍是CFL吗?

14第 14 页 · 闭包性质自测

同态的定义

闭包自测里我们用过并、连接、星这些 CFL 封闭的运算。还有一类更强的运算——同态:把每个符号替换成一段字符串,结果仍是 CFL。先把定义钉牢。

符号层映射
同态 h 把字母表 Σ 中每个符号 a 单独映射为某字符串 w ∈ Γ*
串的扩展
h(a₁a₂…aₙ) = h(a₁)h(a₂)…h(aₙ),按顺序逐符号替换再拼接
语言的作用
h(L) = {h(w) | w ∈ L},把 L 中每个串做替换并收集所有结果
查字典逐字翻译对应 →同态映射

每个英文字母对应一段译文,整词按字母顺序逐个查表再拼起来

h(a1a2an)=h(a1)h(a2)h(an)h(a_1 a_2 \cdots a_n) = h(a_1) h(a_2) \cdots h(a_n)
15第 15 页 · 同态的定义

同态保持CFL的证明

通过三步构造,把CFL在同态下的像也写成CFL。

1
取原CFL文法
已知G产生L,列全产生式,标记终结符a
2
构造新文法G′
把终结符a替换为h(a),终结符变产生式
3
验证等价
归纳证明L(G′)=h(L),闭合命题
16第 16 页 · 同态保持CFL的证明

逆同态的定义

上页把 CFL 沿 h 正向送出,得到仍是 CFL 的 h(L);现在站到输入端,反查哪些原串的像会落进 L。

集合定义
设 L⊆Δ*,只保留满足 h(w)∈L 的 w,得到 Σ* 上的语言。
纤维整体性
若 h(a)=h(b),则 a、b 在 h⁻¹(L) 中要么都在,要么都不在。
非函数意义
h 不必单射或满射;h⁻¹ 表示取集合的逆像,而不是函数 h 的逆。
仓库扫描条码对应 →语言取逆像

扫入目标条码组的所有包裹,就是这组条码的逆像;相同条码的包裹成组保留。

h1(L)={wΣh(w)L},LΔh^{-1}(L)=\{w\in\Sigma^*\mid h(w)\in L\},\quad L\subseteq\Delta^*
17第 17 页 · 逆同态的定义

逆同态保持CFL的证明

构造一台PDA,用非确定性逐符号模拟h(x)的展开,让栈操作与原PDA同步。

1
读入符号a
P'从输入串x读一个符号a
2
非确定选串
在h(a)里猜一个子串w=w₁w₂…wₖ
3
逐字符送入
把wᵢ逐个喂进P的转移函数模拟
4
栈操作同步
P'的栈与P的栈状态一一对应
18第 18 页 · 逆同态保持CFL的证明

同态应用实例

python

用 Python 演示 h(a)=01、h(b)=10 对 L={aⁿbⁿ} 的逐字符替换过程。

代码高亮加载中…

字典 H 给出同态映射;h 函数逐字符查表拼接;循环把 L 中每个串变成 (01)ⁿ(10)ⁿ,结果仍由 CFG 产生。

19第 19 页 · 同态应用实例

CFL与正则语言的交

前面闭包性把问题变成一个现场:让 PDA 抱着栈经过有限状态门禁,筛选之后,栈结构还在吗?

同步模拟
让 CFL 的 PDA 与 RL 的 DFA 同步运行;PDA 的 ε 步不改变 DFA 状态
配对状态
新状态是二元组 (PDA 状态, DFA 状态),栈仍按 PDA 转移读写
共同接受
输入符号到来时按两边转移配对;两边都满足各自接受条件时接收
意义与边界
正则筛子保留 CFL 的栈结构;换成一般 CFL 时,交集未必仍是 CFL
抱文件夹过门禁对应 →CFL 与 RL 取交

PDA 像抱着的文件夹,DFA 像门禁规则;两边都放行才接收。

LRCFL(LCFL, RReg)\mathcal{L}\cap R\in\mathrm{CFL}\quad(\mathcal{L}\in\mathrm{CFL},\ R\in\mathrm{Reg})
20第 20 页 · CFL与正则语言的交

PDA与DFA的乘积构造

图分三行读:上行 PDA 带栈、中行 DFA 无栈、下行是两机的乘积。读同一符号时两机同步转移。

图解渲染中…
e乘积态(p,d):两机状态配对,栈沿用 PDA 分量cDFA 分量:只读输入符号,从不查栈bPDA 转移后:栈顶 X 弹出,新栈顶为 Y
21第 21 页 · PDA与DFA的乘积构造

CFL的判定性问题

前面花了不少篇幅在构造证明——构造 PDA、文法,证明 CFL 满足或不满足某些性质。现在换个角度:给定一个 CFG,能用算法回答它哪些问题?这一页聚焦三大经典判定。

成员性
判断 w∈L(G)。可判定,把 G 转 CNF 后用 CYK 算法 DP,自底向上填表,O(n³)
空性
判断 L(G)=∅。可判定,反复标记能推出终结符串的非终结符,看 S 是否被标记
有限性
判断 |L(G)|<∞。可判定,检依赖图中是否有「可达且产出终结符」的环
翻一本词典对应 →CFL 三大判定

成员性=查某词在不在;空性=词典是否全空;有限性=收录词数是否有限

22第 22 页 · CFL的判定性问题

成员性问题的CYK算法

先化简语法,再自底向上填表,看起始符能否推出整个串。

1
化为CNF
把CFG所有产生式改造为A→BC或A→a
2
设计表格
X[i,j]记录能推出第i到j字符的非终结符集合
3
填长度1
长度为1的子串:由A→a直接填入对应非终结符
4
逐长递增
长度L子串:由A→BC枚举切分点合并两半推导结果
5
判定结果
若起始符S出现在X[1,n]中则接受,否则拒绝
23第 23 页 · 成员性问题的CYK算法

CFL vs CSL:判定性对比

CSL 比 CFL 表达力更强,但更强的是存储与改写能力,并非成员性判定;真正边界出现在空性和有限性。

CFL / PDA
  • 成员性:CYK,可在多项式时间判定
  • 空性:是否至少生成一个串,可判定
  • 有限性:是否含无限多个串,可判定
  • 模型:CFG 生成语言,PDA 接收语言
CSL / LBA
  • 成员性:搜索有限配置图,可判定
  • 空性:是否存在接受计算,不可判定
  • 有限性:是否含无限多个串,不可判定
  • 模型:CSG 生成语言,LBA 接收语言
判单个串时两者都可选;判整门语言的空性或有限性时,CFL 可判定,CSL 均不可判定。
24第 24 页 · CFL vs CSL:判定性对比

判定性质综合测试

点击作答

下列关于上下文无关语言(CFL)判定问题的说法,哪一项正确?

25第 25 页 · 判定性质综合测试

CFL性质全景总结

  • 泵引理是必要条件,不是充分判据
  • 并、连接、星号及同态、逆同态均保持CFL
  • CFL与正则语言交仍为CFL;一般CFL的交不必CFL
  • CYK判定成员性;空性也可判定,但等价性等不可判定
延伸主题:构造CFL泵引理反例演练CYK算法了解上下文相关语言
26第 26 页 · CFL性质全景总结

深入思考题

课后花十分钟独立思考这三个问题,再对照参考答案——有些结论比直觉更微妙。

1为什么泵引理只是CFL的必要条件而非充分条件?能不能想到一个满足泵引理但不是CFL的语言?

参考答案泵引理只刻画CFL'必须满足'的性质,不刻画'满足的就是CFL'。存在满足泵引理但涉及交叉依赖的语言不是CFL——这正是Ogden引理要补的漏洞。

2面对一个你从未见过的运算,你如何判断CFL对它是否封闭?什么迹象提示该走'反例'而非'构造'路线?

参考答案先看直觉:运算若'保持结构',尝试构造PDA修改版本;若'产生交叉依赖',用泵引理找反例。关键信号是长度关系是否被改变。

3标准的泵引理在证明某些语言不是CFL时'力不从心'——问题出在哪?如果要改进它,你会朝什么方向动手?

参考答案标准泵引理要求串中所有字符都可泵,但很多非CFL的'病态'集中在少数位置。改进方向:允许只标记'重要位置',在更细粒度上施加泵约束——这正是Ogden引理的思路。

27第 27 页 · 深入思考题
上下文无关语言的性质 · 知识图解