【发布时间】:2011-12-10 22:25:30
【问题描述】:
我试图弄清楚如何推断 PDA 识别的语言,并且感觉我很接近但仍然错过了。以下面的 PDA 为例。我可以制作一个过渡图表来弄清楚我的增量(过渡)是什么,但我从那里开始迷失了。这不是家庭作业,只是书中的一个例子。这是问题和转换表:
【问题讨论】:
-
转换符号到底是什么意思... b, c -> e 是什么意思?我习惯了不同的符号。
我试图弄清楚如何推断 PDA 识别的语言,并且感觉我很接近但仍然错过了。以下面的 PDA 为例。我可以制作一个过渡图表来弄清楚我的增量(过渡)是什么,但我从那里开始迷失了。这不是家庭作业,只是书中的一个例子。这是问题和转换表:
【问题讨论】:
如果我正确阅读符号,它看起来像是 L*,其中 L 是您通过只执行一次循环获得的语言。要循环,您会看到一个“c”,一些“a”,相同数量的“b”,然后是另一个“c”。所以 L = ca^nb^nc 并且这个 PDA 的语言是 (ca^nb^nc)*。
当然,检查一下,如果我错了,请告诉我。我还可以更好地解释我试图弄清楚这一点的过程。
编辑:解释我从哪里得到 a^nb^n。
所以堆栈从堆栈底部符号Z开始。所以最初,我们处于状态 1,堆栈 Z - (1, Z)。然后我们看到一个 c,然后我们转换到状态 2,将一个 $ 压入堆栈;所以我们在 (2, $ Z)。然后假设我们连续看到 n 个 a 的实例;每次,我们都会在堆栈中添加一个新的 c 并返回状态 2。因此,我们现在处于配置 (2, c^n $ Z) 中。假设我们看到了 b 的一个实例。我们转换到状态 3 并从堆栈中删除一个 c;我们的配置现在是 (3, c^(n-1) $ Z)。现在我们需要查看 b 的实例,直到我们有 $ 回到堆栈顶部;因此,在状态 3 中,我们可以看到 b 的 (n-1) 个实例,每个实例都会导致 c 的单个实例从堆栈中弹出。在看到 b 的这些实例后,我们将处于配置 (3, $ Z) 中。最后,我们将看到 c 的另一个实例,并且 $ 位于堆栈顶部,我们可以将其弹出并移回状态 1,在我们的初始配置 (1, Z) 中。
(a^n)(b^n) 来自这样一个事实,即我们将尽可能多的 c 实例放入堆栈中,就像我们在状态 2 中看到的 'a' 一样,我们在状态 2 和 3 中从堆栈中删除堆栈中的 c 实例与我们看到的 b 实例一样多。选择 n 来表示长度是完全任意的......它仅用于指示 a 和 b 的实例数必须相同,如果我们能够看到堆栈顶部的 $ 并转换回接受状态。
【讨论】: