📜  语言 L ={w∈ {a,b}*| 的 NPDA w 包含相等的编号。 a 和 b 的}

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

先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 L ={w?{a,b}* | w 包含相等的编号。 a 和 b 的},即,

L = {ab, aabb, abba, aababb, bbabaa, baaababb, .......}

所有字符串中 a 和 b 的数量相同。

解释 –
在这里,我们不需要维护 a 和 b 的任何顺序。因此我们的状态图将只包含一个初始状态和一个最终状态。 a 和 b 的计数由堆栈维护。我们将采用 3 个堆栈字母:

\Gamma = {a, b, z}

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

用于构建PDA的方法 –
如果“a”先出现,则将其压入堆栈,如果再次出现“a”,则也将其压入堆栈。类似地,如果 ‘b’ 先出现(’a’ 还没有出现),则将其压入堆栈,如果再次出现 ‘b’,则也将其压入堆栈。

现在,如果 ‘a’ 出现在栈顶并且 ‘b’ 出现,那么从栈中弹出 ‘a’。如果 ‘b’ 出现在堆栈的顶部并且 ‘a’ 出现,则从堆栈中弹出 ‘b’。

因此,最后如果堆栈变空,那么我们可以说该字符串已被 PDA 接受。

堆栈转换函数 –

\delta (q0, a, z) \vdash (q0, az) \delta (q0, a, a) \vdash (q0, aa) \delta (q0, b, z) \vdash (q0, bz) \delta (q0, b, b) \vdash (q0, bb) \delta (q0, a, b) \vdash (q0, \epsilon ) \delta (q0, b, a) \vdash (q0, \epsilon ) \delta (q0, \epsilon , z) \vdash (qf, z)

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


所以,这是我们需要的非确定性 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接受了。