下推自动机:空输入与空堆栈

Pushdown Automaton: Empty input versus empty stack

我有一个理论计算科学期末考试,在学习期间我被困在绘制下推自动机 (PDA) 图上。

最后一个转换几乎总是

我理解这意味着消耗 none 输入字符串,弹出堆栈符号的末尾并且不将任何内容压入堆栈。

我被卡住的地方是这不检查输入字符串是否为空,只是检查堆栈顶部的堆栈符号结束。

对于像 0n1n 这样的语言,我们压入堆栈符号的末尾,然后在每次出现 0 时压入 0从输入中读取。在第一个 1 上,我们开始从堆栈中弹出 0。在理想情况下,一旦我们到达输入字符串的末尾,堆栈上唯一的东西就是堆栈符号的末尾,我们可以进行最后一次转换。如果输入中仍然有 1,会发生什么。例如输入字符串 00111.

我们不能使用 过渡到接受状态,同时还有剩余字符可供使用吗?

是否应该从最终状态过渡到某个死状态,以解释剩余的输入字符?

For a language like 0^n 1^n we push the end of stack symbol, then push a 0 every time a 0 is read from the input. On the first 1 we begin popping the 0s off the stack.

到目前为止正确。

In an ideal world once we get to the end of the input string the only thing on the stack will be the end of stack symbol and we can take that last transition.

在这种情况下,不一定一定要有转换。这在一定程度上取决于您如何定义 PDA 以及您希望 PDA 如何工作。 PDA 通常可以通过接受状态、通过空堆栈或同时通过空状态和空堆栈来接受。我更喜欢最后一个,因为它最少留给想象。然而,它们在计算能力方面都是完全等价的定义。

What happens if there are still 1s in the input. For example, an input string of 00111.

好问题。如果在清空堆栈后输入中有 1,则该字符串不再是您尝试接受的语言。此时,您需要决定要如何拒绝此输入。一种常见的方法是在这种情况下简单地保留未定义的过渡。当发生这种情况并且输入仍然存在时,机器被称为 "crash",并且默认情况下,它无法接受输入。正如您可能建议的那样,另一种选择是添加一个新的 "dead" 状态来显式编码耗尽所有剩余输入的操作。

您是否需要有明确的死状态,以及您希望如何指示您的 PDA 接受,基本上是您可以自由选择的约定(或者由您的导师指定)。