基本概念

下推自动机可以理解为在 - NFA 的基础上增加了一个存储“堆栈符号”的堆栈。 下推自动机定义为一个七元组

  • :有穷状态集合
  • :有限输入符号集合
  • :有限栈符号集合,表示可以被压入栈中的符号集合
  • :转移函数。接受一个三元组 ,输出其中
    • 是一个输入符号或空串
    • 是一个栈符号 的输出是一个由 组成的有限集,其中 是新的状态, 是用于改变栈顶符号的栈符号串
  • :初始状态
  • :初始栈符号,有且仅有一个
  • :接受状态集合

Example

接受语言 的 PDA

其中,转移函数为

PDA 的当前格局用三元组 表示,称为 ID, 为当前状态, 为剩余输入串, 是栈中内容。

对任意 ID 对任意 ID ,若 ,则

Theorem

,对任何

下推自动机的语言

终态接受的定义

空栈接受的定义

这种情况下终态集合 可以略去。

从空栈接受到终态接受

Theorem

设 PDA ,若 ,则存在 PDA ,使

Proof

新增初始状态 ,作用是将 压入栈中,新增终态 ,对所有 中的状态

Attention

必须在初始状态压入另一初始栈符号,否则在 处于接受状态时,栈已经为空,无法进入终态节点。

从终态接受到空栈接受

Theorem

设 PDA ,若 ,则存在 PDA ,使

Proof

新增初始状态 ,作用是将 压入栈中,新增状态 ,对于所有终态,新增一条到 的转移弧 有到自己的转移弧

Attention

必须在初始状态压入另一初始栈符号,否则 会接受 中清空了栈但是没有进入终态的串。

PDA 的设计

例 1

考虑以终态接受的方式构造 PDA。 遇到 a 向栈中压入元素,遇到 b 时弹出元素。为了实现 a 的数量至少 2 倍于 b,应该每次弹出 2 个元素,可以通过引入 实现。

例 2

用 X 对 a 计数,用 Y 对 b 计数,a 遇到 X 则压入 X,遇到 Y 则弹出 Y,b 同理,若串处理完毕,栈中还有元素,则接受。

例 3

每次出现 后必须马上出现

例 4

以空栈方式接受 , 只需让 a、b、c 都用 X 计数即可。

例 5

以空栈方式接受 , 用一个状态处理前半段,另一个状态处理后半段,后半段处理时只需判断当前输入是否与栈顶相同即可。

例 6

化简得 ,设置两个分支即可

例 7

当且仅当存在前后半段同位置的字符不同,即

以空栈接受

例 8

以终态方式接受 ,用栈量出三分点,保证前三分之一包含

Example

遇到符号 时向栈中压入 3 个元素,遇到符号 时从栈中非确定性地弹出 1-3 个元素。

例 10

转化为 三类,分别构造

确定型 PDA

一个 PDA 为确定型 PDA 或 DPDA 当且仅当:

  • 对于 至多包含一个元素
  • 对于 ,若 ,则 直观上,如果在任何情况下都不需要移动的选择,则一个 PDA 是确定型的。 有两种类型的选择:
  • 有多个序对
  • 选择用

前缀性质

一个语言 L 具有前缀性质,当且仅当不存在 的前缀。

Theorem

一个语言 是某个 DPDA 当且仅当 具有前缀性质且 是某个 DPDA

若上下文无关语言 是某个 DPDA 的语言,则称 为一个确定型上下文无关语言。 确定型 PDA 的语言都是上下文无关语言,但确定型 PDA 不能表达所有的 CFL。

Theorem

为正规语言,则存在 DPDA

忽略 DPDA 的堆栈,可以把它当做一个 DFA

确定型 PDA 与无二义文法

Theorem

一个语言 是一个 DPDA ,则 存在一个无二义文法。

可证由 构造的 CFG 有唯一的最左推导。

Theorem

一个语言 是一个 DPDA ,则 存在一个无二义文法。

L'=\{ w\|w\in L }$LL’P’L’=N(P’)G’L=L(G’)G’G$$\to\epsilonL=L(G)$

Theorem

固有二义的语言不是任何 DPDA 的语言

DPDA 的设计

Example

Example

重点是如何避免猜测,转化为第一个 b 出现在串的前三分之一段,即第一个连续的 a 串的长度的三倍小于串的长度

Example

用两个符号记录串 aa 和串 aba 出现的次数,且根据目前哪个串更多分为两种情况: