📌  相关文章
📜  NPDA 接受语言 L = {a(m+n)bmcn | m,n≥1}

📅  最后修改于: 2021-09-28 09:24:57             🧑  作者: Mango

先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受该语言L = \{a^{(m+n)} b^m c^n| m, n \geq 1\}
给定语言的字符串将是:

L = {aabc, aaabcc, aaabbc, aaaabbcc, ......} 

在每个字符串,’b’ 和’c’ 的数量之和等于’a’ 的数量。所有的 c 都在 ‘a’ 和 ‘b’ 之后。

解释 –
在这里,我们需要保持a’s、b’s和c’s的顺序。也就是说,所有的 a 都首先出现,然后所有的 b 出现在所有的 c 之后。因此,我们需要一个堆栈和状态图。 a、b 和 c 的计数由堆栈维护。我们将采用 2 个堆栈字母:

\Gamma = { a, z }

在哪里, \Gamma = 所有堆栈字母的集合
z = 堆栈起始符号。

用于构建PDA的方法 –
由于我们要设计一个 NPDA,因此每次 ‘a’ 出现在 ‘b’ 之前并且 ‘b’ 出现在 ‘c’ 之前。首先我们必须计算 a 的数量,并且该数量应等于 b 的数量。当所有 b 完成后,然后计算 a 的数量,这应该等于 c 的数量。

对于所有的 ‘a’,我们每次都会将 ‘a’ 压入堆栈,然后在 ‘b’ 到来时开始弹出它们。在完成 ‘b’ 和 ‘c’ 的弹出后,我们每次都会从堆栈中弹出这些 ‘a’。因此,最后如果堆栈变空,那么我们可以说该字符串已被 PDA 接受。

堆栈转换函数 –

\delta (q0, a, z) \vdash (q0, az) \delta (q0, a, a) \vdash (q0, aa) \delta (q0, b, a) \vdash (q1, \epsilon ) \delta (q1, b, a) \vdash (q1, \epsilon ) \delta (q1, c, a) \vdash (q2, \epsilon ) \delta (q2, c, a) \vdash (q2, \epsilon ) \delta (q2,, \epsilon z) \vdash (qf, z)

其中,q0 = 初始状态
qf = 最终状态
\epsilon = 表示弹出操作。
状态转移图

注:此语言与语言相似L= \{a^m b^{(m+n)} c^n | m, n \geq 1\} ,但我们使用a^{(m+n)}代替b^{(m+n)} .