先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 L ={w?{a,b}* | w 包含相等的编号。 a 和 b 的},即,
L = {ab, aabb, abba, aababb, bbabaa, baaababb, .......}
所有字符串中 a 和 b 的数量相同。
解释 –
在这里,我们不需要维护 a 和 b 的任何顺序。因此我们的状态图将只包含一个初始状态和一个最终状态。 a 和 b 的计数由堆栈维护。我们将采用 3 个堆栈字母:
= {a, b, z}
在哪里, = 所有堆栈字母的集合
z = 堆栈起始符号
用于构建PDA的方法 –
如果“a”先出现,则将其压入堆栈,如果再次出现“a”,则也将其压入堆栈。类似地,如果 ‘b’ 先出现(’a’ 还没有出现),则将其压入堆栈,如果再次出现 ‘b’,则也将其压入堆栈。
现在,如果 ‘a’ 出现在栈顶并且 ‘b’ 出现,那么从栈中弹出 ‘a’。如果 ‘b’ 出现在堆栈的顶部并且 ‘a’ 出现,则从堆栈中弹出 ‘b’。
因此,最后如果堆栈变空,那么我们可以说该字符串已被 PDA 接受。
堆栈转换函数 –
(q0, a, z) (q0, az) (q0, a, a) (q0, aa) (q0, b, z) (q0, bz) (q0, b, b) (q0, bb) (q0, a, b) (q0, ) (q0, b, a) (q0, ) (q0, , z) (qf, z)
其中,q0 = 初始状态
qf = 最终状态
= 表示弹出操作
所以,这是我们需要的非确定性 PDA,用于接受包含等于 no 的字符串。 a 和 b 的。
示例:我们将采用一个输入字符串:“aabbba”PDA 是否接受?。
解决方案:
1.从左到右扫描字符串。
2.在输入’a’和堆栈字母Z时,将’a’推入堆栈为:(a,Z/aZ),状态将为q0。
3.second输入’a’和堆栈字母’a’,将’a’推入堆栈为:(a,a/aa),状态将为q0。
4.第三次输入’b’和堆栈字母’a’,从堆栈中弹出:(b,a/∈),状态为q0。
5.在输入’b’和堆栈字母’a’时,从堆栈中弹出:(b,a/∈),状态将为q0。
6.在输入’b’和堆栈字母Z时,将’b’推入堆栈为:(b,Z/bZ),状态将为q0。
7.在输入’a’和堆栈字母’b’时,从堆栈中弹出:(a,b/∈),状态将为q0。
8.在输入∈和堆栈字母 Z,转到最终状态 (qf) 为:(∈, Z/Z)。
所以,最后栈变空了,我们就可以说这个字符串被PDA接受了。