下推自动机能够对应 CFG。它是一个带有 “栈” 的 $\varepsilon-\text {NFA}$ 。
6.1 下推自动机的定义
6.1.1 通俗介绍
下推自动机与 $\varepsilon-\text {NFA}$ 类似,状态控制器可以在有限个状态之间转移(Finite Control)。但是它还有一个符号栈,可以推入(push)写入符号,或者弹出(pop)读取符号。栈的空间可以看作无限的。
6.1.2 形式定义
PDA 的定义如下:
- $Q$:有穷状态集。有限控制器的状态集合
- $T$:有限输入字母表。
- $\Gamma$:有限下推栈字母表。
- $\delta$:转移函数。输入:当前状态,当前输入,当前栈顶。输出:新状态,栈顶替换的字符
- $q_0$:初态, $q_0 \in Q$
- $z_0$:下推栈的栈底最初符号,$z_0 \in \Gamma - T$
- $F$:终态集合
如下图,当处于状态 q 时,输入一个字符 $a$ ,则将栈顶 $Z$ 替换为 $\beta_i$ 或者 $\beta _j$
记作:
例子:设计 PDA,识别 $L_{01} = \{0^n1^n | n \geq 1\}$
思路:
当 PDA 读入 0 时,压入 0,当读入 1 时,弹出 0. 当字符串读取结束后,到达栈顶,则说明接受字符串。
设起始状态 $q_0$ ,
$q_0 \to q_0$ :
- $0, 0/00$ (表示输入零,将栈顶的 0 替换为 00,相当于压入 0)
- $0, Z_0/0Z_0$ (表示输入 0,将栈顶的 $Z_0$ 替换为 $0Z_0$,相当于压入 0)
当输入 1 后到达 $q_1$ :
$q_0 \to q_1$ :
- $1, 0/\varepsilon$ (表示输入 1, 弹出 0)
$q_1 \to q_1$ :
- $1, 0/\varepsilon $ (表示输入 1,弹出 0)
为了侦测串结束,只要检查栈顶是 $Z_0$ 即可:
$q_1 \to q_2$ :
- $\varepsilon , Z_0 / Z_0$
注:00111 不会被接受
6.1.3 瞬时描述
定义元组 $(q,w,\gamma)$ 表示 PDA 处于状态 $q$,输入剩余串 $w$,栈为 $\gamma$,称为瞬时描述(ID,Instantaneous description)。
在 $\text {PDA} P$ 中, $(q, a w, Z \alpha)$ 到 $(p, w, \beta \alpha)$ 的变化,称为 ID 的转移 $\vdash_{P}$, 记为
$\vdash_{P}^{*}$ 表示 ID 的 0 次或多次转移。
6.2 PDA 接受的语言
6.2.1 PDA 的接受方式
PDA $P$ 以终态方式接受的语言,记为 $\mathrm {L}(P)$, 定义为
$P$ 以空栈方式接受的语言,记为 $\mathrm {N}(P)$, 定义为
终态方式接收,就是空转移到终态($\varepsilon , Z_0 / Z_0$),即用明确的状态表示中止。
空栈方式接收,就是接收字符串时弹空($Z_0/\varepsilon$),导致栈空,表明接受。可以在任何状态中止。
定理:若 PDA $P_F$ 以终态接受语言,则一定存在 PDA $P_N$ 以空栈方式接受同语言。
证明略。思路为用 $P_N$ 模拟 $P_F$
6.3 PDA 与 CFG 的等价性
6.3.1 文法转 PDA
PDA 的特点是弹出一个符号,压入一个串。因此可用此过程模拟 CFG 的最左推导。
例子:设计 $L = \{0^n 1^m | a \leq m \leq n\}$ 的 PDA
解:
要接受的字符串的特点是:0 多余 1
PDA 如上图。功能:
- 输入 0,则压入
- 一旦输入了 1,则弹出 0. 1 可以和 0 成对弹出,也可以空转弹出,从而保证 0 的数量大于等于 1 的数量。扫描完露出栈顶。
如上图,我们将 S 作为栈底符号。通过非确定方式在栈中产生足够的 01 串(0S1, 0S, 01)(类似穷举出所有可能), 当栈顶是 0 或 1 时,不断匹配出栈。只要输入串和穷举中任何一个相同就引发接受。
其对应的文法:
就类似最左派生。
定理: $\forall \text {CFL} L, \exists \text {PDA} P \text {s.t.} L = \mathrm {N}(P)$
【例子】 为 $S\to aAA, A \to aS | bS | a$ 构造 PDA.
【分析与解答】
单状态 $q_0 \to q_0$ :
-
$\varepsilon , s/aAA$
-
$\varepsilon , A/aS$
-
$\varepsilon , A/bS$
-
$\varepsilon , A/a$
-
$a,a / \varepsilon $
-
$b,b / \varepsilon $
6.3.2 GNF 转 PDA
如果 $\mathrm {GNF}$ 格式的 $\mathrm {CFG} G=\left (V, T, P^{\prime}, S\right)$, 那么构造 $\mathrm {PDA}$
构造特点:
只有一个状态 $q$ 并且是开始状态 输入符号表 T 刚好是终结符 栈符号表 V 刚好是非终结符 栈底符号刚好是开始符号 不需要终态,因为以空栈接受
为每个产生式,定义 $\delta$ 为:
产生式定义为终结符 ($a$) 连接变元符号串 ($\beta$)
【例子】 为 GNF 文法 $S\to aAA, A \to aS | bS | a$ 构造 PDA.
【分析与解答】
单状态 $q_0 \to q_0$ :
- $a,S/AA$
- $a,A/S$
- $b,A/S$
- $a,A/\varepsilon $
6.3.3 PDA 转 CFG
定理:若 PDA P, $L = \mathrm {N}(P)$ 则 L 是 CFG.
【例子】 将 $\text {PDA} P = (\{p, q\}, (0,1), \{X,Z\}, \delta, q, Z)$ 转为 CFG. $\delta $ 定义如下:
(1) $\delta(q, 1, Z)=\{(q, X Z)\}$ (2) $\delta(q, 1, X)=\{(q, X X)\}$ (3) $\delta(q, 0, X)=\{(p, X)\}$ (4) $\delta(q, \varepsilon, Z)=\{(q, \varepsilon)\}$ (5) $\delta(p, 1, X)=\{(p, \varepsilon)\}$ (6) $\delta(p, 0, Z)=\{(q, Z)\}$
https://www.bilibili.com/video/BV1oE4116794?p=31&spm_id_from=pageDriver
过程详解:
$S\to[qZ?]$
展开:
- $S\to[qZp]$
- $S\to[qZq]$
S 定义为所有的开始状态( $q_0,z_0, p$ ), $q_0 = q, z_0 = Z$ , $p = p | q$
对于 $\delta (q, 1, Z) = \{(q, XZ)\}$
从状态 q, 为了弹出 Z,可能到达任意状态。消耗 1,Z 替换成 [X][Z].
消耗 1,到达 q:$[qZ?]\to 1 [qX?][?Z?]$
展开就是:
确定型下推自动机(DPDA)
如果对于每个输入,后续状态唯一,则为 DPDA。