为 L={a^mb^n where n<=m<=2n} 构造一个下推自动机?

问题描述

我想了解 L={a^nb^m where n<=m<=2n} 的下推自动机的构造?我在堆栈上发现了 this 个问题。

这是我理解的答案:

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

现在,我稍微改变了问题(交换了 a 和 b 的幂)。语言现在是 L={a^m b^n where n<=m<=2n}? 如果权力互换,这种策略现在会发生什么变化?

解决方法

我们可以利用不确定性来实现这一点:对于我们放入堆栈的每个 a,我们可以不确定地决定在弹出 a 之前是消耗一个还是两个 b。

只需在这句话中交换ab,你就会得到答案。

提示:不是将 a 放在堆栈上,而是将 b 放在堆栈中,然后“消耗”一两个 a 在弹出之前。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...