如何找出NPDA以下接受的语言

时间:2020-02-04 08:37:41

标签: computer-science automata automata-theory

我想了解如何找到下面的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, λ)}

1 个答案:

答案 0 :(得分:1)

基于这些转换,我将假设最终状态为q2并接受带有空堆栈的堆栈(看起来它甚至消除了堆栈底部符号z,这对我来说有点不寻常,但是我想很好)。

这些转换是这些

δ(q0, a, z) = {(q1 , 0), (q2 , λ)}
δ(q1, b, 0) = {(q1, 1)}
δ(q1, b, 1) = {(q1, 1)}
δ(q1, a, 1) = {(q2, λ)}

让我们一次带他们一个。

  1. δ(q0, a, z) = {(q1 , 0), (q2 , λ)}意味着如果我们处于初始状态并且看到a,则可以进入状态q1并将z替换为0,否则我们可以摆脱z进入状态q2。这实际上是NPDA的可接受配置。这意味着NPDA接受空字符串,而我们确定的任何语言也必须包含该字符串。因为离开初始状态q0的唯一其他方法是看到a,所以我们也知道,我们语言中的任何非空字符串都必须以a开头。

  2. δ(q1, b, 0) = {(q1, 1)}意味着如果我们现在处于状态q1,请在输入中看到b并将0放在堆栈顶部,我们可以将堆栈符号更改为1。从q1进入q0的状态后,我们将立即进入此配置。请注意,由于没有其他过渡将0放在栈顶,因此这是唯一可以使用此过渡的时间。并且确实必须使用它,因为q1不被接受,我们必须经历此过渡才能清除栈顶的0。因此,该语言中所有非空的字符串都必须以ab开头。

  3. δ(q1, b, 1) = {(q1, 1)}意味着如果我们处于状态q1,则在输入中看到b并在堆栈顶部有一个1可以永远消耗更多b。只要输入中有更多b,我们就将保持此配置。但是,我们不必一定要经历这种状态:还有其他过渡将1放在栈顶,并且进入接受状态的路径可能根本不涉及此过渡。通过此过渡,我们可以在上次过渡中看到的所需b之后放置任意数量的b

  4. δ(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`。

回顾:

  1. 空字符串使用的语言是
  2. 该语言中的任何非空字符串都以ab开头
  3. 该语言中的任何非空字符串在中间可以有任意数量的b
  4. 该语言中的任何非空字符串都以a结尾。

将所有内容放在一起,我们发现描述该语言的正则表达式:e + abb*a。我们不应该对此感到惊讶,因为此NPDA的堆栈中仅包含零到两个元素。因为使用的堆栈数量是恒定的,所以NPDA相当于某些DFA,因此其语言必须是规则的。