📌  相关文章
📜  NPDA 接受语言 L = {wwR | w ∈ (a,b)*}

📅  最后修改于: 2021-09-27 14:53:09             🧑  作者: Mango

先决条件 – 下推自动机,下推自动机按最终状态接受
问题:设计一个接受语言 L = {wwR w ∈ (a, b)*} 的非确定性 PDA,即,

L = {aa, bb, abba, aabbaa, abaaba, ......} 

解释:
在这种类型的输入字符串,一个输入有多个转换状态,因此它被称为非确定性 PDA 并且输入字符串包含任何顺序的 ‘a’ 和 ‘b’。每个输入字母都有不止一种移动下一个状态的可能性。最后,当堆栈为空时,NPDA 会接受该字符串。在这个 NPDA 中,我们使用了一些符号,如下所示:

Γ = { a, b, z }

其中,Γ = 所有堆栈字母的集合
z = 堆栈起始符号
a = 输入字母
b = 输入字母

用于构建PDA的方法 –
由于我们要设计 NPDA,因此每次出现 ‘a’ 或 ‘b’ 时,要么压入堆栈,要么进入下一个状态。它依赖于一个字符串。当我们看到等于栈顶的输入字母表时,此时弹出操作应用于栈并移动到下一步。
因此,最后如果堆栈变空,那么我们可以说该字符串已被 PDA 接受。

堆栈转换函数

\delta (q0, a, z) \vdash (q0, az) \delta (q0, a, a) \vdash (q0, aa) \delta (q0, b, z) \vdash (q0, bz) \delta (q0, b, b) \vdash (q0, bb) \delta (q0, a, b) \vdash (q0, ab) \delta (q0, b, a) \vdash (q0, ba) \delta (q0, a, a) \vdash (q1, ∈) \delta (q0, b, b) \vdash (q1, ∈) \delta (q1, a, a) \vdash (q1, ∈) \delta (q1, b, b) \vdash (q1, ∈) \delta (q1, ∈, z) \vdash (qf, z)

其中,q0 = 初始状态
qf = 最终状态
∈ = 表示弹出操作

所以,这是我们接受语言 L = {wwR w ∈ (a, b)*} 所需的非确定性 PDA

例子:
我们将采用一个输入字符串:“abbbba”。

  • 从左到右扫描字符串
  • 第一个输入是 ‘a’ 并遵循以下规则:
  • 在输入 ‘a’ 和 STACK 字母 Z 上,将两个 ‘a’ 推入 STACK 为:(a, Z/aZ) 并且状态将为 q0
  • 在输入“b”和堆栈字母“a”上,将“b”推入堆栈中:(b, a/ba) 并且状态将为 q0
  • 在输入 ‘b’ 和 STACK 字母表 ‘b’ 上,将 ‘b’ 推入 STACK 为 : (b, b/bb) 并且状态将为 q0
  • 在输入 ‘b’ 和 STACK 字母表 ‘b’(状态为 q1)上,从 STACK 中弹出一个 ‘b’ 为:(b, b/∈) 并且状态将为 q1
  • 在输入 ‘b’ 和 STACK 字母表 ‘b’(状态为 q1)上,从 STACK 中弹出一个 ‘b’ 为:(b, b/∈) 并且状态将为 q1
  • 在输入 ‘a’ 和堆栈字母表 ‘a’ 和状态 q1 上,从堆栈中弹出一个 ‘a’ 为:(a, a/∈) 并且状态将保持为 q1
  • 在输入 ∈ 和堆栈字母 Z 上,转到最终状态(qf)为:(∈,Z/Z)

所以,最后栈变空了,我们就可以说这个字符串被PDA接受了。

问题:
设计一个确定性的 PDA 来接受语言 L = { wcwR w ∈ (a, b)*},即,

{aca, bcb, abcba, abacaba, aacaa, bbcbb, .......}

在每个字符串,出现在 c 左侧的子字符串与出现在 c 右侧的子字符串相反。

解释 :
这里我们需要以这样的方式维护字符串,即 c 左侧的子串正好是 c 右侧的反向子串。为此,我们使用了一个堆栈。在字符串’a’ 和 ‘b’ 中存在任何顺序,而 ‘c’ 只出现一次。当’c’出现时,弹出操作开始进入堆栈。当堆栈为空时,则接受语言。

Γ = {a, b, z} 

其中,Γ = 所有堆栈字母的集合
z = 堆栈起始符号
a = 输入字母
b = 输入字母

构建PDA所采用的方法:
因为我们想要设计 PDA In 每次当 ‘a’ 或 ‘b’ 出现时,我们都会压入堆栈并保持相同的状态 q0。当 ‘c’ 出现时,我们移动到下一个状态 q1 而不将 ‘c’ 压入堆栈。之后,当输入与堆栈顶部相同时,然后从堆栈中弹出并保持相同的状态。 POP 操作一直执行到输入字符串结束。最后当输入是 ∈ 然后移动到最终状态 qf。
如果堆栈变空,则接受语言。

其中,q0 = 初始状态
qf = 最终状态
z = 堆栈起始符号
∈= 表示弹出操作

堆栈转换函数:

\delta (q0, a, z) \vdash (q0, az) \delta (q0, a, a) \vdash (q0, aa) \delta (q0, b, z) \vdash (q0, bz) \delta (q0, b, b) \vdash (q0, bb) \delta (q0, a, b) \vdash (q0, ab) \delta (q0, b, a) \vdash (q0, ba) \delta (q0, c, a) \vdash (q1, a) \delta (q0, c, b) \vdash (q1, b) \delta (q1, a, a) \vdash (q1, ∈) \delta (q1, b, b) \vdash (q1, ∈) \delta (q1, ∈, z) \vdash (qf, z)

其中,q0 = 初始状态
qf = 最终状态
∈ = 表示弹出操作

所以,这是我们接受语言所需的确定性 PDA,

L = { wcwR w ∈ (a, b)*}