我想了解如何找到下面的NPDA接受的语言。
M = {Q, Σ, Τ, δ, q0, z, F}
Q is a set of state: {q0, q1, q2}
Σ is alphabet: {a, b}
Τ is stack alphabet: {0, 1, z}
δ is transition function
z is stack start symbol
F is set of final state.
而且,它的转换函数在下面。
δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
δ(q1, b, 0) = {(q1, 1)}
δ(q1, b, 1) = {(q1, 1)}
δ(q1, a, 1) = {(q2, λ)}
答案 0 :(得分:1)
基于这些转换,我将假设最终状态为q2并接受带有空堆栈的堆栈(看起来它甚至消除了堆栈底部符号z,这对我来说有点不寻常,但是我想很好)。
这些转换是这些
δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
δ(q1, b, 0) = {(q1, 1)}
δ(q1, b, 1) = {(q1, 1)}
δ(q1, a, 1) = {(q2, λ)}
让我们一次带他们一个。
δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
意味着如果我们处于初始状态并且看到a
,则可以进入状态q1
并将z
替换为0
,否则我们可以摆脱z
进入状态q2
。这实际上是NPDA的可接受配置。这意味着NPDA接受空字符串,而我们确定的任何语言也必须包含该字符串。因为离开初始状态q0
的唯一其他方法是看到a
,所以我们也知道,我们语言中的任何非空字符串都必须以a
开头。
δ(q1, b, 0) = {(q1, 1)}
意味着如果我们现在处于状态q1
,请在输入中看到b
并将0
放在堆栈顶部,我们可以将堆栈符号更改为1
。从q1
进入q0
的状态后,我们将立即进入此配置。请注意,由于没有其他过渡将0
放在栈顶,因此这是唯一可以使用此过渡的时间。并且确实必须使用它,因为q1
不被接受,我们必须经历此过渡才能清除栈顶的0
。因此,该语言中所有非空的字符串都必须以ab
开头。
δ(q1, b, 1) = {(q1, 1)}
意味着如果我们处于状态q1
,则在输入中看到b
并在堆栈顶部有一个1
可以永远消耗更多b
。只要输入中有更多b
,我们就将保持此配置。但是,我们不必一定要经历这种状态:还有其他过渡将1
放在栈顶,并且进入接受状态的路径可能根本不涉及此过渡。通过此过渡,我们可以在上次过渡中看到的所需b
之后放置任意数量的b
。
δ(q1, a, 1) = {(q2, λ)} means that if we're in state
q1 , see an
a in the input and have a
1 on top of the stack, we can erase the stack and go to the accepting state. This means that any non-empty string in the language ends with a single
a`。
回顾:
ab
开头b
a
结尾。将所有内容放在一起,我们发现描述该语言的正则表达式:e + abb*a
。我们不应该对此感到惊讶,因为此NPDA的堆栈中仅包含零到两个元素。因为使用的堆栈数量是恒定的,所以NPDA相当于某些DFA,因此其语言必须是规则的。