先决条件——下推自动机,下推自动机被最终状态接受
问题 –设计一个非确定性的 PDA 来接受语言 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 个堆栈字母表:
= { a, b, c, d, z }
在哪里,
= 所有堆栈字母的集合
z = 堆栈起始符号
用于构建PDA的方法 –
在设计 NPDA 时,对于每个 a’、’b’、’c’ 和 ‘d’ 都将按正确的顺序出现。
- 对于 i==k :每当 ‘a’ 出现时,将其压入堆栈,如果 ‘a’ 再次出现则将其压入堆栈。之后,如果 ‘b’ 出现,则不进行任何操作。之后,当’c’出现时,每次都从堆栈中弹出’a’。之后,如果’d’出现,则不做任何操作。
- 对于 j==l :每当 ‘a’ 来时,不做任何操作。之后,如果 ‘b’ 来将其压入堆栈,如果 ‘b’ 再次出现则也将其压入堆栈。之后,当’c’出现时不做任何操作。之后,如果’d’出现则每次都从堆栈中弹出’b’。
这样栈就变空了。如果栈是空的,那么我们就可以说这个字符串被PDA接受了。
堆栈转换函数 –
(q0, a, z) (q1, az) (q0, a, z) (q3, z) (q1, a, a) (q1, aa) (q1, b, a) (q1, a) (q1, c, a) (q2, ) (q2, c, a) (q2, ) (q2, d, ) (q2, ) (q2, , z) (qf1, z) (q3 a, z) (q3, z) (q3 b, z) (q3, bz) (q3 b, b) (q3, bb) (q3 c, b) (q3, b) (q3, d, b) (q4, ) (q4, d, b) (q4, ) (q4, , z) (qf2, z)
其中,q0 = 初始状态
qf1, qf2 = 最终状态
= 表示弹出操作
所以,这是我们接受语言 L ={ 所需的非确定性 PDA : i==k 或 j==l, i>=1, j>=1}。