【问题标题】:Push down automata for a language一种语言的下推自动机
【发布时间】:2017-03-15 13:57:54
【问题描述】:

我想为该语言设计一个下推自动机

L = { a^i b^j c^k | i = j or k <= j <= 2k}

导师提出的解决方案如下图所示。

但我担心的是,|2c| &gt; |b| 时它不处理表单的字符串。也就是在q8 状态下,如果所有的 B 都堆叠出来了,但输入 C 还没有完成怎么办。此处未捕获该转换。

我的担心正确吗? 或者建议的解决方案是正确的 PDA。

【问题讨论】:

    标签: computation-theory nfa pushdown-automaton


    【解决方案1】:

    记住 j >= k,所以这意味着 |b| >= |c|。

    如果读取了输入中的所有“b”,则堆叠的 B 的数量大于(或等于)要在输入中读取的“c”的数量。

    • 如果 j = k,那么它将使用从 q8 到 q8 的转换,直到输入完成。
    • 如果 j = 2k,它将读取一个 "c" (q8 -> q9) 并从堆栈中取出两个 B (q9 -> q8),因此只有带有 |b| 的字符串= 2|c|可以接受。
    • 如果 j q9 和 q9-> q8 直到 B 的堆叠数量等于输入中要读取的“c”数量。然后它将使用 q 8-> q8 直到输入完成。

    【讨论】:

    • 我明白你在说什么。在提议的 PDA 中,对于 q8 -> q8,转换条件为:(C, B-> E)。 |b| 时会发生什么= 6 和 |c| = 4. 这种形式的字符串应该是可以接受的。但是这个PDA不处理这个案子,对吧?
    • 确实如此。读取输入中的所有“b”后,将堆叠 6 个 B。然后使用 q8 -> q9 和 q9 -> q8 两次在输入中读取两个“c”,从堆栈中取出 4 个 B。所以我们有两个“c”要在输入中读取,还有两个 B 堆叠。然后,q8 -> q8 被使用两次,字符串被接受。
    • 好的,是的。您的第三点正确地解释了这一点。我实际上是通过阅读 3 个“c”并堆叠 6 个 B 来耗尽所有 B。然后我在堆栈中剩下 1 个“c”和 0 个 B,我从 q8 无处可去。那么转换的顺序在 NFA 中也很重要吗?我们能不能把这个PDA转换成一个程序,然后计算机可以按照它应该进行转换的顺序来做转换吗?我的意思是这个 PDA 是否有助于编写正确/更好的程序?
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2015-01-20
    • 1970-01-01
    • 2020-07-27
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多