先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 L = { | m ≥ 1},或,L = { | m≥1},即
L = {abbb, aabbbbb, aaabbbbbbb, aaaabbbbbbbbb, ......}
在每个字符串,’b’的个数比’a’个数的两倍多一倍。
解释 –
在这里,我们需要保持a和b的顺序。也就是说,所有的a先来,然后所有的b都来。因此,我们需要一个堆栈和状态图。 a 和 b 的计数由堆栈维护。我们将采用 2 个堆栈字母:
= { a, z } 其中, = 所有堆栈字母的集合 z = 堆栈起始符号
用于构建PDA的方法 –
由于我们要设计 NPDA,因此每次 ‘a’ 出现在 ‘b’ 之前。我们将为每个 ‘a’ 将一个 ‘a’ 压入堆栈,对于下一个 ‘a’,我们将再次将一个 ‘a’ 压入堆栈。然后当 ‘b’ 出现时,对于第一个 ‘b’ 我们什么都不做,只有状态会改变。对于接下来的两个’b’,我们将弹出一个’a’,对于接下来的两个’b’,我们将弹出一个’a’。同样,我们交替执行此操作。
即,对于第三个 ‘b’ 我们首先弹出 ‘a’
对于第五个 ‘b’ 我们弹出第二个 ‘a’
对于第七个 ‘b’ 我们弹出第三个 ‘a’
因此,最后如果堆栈变空,那么我们可以说该字符串已被 PDA 接受。
堆栈转换函数 –
(q0, a, z) (q0, az) (q0, a, a) (q0, aa) (q0, b, a) (q1, a) [表示没有操作只有状态改变] (q1, b, a) (q2, a) [表示没有操作只有状态改变] (q2, b, a) (q3, ) [表示弹出操作] (q3, b, a) (q2, a ) [表示没有操作只有状态改变] (q3, , z) (qf, z )
其中,q0 = 初始状态
qf = 最终状态
= 表示弹出操作