下推自动机
搞懂 PDA 的栈机制与确定非确定模型的能力边界
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
下推自动机
搞懂 PDA 的栈机制与确定非确定模型的能力边界
FA vs PDA
FA 为什么处理不了 aⁿbⁿ?加一个栈就有了 PDA 的突破。
- 存储:仅有有限个状态,无额外存储
- 识别能力:正则语言(如 a*b*、(a|b)*)
- 经典边界:无法匹配成对出现的符号(aⁿbⁿ)
- 存储:状态 + 一个栈(后进先出)
- 识别能力:上下文无关语言(如 aⁿbⁿ、平衡括号)
- 经典边界:靠栈'计数'以匹配嵌套结构
餐厅取餐的类比
上次我们看到 FA 碰到 aⁿbⁿ 就放弃了。怎么办?给它加个'记忆托盘'——餐厅取餐台就是个活的例子。
新出锅的餐盘叠在顶上,取餐员只能拿最上面那个
PDA的三大组件
控制器居中调度,输入带只读不写,栈提供记忆;三者缺一PDA就无法工作。
七元组定义
上页把 PDA 拆成控制、输入、栈三大组件,但每个组件内部还有更具体的元素。下面用七元组 M=(Q,Σ,Γ,δ,q0,Z0,F) 把它们逐项固定下来。
Q=岗位、Σ=订单字符、Γ=盘子种类、δ=操作规则、q₀/F=起止
确定型与不确定型
上一页我们用七元组描述了 PDA 的结构,但它没有规定每一步能有多少选择。补上这条规则,就有了确定型与不确定型之分。
每个岔口派出分身,对应同一配置下并行尝试多条转移
转移函数详解
δ(q,a,X)的五种情况与符号约定
即时描述的定义
从前面讲完转移函数,自然问题是『某一步 PDA 到底是什么样』——就像看电影暂停。我们需要一个能完整描述当前瞬间状态的『快照』,叫即时描述。
画面里演员位置、台词进度、桌上道具,分别对应状态、剩余输入、栈内容
即时描述的图示
以aabb为例,展示PDA运行中(q,剩余输入,栈)快照的逐拍变化
PDA的计算过程
PDA如何接受一个串?答案是:从初始ID出发,沿⊢关系走出一条推导链,直到抵达接受ID。
空栈接受
上页 PDA 一口口吞完输入串,状态在变、栈在伸缩。现在问:怎么判它『接受』了?两种模式,先讲最干净的那种——空栈接受。
托盘全归位=栈清空,订单结清=接受
终态接受
上一页我们用'栈清空'来判断吃完——可 PDA 还给了另一种判法:只要走到某个指定状态,就算吃完。这就是终态接受。
人撞线就赢,手里的东西无关紧要
两种接受方式对比
PDA有两种判定"读完"的方式——看栈空还是看终态。形式不同但能力完全等价,这正是PDA理论的优雅之处。
- 读完后栈被清空即接受
- 终态集可为空,仅需起始符Z₀
- 任意PDA可构造等价终态PDA
- 读完后停在终态集即接受
- 终态集F非空,栈可留余
- 任意PDA可构造等价空栈PDA
PDA语言实例
用一段 Python 模拟展示 PDA 识别 {aⁿbⁿ} 的全过程与边界拒绝。
读 a 压栈记数、读 b 弹栈核销;终态时栈只剩 Z 才接受——这正是 PDA 比 FA 强的关键。
上下文无关文法回顾
我们用PDA识别了一种语言,但语言本身是怎么被"写"出来的?上下文无关文法(CFG)就是一套造句规则——只要给出有限的产生式,就能系统推出所有合法句子。
食材对应终结符,食材类别对应变元,操作步骤对应产生式
CFG转PDA
CFG转PDA的核心是:把文法的'推导'变成'栈操作',每读一个字符就推进一步归约。
PDA转CFG
把PDA的栈操作翻译成CFG的产生式规则,核心是把每一次转移拆成对应文法的推导步。
等价性总结
左:CFG 与 NPDA 等价,共同刻画整个 CFL;中:给 NPDA 加确定限制得到 DPDA;右:DPDA 只覆盖 CFL 的真子集 DCFL。
核心概念自测
关于PDA的终态接受(F接受)和空栈接受(N接受),下列说法正确的是?
课后思考
先独立思考再看参考答案,试着把每个问题讲给同伴听。
参考答案FA状态数有限,输入再长也只能维持有限种'上下文'。栈虽然无限,但只能按LIFO访问,底部信息被遮蔽,等价于只能追踪最近一次嵌套外的局部,全局模式天然丢失。
参考答案不一定。对同一PDA,两种接受方式识别不同语言完全可能。等价定理说的是'存在性等价':任何PDA都能改造为等价PDA用另一种接受方式,但改造后已不是原来的PDA。
参考答案典型例子是aⁿbⁿcⁿ(三个等长片段)。直觉上:单个LIFO栈只能同时追踪一段嵌套,无法并行计数'a有几个、b有几个'。这正指向需要图灵机或多栈的能力。