📜  NPDA 接受语言 L = {aibjckdl | i==k 或 j==l,i>=1,j>=1}

📅  最后修改于: 2021-09-27 22:46:37             🧑  作者: Mango

先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 L = { a^ib^jc^kd^l : i==k 或 j==l, i>=1, j>=1}, 即

L = {abcd, aabccd, aaabcccd, abbcdd, aabbccdd, aabbbccddd, ......} 

在每个字符串,a 的数量后跟任意数量的 b,b 后跟 c 的数量等于 a 的数量,c 的数量后跟 d 的数量等于 b 的数量。

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

\Gamma = { a, b, c, d, z }

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

用于构建PDA的方法 –
在设计 NPDA 时,对于每个 a’、’b’、’c’ 和 ‘d’ 都将按正确的顺序出现。

  • 对于 i==k :每当 ‘a’ 出现时,将其压入堆栈,如果 ‘a’ 再次出现则将其压入堆栈。之后,如果 ‘b’ 出现,则不进行任何操作。之后,当’c’出现时,每次都从堆栈中弹出’a’。之后,如果’d’出现,则不做任何操作。
  • 对于 j==l :每当 ‘a’ 来时,不做任何操作。之后,如果 ‘b’ 来将其压入堆栈,如果 ‘b’ 再次出现则也将其压入堆栈。之后,当’c’出现时不做任何操作。之后,如果’d’出现则每次都从堆栈中弹出’b’。

这样栈就变空了。如果栈是空的,那么我们就可以说这个字符串被PDA接受了。

堆栈转换函数 –

\delta (q0, a, z) \vdash (q1, az) \delta (q0, a, z) \vdash (q3, z) \delta (q1, a, a) \vdash (q1, aa) \delta (q1, b, a) \vdash (q1, a) \delta (q1, c, a) \vdash (q2, \epsilon ) \delta (q2, c, a) \vdash (q2, \epsilon ) \delta (q2, d, \epsilon ) \vdash (q2, \epsilon ) \delta (q2, \epsilon , z) \vdash (qf1, z) \delta (q3 a, z) \vdash (q3, z) \delta (q3 b, z) \vdash (q3, bz) \delta (q3 b, b) \vdash (q3, bb) \delta (q3 c, b) \vdash (q3, b) \delta (q3, d, b) \vdash (q4, \epsilon ) \delta (q4, d, b) \vdash (q4, \epsilon ) \delta (q4, \epsilon , z) \vdash (qf2, z)

其中,q0 = 初始状态
qf1, qf2 = 最终状态
\epsilon = 表示弹出操作

所以,这是我们接受语言 L ={ 所需的非确定性 PDA a^ib^jc^kd^l : i==k 或 j==l, i>=1, j>=1}。