【问题标题】:How do I construct this pushdown automata following this rules我如何按照这个规则构建这个下推自动机
【发布时间】:2021-03-14 22:18:41
【问题描述】:

规则是: 它不能以字母 a 开头。 它不能以字母 b 结束。 它必须包含 b=i a=2i。 字母表是a,b。 我试过这样做清空堆栈。但不幸的是,我无法达到它。 例如这样的输入: bbaaaa 没关系,因为对于每个 b 输入,我都将其放入堆栈 2 a 中,并且 a 输入会删除堆栈。 但是当输入是这样的时: baaabbaaa 无法遵循这些步骤。 有什么建议吗?

【问题讨论】:

    标签: computer-science automata finite-automata pushdown-automaton automata-theory


    【解决方案1】:

    我的方法是这样的:

    使初始状态接受(因为空字符串满足语言标准)并在 b 上单次转换到另一个状态。作为此转换的一部分,将两个 b 压入堆栈。如果 PDA 在初始状态下看到 a,它将崩溃并拒绝。

    我们转换到的另一个状态对应于刚刚看到的 b。因为我们的字符串不能以 b 结尾,所以这个状态不能接受。如果我们在这里看到另一个 b,我们可以循环回到这个状态,每次再向堆栈添加两个 b(如果堆栈顶部有 b)或者取消两个 a(如果有两个 a)或替换 a与 b (如果堆栈只有一个 a)。如果我们看到一个 a,我们必须进入一个新状态,我们应该从堆栈中弹出一个 b(如果有 b)或压入另一个 a(如果 a 在顶部)。

    第三个状态意味着我们最后看到了一个 a,所以如果我们在这里用空堆栈输入,我们应该接受。如果我们看到 a,我们可以留下并弹出 b(如果 b 在顶部)或 push a(如果 a 在顶部)。如果我们看到 b,我们应该返回第二个状态,push 两个 b,pop 两个 a,或者 pop a 和 push b,具体取决于堆栈内容。

    我们的堆栈跟踪 PDA 必须看到的额外符号的数量以清除堆栈,如下所示:

    • 堆栈一次只能包含 a 或 b,永远不会同时包含两者
    • 如果我们看到 n a 和 m b 并且 n = 2m,则堆栈将为空
    • 如果我们看到 n a 和 m b 并且 n > 2m,堆栈中将有 n - 2m a
    • 如果我们看到 n a 和 m b 且 n

    【讨论】:

    • stackoverflow.com/users/847269/patrick87 谢谢你,但据我所知,不接受空输入。我认为最小输入应该是咩。它以 b 开头,以 a 结尾。有 1 个 b 和 2 个 a。其他有效输入可能是例如: b baaabaa a , b baa a 。等等。无论如何,非常感谢。我会试试你说的
    • @largoLagrande 乐于助人。如果您的语言不应该接受空字符串,那么就不要让初始状态接受。但是,请注意 - 您在问题中所述的要求不会强制字符串为非空。空字符串... (1) 不以 a 开头 (2) 不以 b 结尾并且 (3) 的 a 是 b (0 = 2 * 0) 的两倍。祝你好运!
    • 很抱歉打扰您,但只是一个问题。您基本上说对于堆栈中的每个 b 输入位置 2 b,然后 a 将删除 b。如果 a 输入且堆栈为空,则将 a 在堆栈中。如果下一个字符是 b 和堆栈中的 an,那么操作是什么?
    • 在这种情况下,删除一个 a,并添加一个 b。所以,如果栈是 aZ 而你看到 b,栈就变成了 bZ。
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2014-01-29
    • 2015-04-10
    • 1970-01-01
    • 2023-03-18
    • 2018-01-28
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多