为以下语言创建下推自动机

时间:2017-07-17 23:17:05

标签: automation formal-languages pushdown-automaton

所以我在书中做练习问题,我发现了这个问题。 构造一个接受sigma(a,b,c)语言L的npda。

L = {w:a的数量= b的数量+ 1}

所以我解释它,因为它接受所有字符串,其中包含一个字母b。我相信所有的州应该有一个有过渡的循环(c,landa,landa),因为我们并不真正关心c。在此之后我感到非常困惑,因为有很多案例需要覆盖,因为a和b的放置是任意的。弄清楚这个问题的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

PDA可以使用堆栈来记住任意数量的信息。这使得PDA比有限自动机能力更强大。确定PDA的关键是弄清楚如何使用堆栈然后围绕它建立一个PDA。

我们如何使用堆栈来确保a s的数量等于b的数量加一?好吧,堆栈可以轻松跟踪已经看到的符号的运行平衡。例如,如果我们看到四个a和两个b,我们的堆栈可能通过包含aaZ来表示这一事实,其中Z是"底部堆栈"符号。当然,我们可能会使用其他方法和其他表示,但对于这类问题,这是一个特别简洁的方法。要完整解释代表性:

  1. 堆栈最初是Z,只是堆栈符号的底部。
  2. 如果我们看到a并且堆栈的顶部是aZ,我们会添加另一个a
  3. 如果我们看到a且堆栈顶部为b,我们会删除一个b
  4. 如果我们看到b并且堆栈的顶部是bZ,我们会添加另一个b
  5. 如果我们看到b且堆栈顶部为a,我们会删除一个a
  6. 如果我们看到c,请单独留下堆栈。
  7. 如果我们一遍又一遍地对所有输入执行此操作,那么堆栈的内容将等于x^m,其中xa和{{1}中的任何一个更频繁地发生,b是每个符号数量差异的绝对值。

    要接受您的语言,您必须简单地识别输入用尽并且堆栈包含等于m的情况。这可以通过添加一些状态和lambda / epsilon转换来清除堆栈和/或进入接受状态来完成。

    感谢Peter Leupold指出其他原始答案的语法错误。我试图解决它并且不知道答案得到多久,所以我省略了。我将简单地补充说,另一种可能性是为语言生成CFG并使用算法为其派生PDA。在这种情况下,对我来说,直接给PDA是不那么罗嗦的。