📜  NPDA 接受语言 L = {anb(2n) | n>=1} U {anbn | n>=1}

📅  最后修改于: 2021-09-28 11:11:00             🧑  作者: Mango

先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 L = { a^nb^{2n} : n>=1} U { a^nb^{n} :n>=1},即

L = {abb, aabbbb, aaabbbbbb, aaaabbbbbbbb, ......} 
          U {ab, aabb, aaabbb, aaaabbbb, ......} 

在每个字符串,a 的数量后跟 b 的两倍或 a 的数量后跟 b 的数量相等。

解释 –
在这里,我们需要保持a和b的顺序。也就是说,所有的a先来,然后所有的b都来。因此,我们需要一个堆栈和状态图。 a 和 b 的计数由堆栈维护。我们将采用 2 个堆栈字母表:

\Gamma = { a, z }

在哪里,
\Gamma = 所有堆栈字母的集合
z = 堆栈起始符号

用于构建PDA的方法 –
在设计 NPDA 时,每个“a”都在“b”之前。如果’b’来了

  • 为了a^nb^{n} : 每当“a”出现时,将其压入堆栈,如果“a”再次出现,则将其压入堆栈。
  • 为了a^nb^{2n} :每当“a”出现时,将“a”推入堆栈两次,如果“a”再次出现,则执行相同操作。
    当 ‘b’ 出现时(记住 b 出现在 ‘a’ 之后)然后每次从堆栈中弹出一个 ‘a’。

这样栈就变空了。如果栈是空的,那么我们就可以说这个字符串被PDA接受了。

堆栈转换函数 –

\delta (q0, a, z) \vdash (q1, az) \delta (q0, a, z) \vdash (q3, aaz) \delta (q1, a, a) \vdash (q1, aa) \delta (q1, b, a) \vdash (q2, \epsilon ) \delta (q2, b, a) \vdash (q2, \epsilon ) \delta (q2, \epsilon , z) \vdash (qf1, z) \delta (q3 a, a) \vdash (q3, aaa) \delta (q3, b, a) \vdash (q4, \epsilon ) \delta (q4, b, a) \vdash (q4, \epsilon ) \delta (q4, \epsilon , z) \vdash (qf2, z)

其中,q0 = 初始状态
qf1, qf2 = 最终状态
\epsilon = 表示弹出操作

所以,这是我们接受语言 L ={ 所需的非确定性 PDA a^nb^{2n} : n>=1} U { a^nb^{n} :n>=1}。