所以我在书中做练习问题,我发现了这个问题。 构造一个接受sigma(a,b,c)语言L的npda。
L = {w:a的数量= b的数量+ 1}
所以我解释它,因为它接受所有字符串,其中包含一个字母b。我相信所有的州应该有一个有过渡的循环(c,landa,landa),因为我们并不真正关心c。在此之后我感到非常困惑,因为有很多案例需要覆盖,因为a和b的放置是任意的。弄清楚这个问题的方法是什么?谢谢!
答案 0 :(得分:1)
PDA可以使用堆栈来记住任意数量的信息。这使得PDA比有限自动机能力更强大。确定PDA的关键是弄清楚如何使用堆栈然后围绕它建立一个PDA。
我们如何使用堆栈来确保a
s的数量等于b
的数量加一?好吧,堆栈可以轻松跟踪已经看到的符号的运行平衡。例如,如果我们看到四个a
和两个b
,我们的堆栈可能通过包含aaZ
来表示这一事实,其中Z
是"底部堆栈"符号。当然,我们可能会使用其他方法和其他表示,但对于这类问题,这是一个特别简洁的方法。要完整解释代表性:
Z
,只是堆栈符号的底部。a
并且堆栈的顶部是a
或Z
,我们会添加另一个a
。a
且堆栈顶部为b
,我们会删除一个b
。b
并且堆栈的顶部是b
或Z
,我们会添加另一个b
。b
且堆栈顶部为a
,我们会删除一个a
。c
,请单独留下堆栈。如果我们一遍又一遍地对所有输入执行此操作,那么堆栈的内容将等于x^m
,其中x
是a
和{{1}中的任何一个更频繁地发生,b
是每个符号数量差异的绝对值。
要接受您的语言,您必须简单地识别输入用尽并且堆栈包含等于m
的情况。这可以通过添加一些状态和lambda / epsilon转换来清除堆栈和/或进入接受状态来完成。
感谢Peter Leupold指出其他原始答案的语法错误。我试图解决它并且不知道答案得到多久,所以我省略了。我将简单地补充说,另一种可能性是为语言生成CFG并使用算法为其派生PDA。在这种情况下,对我来说,直接给PDA是不那么罗嗦的。