Skip to content

模型Model

确定性下推自动机

施工中 · 内容逐步修订

Deterministic pushdown automaton · DPDA

每个配置至多有一个可用转移且读入与 ε 转移不冲突的下推自动机。

形式陈述 ​

确定性下推自动机(DPDA)是转移选择唯一的下推自动机。形式上,对每个状态 q、栈顶符号 X 与输入符号 a,集合 δ(q,a,X) 和 δ(q,ε,X) 各至多含一个动作;并且只要 δ(q,ε,X) 非空,同一 (q,X) 上的所有读入转移 δ(q,a,X) 都必须为空。否则机器会在“立即走 ε 边”与“读取下一个字符”之间产生非确定选择。

DPDA 通常以读完输入并进入终态定义接受,并常加入右端标记以明确输入结束。DPDA 识别的确定性上下文无关语言严格包含正则语言、严格小于全部上下文无关语言。与 NPDA 不同,DPDA 的空栈接受与终态接受不应未经条件直接互换。

直觉

DPDA 的每一步都由当前有限状态、下一输入符号和栈顶唯一决定,因此可以直接作为无回溯解析器运行。限制 ε 转移冲突很关键:即使每张转移表单独看像函数,只要机器可选择先做 ε 动作还是先读字符,仍然存在非确定性。确定性牺牲一部分语言表达力,换来唯一运行、补集闭包和更可预测的在线处理。输入结束标记常用于让机器知道“现在可以作最终决定”,否则前缀关系会干扰空栈式接受。

例子与边界

语言 {anbn:n≥0} 可由 DPDA 识别:读 a 唯一压栈,看到第一个 b 唯一切换到弹栈阶段,此后禁止再读 a。为看清终止条件,可在输入末尾附加不属于原字母表的标记 ⊣:aabb 实际读作 aabb 后接 ⊣。栈从 Z0 依次变成 AZ0,AAZ0,AZ0,Z0;只有在栈为 Z0 时读到 ⊣ 才进入终态。空字直接读取 ⊣ 后接受。各步由输入符号决定,没有“现在结束还是继续读”的选择。标记是输入协议的一部分,不能暗中当作普通 PDA 自动拥有的读入能力。

带不同类型括号的正确嵌套也可确定识别,因为每个右括号应匹配哪个左括号由栈顶唯一给出。

偶数长度回文语言 {wwR:w∈{0,1}∗} 是上下文无关而非确定性上下文无关的。常见的 NPDA 必须猜测何时从压栈切换到弹栈,这解释了困难,但不能单凭这台机器需要猜测就证明所有 DPDA 都失败;严格的语言类分离还需要独立证明。加入分隔符的 {w#wR} 则可确定识别:对 01#10,先把 0,1 依次压栈,读到 # 后固定切换阶段,再用 1,0 依次弹栈。

接受约定也有实质影响。在无结束标记、空栈后不能再转移的模型中,DPDA 空栈接受的语言必须无真前缀关系:若已接受 u,同一唯一运行在更长输入 uv 上也会于读完 u 时空栈,便无法读取非空 v。因此 {anbn:n≥0} 包含 ε 和非空字,不能在这种约定下直接改为空栈接受。

推论与应用

DPDA 是确定性解析的自动机基础。NULLABLE、FIRST与FOLLOW分别计算可空性、开头终结符和非终结符之后可能出现的符号,为LL(1)提供预测信息;LL(1)用一个向前看token选择最左展开。

LR项目与状态栈则在右部出现后归约;SLR用全局FOLLOW限制归约,LR(1)进一步保存局部右上下文。这些构造展示了实际文法怎样得到解析器。DPDA 与一般 PDA的差距说明“文法是上下文无关的”不保证存在无回溯确定解析器。

确定性上下文无关语言具有补集闭包等良好性质,但构造补自动机前要处理未读完输入就卡住及无限 ε 运行;简单互换终态与非终态并不足够。每个 DCFL 都有无歧义文法;歧义与确定解析之间因此存在紧密联系。

不过 DCFL 对并与交一般都不封闭;只能与正则语言求交后仍保证留在 DCFL。不能把 DFA 的全部布尔闭包性质直接搬到 DPDA。

参考资料
  • John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006,Chs. 5–7。
  • Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013,Ch. 2。
  • OpenDSA Project Contributors, Formal Languages With Visualizations: Deterministic Pushdown Automata, 2019,§7.3.1,确定性两项条件与语言分离。
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系