如何构造 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^n b^n 的 PDA,也可以很容易地制作一个接受 a^n b^2n 的 PDA。我们的语言是这些语言的超集,它也接受任何 b 在 n 和 2n 之间的数字。我们可以利用非确定性来允许这一点,如下所示:对于我们放入堆栈的每个 a,我们可以非确定性地决定在弹出 a 之前是消耗一个还是两个 b。如果我们的NPDA选择每次消费一个,我们得到a^n b^n。如果它选择每次消耗两个,我们得到a^n b^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 作为初始状态,将 qA 作为接受状态。在 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 中,如果至少有一个,我们会接受。

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