繁体   English   中英

如何构造 L={a^nb^m where n<=m<=2n} 的下推自动机?

[英]How to construct a pushdown automata for L={a^nb^m where n<=m<=2n}?

它应该在不使用 2 个堆栈的情况下构建。 我试过了,但如果没有 2 个堆栈,我就无法做到。

策略如下:我们可以很容易地制作一个接受 a^nb^n 的 PDA,我们也可以很容易地制作一个接受 a^nb^2n 的 PDA。 我们的语言是这些语言的超集,它也接受 n 到 2n 之间的任何 b 数。 我们可以利用非确定性来实现这一点,如下所示:对于我们放入堆栈的每个 a,我们可以在弹出 a 之前不确定地决定是消耗一个还是两个 b。 如果我们的 NPDA 选择每次消耗一个,我们得到 a^nb^n。 如果它选择每次消耗两个,我们得到 a^nb^2n。 如果它选择两者中的一些,我们会在这些极端之间得到一些 b。 只有当我们用空堆栈耗尽输入时,我们才会接受。

Q    s    S    Q'    S'    Comment

q0   e    e    qA    e     Allow empty string to be accepted

q0   a    x    q0    ax    Count a and push onto stack
q0   e    x    q1    x     Transition to counting b

q1   b    ax   q1    x     Mark off a single b for each a
q1   b    ax   q2    x     Mark off the first of two b for this a
q1   e    e    qA    e     Allow string in language to be accepted

q2   b    x    q1    x     Mark off the second of two b for this a

在这个 PDA 中,我们将q0作为初始 state,将qA作为接受 state。 aabbb上处理:

   q0, aabbb, e 
-> q0, abbb, a 
-> q0, bbb, aa
-> q1, bbb, aa
-> q1, bb, a
-> q2, b, e
-> q1, e, e
-> qA, e, e

当然,有许多解析不会导致 qA,但在 NPDA 中,如果至少有一个,我们会接受。

此图像包括该语言的图形下推自动机

该语言的 NPDA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM