第 6 章 下推自动机

有限控制 + 栈:CFG 的机器模型

Source scope
主要依据教材第 6 章:中文印刷页 151–175,对应 PDF p.164–188/189。教材依次讨论 PDA 的定义、两种接受方式、PDA 与 CFG 等价以及确定型 PDA。

1 0. 为什么 DFA 不够、栈为什么刚好

要识别

\[ \{0^n1^n\mid n\ge0\}, \]

机器必须记住前面出现了多少个 0。DFA 只有有限状态,做不到无界计数。

PDA(pushdown automaton)在有限控制器之外加入一个后进先出栈。它不需要记住精确整数,只需对每个 0 压一个标记,随后每读一个 1 弹一个标记。

2 1. PDA 的正式定义

一个非确定型 PDA 写成

\[ P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F), \]

其中:

  • \(Q\):有限状态集;
  • \(\Sigma\):输入字母表;
  • \(\Gamma\):栈字母表;
  • \(q_0\):初态;
  • \(Z_0\):初始栈符号;
  • \(F\):接受状态集;
  • 转移函数 \[ \delta:Q\times(\Sigma\cup\{\varepsilon\})\times\Gamma \to \mathcal P(Q\times\Gamma^*). \]

2.1 1.1 如何读一个转移

若

\[ (p,\gamma)\in\delta(q,a,X), \]

表示:

  1. 当前状态 \(q\);
  2. 若下一输入是 \(a\)(或 \(a=\varepsilon\) 不消耗输入);
  3. 栈顶为 \(X\);
  4. 则可转到 \(p\);
  5. 弹出 \(X\),并把字符串 \(\gamma\) 压回栈顶。

若 \(\gamma=\varepsilon\),就是单纯弹栈。

3 2. 瞬时描述 ID

PDA 的配置不仅由状态决定,还必须记录:

  • 未读输入;
  • 栈内容。

写作

\[ (q,w,\alpha). \]

例如

\[ (q,011,AZ_0) \]

表示当前在状态 \(q\),剩余输入 011,栈顶为 \(A\),下面是 \(Z_0\)。

一步移动记为 \(\vdash_P\),多步记为 \(\vdash_P^*\)。

4 3. 例:识别 \(\{0^n1^n\}\)

设计思想:

  • 读 0 阶段:每个 0 压入一个 \(X\);
  • 第一次读 1 时切换阶段;
  • 读 1 阶段:每个 1 弹出一个 \(X\);
  • 输入读完且只剩底符号时接受。

核心不变量:

进入第二阶段前,栈中 \(X\) 的个数等于已读 0 的个数;进入第二阶段后,剩余 \(X\) 个数等于“0 的总数减去已读 1 的个数”。

5 4. 两种接受方式

教材讨论两种常用定义。

5.1 4.1 终态接受

输入全部读完后处于某个接受状态:

\[ (q_0,w,Z_0)\vdash^*(q,\varepsilon,\alpha),\quad q\in F. \]

栈可以不空。

5.2 4.2 空栈接受

输入全部读完,并把栈清空:

\[ (q_0,w,Z_0)\vdash^*(q,\varepsilon,\varepsilon). \]

此时不依赖接受状态集合。

5.3 4.3 两者表达能力相同

对非确定型 PDA:

\[ \boxed{\text{final-state acceptance}\equiv\text{empty-stack acceptance}} \]

5.3.1 空栈 → 终态

加入新底符号与新接受状态。当旧栈已经清到新底符号时,转入新终态。

5.3.2 终态 → 空栈

加入新底符号;一旦旧 PDA 进入接受状态,就转入“清栈状态”,通过 \(\varepsilon\) 转移不断弹出栈符号直至空栈。

6 5. CFG 到 PDA

给定 CFG \(G=(V,T,P,S)\),可以构造 PDA 模拟“猜测一个推导”。

基本思想:

  1. 栈顶若是变量 \(A\),非确定地选择产生式 \[A\to\alpha\] 并把 \(A\) 替换为 \(\alpha\);
  2. 栈顶若是终结符 \(a\),必须与输入下一个字符 \(a\) 匹配,然后同时消费输入与弹栈;
  3. 输入与栈同时耗尽则接受。

PDA 的非确定性对应“文法有多个产生式可选”。

7 6. PDA 到 CFG

反向构造更技术化。核心变量常编码:

\[ [pXq] \]

含义可以理解为:

从状态 \(p\) 出发、栈顶有 \(X\),经过某段输入后恰好弹掉 \(X\) 并到达状态 \(q\) 的所有字符串。

根据 PDA 的转移组合建立产生式,最终得到与 PDA 相同的语言。

因此:

\[ \boxed{\text{PDA}\equiv\text{CFG}\equiv\text{CFL}}. \]

8 7. 确定型 PDA(DPDA)

PDA 的非确定性不是装饰。对 DFA,NFA 与 DFA 等价;但对 PDA:

\[ \text{DPDA 的语言} \subsetneq \text{CFL}. \]

确定型 PDA 要求,在给定状态和栈顶符号时,不能同时存在会冲突的输入转移和 \(\varepsilon\) 转移。

8.1 7.1 正则语言与 DPDA

每个正则语言都能被 DPDA 识别:直接忽略栈,用有限控制模拟 DFA 即可。

8.2 7.2 DPDA 与文法歧义

确定型 CFL 与无歧义文法有紧密关系。特别地,确定型 CFL 一定存在无歧义 CFG;但一般 CFL 可能固有歧义。

9 8. 常见错误

  1. 忘记 PDA 的转移依赖栈顶符号;
  2. 把 \(\varepsilon\) 输入转移理解成“读到字符 epsilon”;
  3. 没有区分输入是否已读完与栈是否为空;
  4. 终态接受时误以为栈必须空;
  5. 空栈接受时误以为必须进入某个双圈状态;
  6. 认为 NFA 与 DFA 等价,所以 NPDA 与 DPDA 也一定等价;这是错误的。

chapter concept map

本章概念关系图。

10 9. 本章关系图

CFG  --construct-->  NPDA
 ^                  |
 |                  v
 +----construct-----+

NPDA final-state acceptance = NPDA empty-stack acceptance
Regular ⊂ DCFL ⊂ CFL