📜  为给定语言构建下推自动机

📅  最后修改于: 2021-09-28 10:14:28             🧑  作者: Mango

先决条件 – 下推自动机,下推自动机按最终状态接受
下推自动机类似于确定性有限自动机,除了它比 DFA 具有更多的属性。用于实现 PDA 的数据结构是堆栈。 PDA 有一个与每个输入相关联的输出。所有输入要么被压入堆栈,要么被忽略。用户可以对用于PDA 的堆栈执行基本的push 和pop 操作。与 DFA 相关的问题之一是无法计算输入给机器的字符数。 PDA 避免了这个问题,因为它使用了一个堆栈,也为我们提供了这种便利。

下推自动机 (PDA) 可以定义为:
M = (Q, Σ, Γ, δ, q0, Ζ, F) 其中

  • Q 是有限状态集
  • Σ 是一个有限集,称为输入字母表
  • Γ 是一个有限集,称为堆栈字母表
  • δ 是 QX ( Σ ∪ {ε} X Γ XQX Γ * ) 过渡关系的有限子集。
  • q 0 ∈ Q是开始状态
  • Ζ ∈ Γ 是初始堆栈符号
  • F ⊆ Q 是接受状态的集合

状态转换的表示 –

在 PDA 中推送的表示 –

Pop 在 PDA 中的表示 –

Ignore 在 PDA 中的表示 –

Q) 为语言 L = {0 n 1 m 2 m 3 n | 构建一个 PDA n>=1,m>=1}

本 PDA 中使用的方法 –
第一个 0 被压入堆栈。然后将 1 压入堆栈。
然后对于作为输入的每 2 一个 1 从堆栈中弹出。如果仍然有一些 2 并且堆栈顶部是 0,则 PDA 不接受字符串。此后,如果 2 完成并且堆栈顶部为 0,则对于每 3 个作为输入的相同数量的 0 弹出堆栈。如果字符串完成且堆栈为空,则 PDA 接受字符串,否则不接受。

  • 步骤 1:收到 0 时将其压入堆栈。收到 1 后,将其压入堆栈并转到下一个状态
  • 第 2 步:在接收 1 时将其推入堆栈。在接收 2 时,从堆栈中弹出 1 并转到下一个状态
  • 第 3 步:从堆栈接收 2 pop 1 时。如果所有 1 都已从堆栈中弹出并现在收到 3,则从堆栈中弹出 0 并转到下一个状态
  • 第 4 步:从堆栈接收 3 pop 0 时。如果输入完成且堆栈为空,则转到最后一个状态并接受字符串

例子:

Input  : 0 0 1 1 1 2 2 2 3 3
Result : ACCEPTED

Input  : 0 0 0 1 1 2 2 2 3 3 
Result : NOT ACCEPTED

Q) 为语言 L = {0 n 1 m | 构建一个 PDA n >= 1, m >= 1, m > n+2}

本 PDA 中使用的方法 –
第一个 0 被压入堆栈。当 0 完成时,忽略两个 1。此后,对于每一个 1 作为输入,从堆栈中弹出一个 0。当堆栈为空并且仍然有一些 1 时,则所有这些都将被忽略。

  • 步骤 1:收到 0 时将其压入堆栈。收到 1 时,忽略它并转到下一个状态
  • 步骤 2:在接收 1 时,忽略它并转到下一个状态
  • 步骤 3:收到 1 后,从栈顶弹出一个 0 并进入下一个状态
  • 第 4 步:收到 1 时,从堆栈顶部弹出一个 0。如果堆栈为空,则在接收到 1 时将其放入并转到下一个状态
  • 步骤 5:在接收 1 时忽略它。如果输入完成则转到最后一个状态

例子:

Input  : 0 0 0 1 1 1 1 1 1
Result : ACCEPTED

Input  : 0 0 0 0 1 1 1 1
Result : NOT ACCEPTED