如何弄清楚PDA识别的语言

时间:2011-10-19 13:16:15

标签: pushdown-automaton

我试图弄清楚如何推断PDA识别的语言,感觉我很接近但仍然错过了。以下面的PDA为例。我可以制作一个过渡图表来确定我的delta(过渡)是什么但是我从那里失去了。这不是家庭作业,只是本书的一个例子。下面是问题和过渡表:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我正确读取符号,它看起来像是L *,其中L是你只通过循环一次获得的语言。绕过循环,你会看到一个“c”,一些“a”,相同数量的“b”,然后是另一个“c”。所以L = ca ^ nb ^ nc,这个PDA的语言是(ca ^ nb ^ nc)*。

当然,请检查一下,如果我错了请告诉我。我还可以更好地解释一下我试图解决这个问题的过程。

编辑:解释我从哪里获得^ nb ^ n。

因此,堆栈仅以堆栈符号 Z 开始。所以最初,我们处于状态1,堆栈 Z - (1, Z )。然后我们看到一个c,然后我们转换到状态2,将$推入堆栈;所以我们在(2,$ Z )。然后让我们说我们看到连续的n个实例;每次,我们都会向堆栈添加一个新的c并返回到状态2.因此,我们现在处于配置状态(2,c ^ n $ Z )。假设我们然后看到b的一个实例。我们转换到状态3并从堆栈中删除c;我们的配置现在是(3,c ^(n-1)$ Z )。现在我们需要看到b的实例,直到我们在堆栈顶部有$ back;所以,在状态3中,我们可以看到(n-1)个b的实例,每个实例都会导致从堆栈中弹出一个c实例。看到b的这些实例后,我们将进行配置(3,$ Z )。最后,我们将看到另一个c和$的实例,在我们的初始配置(1, Z )中,我们可以弹出它并返回状态1。

(a ^ n)(b ^ n)来自这样一个事实:我们在堆栈中放入了尽可能多的c实例,因为我们在状态2中看到'a',并且我们在状态2和3中从堆栈中删除当我们看到b的实例时,堆栈中的c的多个实例。用于表示长度的n的选择完全是任意的...它仅用于指示a和b的实例数必须相同,如果我们能够在堆栈顶部看到$并转换回接受国。