我即将获得理论计算科学的最终成绩,在学习期间,我被困在绘制下推自动机(PDA)图上。
最后一次转换几乎总是
我理解这是指不使用任何输入字符串,弹出堆栈符号的末尾并且不将任何内容压入堆栈。
我遇到的问题是,这不会检查输入字符串是否为空,只是检查堆栈符号的末尾位于堆栈顶部。
对于像0 n 1 n 这样的语言,我们压入堆栈符号的末尾,然后每次从输入中读取0时都压入0。在第一个1上,我们开始将0弹出堆栈。在理想情况下,一旦我们到达输入字符串的末尾,堆栈上唯一的东西就是堆栈符号的结尾,我们可以进行最后的转换。如果输入中仍然有1,会发生什么情况。例如,输入字符串00111。
在剩余字符要消耗的情况下,我们不能使用过渡到接受状态吗?
是否应该从最终状态过渡到某些无效状态,以解决剩余的输入字符?
答案 0 :(得分:0)
对于像0 ^ n 1 ^ n这样的语言,我们推栈符号的末尾,然后每次从输入中读取0时都推0。在第一个1上,我们开始从堆栈中弹出0。
到目前为止正确。
在理想情况下,一旦我们到达输入字符串的末尾,堆栈上唯一的东西就是堆栈符号的末尾,我们可以进行最后的转换。
在这种情况下,不一定必须完全有过渡。在某种程度上取决于您如何定义PDA以及您希望PDA如何工作。 PDA通常可以通过接受状态,通过空堆栈或通过空状态和空堆栈一起接受。我更喜欢这些中的最后一个,因为它使想象力最少。但是,就计算能力而言,它们都是完全等效的定义。
如果输入中仍然有1,会发生什么情况。例如,输入字符串00111。
好问题。如果在清空堆栈后输入中有1,则该字符串不再是您尝试接受的语言。此时,您需要确定如何拒绝此输入。一种常见的方法是在这种情况下简单地不确定要进行的过渡。当这种情况发生并且输入仍然存在时,机器被称为“崩溃”,并且默认情况下,它无法接受输入。您可能会建议,另一种选择是添加一个新的“死”状态,以明确编码耗尽所有剩余输入的操作。
您是否需要具有明确的死状态,以及如何指示PDA接受状态,基本上都是您可以自由选择的约定(或由讲师为您指定的约定)。