📅  最后修改于: 2020-12-17 07:52:01             🧑  作者: Mango
输入磁带:输入磁带分为许多单元格或符号。输入头是只读的,一次只能从左向右移动一个符号。
有限控件:有限控件具有一些指针,该指针指向要读取的当前符号。
堆栈:堆栈是一种结构,在该结构中,我们只能从一端推入和取出物品。它具有无限大小。在PDA中,堆栈用于临时存储项目。
PDA可以定义为7个组件的集合:
问:有限状态集
∑:输入集
Γ:可以从堆栈中推送和弹出的堆栈符号
q0:初始状态
Z: Γ中的起始符号。
F:一组最终状态
δ:用于从当前状态移动到下一状态的映射函数。
ID是PDA如何计算输入字符串并决定是否接受字符串的非正式表示法。
瞬时描述是一个三元组(q,w,α),其中:
q描述当前状态。
w描述剩余的输入。
α描述堆栈的内容,在左上方。
⊢符号描述旋转门符号,代表一动。
⊢*符号描述一系列移动。
例如,
(p,b,T)⊢(q,w,α)
在上面的示例中,当从状态p转换到q时,输入符号'b'被消耗,堆栈'T'的顶部由新字符串α表示。
设计用于接受语言的PDA {a n b 2n | n> = 1}。
解决方案:在这种语言中,n个n后面应该是2n个b。因此,我们将应用一个非常简单的逻辑,即如果读取单个“ a”,则将两个a压入堆栈。一旦我们读了“ b”,那么对于每个单个“ b”,只有一个“ a”应该从堆栈中弹出。
ID可以构造如下:
δ(q0, a, Z) = (q0, aaZ)
δ(q0, a, a) = (q0, aaa)
现在,当我们读取b时,将状态从q0更改为q1并开始弹出相应的'a'。因此,
δ(q0, b, a) = (q1, ε)
因此,除非读取所有符号,否则将重复执行弹出“ b”的过程。请注意,弹出操作仅在状态q1中发生。
δ(q1, b, a) = (q1, ε)
读取所有b后,所有对应的a都应弹出。因此,当我们将ε读作输入符号时,堆栈中应该没有任何内容。因此,此举将是:
δ(q1, ε, Z) = (q2, ε)
哪里
PDA =({q0,q1,q2},{a,b},{a,Z},δ,q0,Z,{q2})
我们可以将ID概括为:
δ(q0, a, Z) = (q0, aaZ)
δ(q0, a, a) = (q0, aaa)
δ(q0, b, a) = (q1, ε)
δ(q1, b, a) = (q1, ε)
δ(q1, ε, Z) = (q2, ε)
现在,我们将为输入字符串“ aaabbbbbb”模拟此PDA。
δ(q0, aaabbbbbb, Z) ⊢ δ(q0, aabbbbbb, aaZ)
⊢ δ(q0, abbbbbb, aaaaZ)
⊢ δ(q0, bbbbbb, aaaaaaZ)
⊢ δ(q1, bbbbb, aaaaaZ)
⊢ δ(q1, bbbb, aaaaZ)
⊢ δ(q1, bbb, aaaZ)
⊢ δ(q1, bb, aaZ)
⊢ δ(q1, b, aZ)
⊢ δ(q1, ε, Z)
⊢ δ(q2, ε)
ACCEPT
设计用于接受语言{0 n 1 m 0 n | m,n> = 1}。
解决方案:在此PDA中,n个数字为0,后跟任意数量的1,后跟n个数字为0。因此,这种PDA的设计逻辑如下:
遇到第一个0时将所有0压入堆栈。然后,如果我们读1,则什么也不做。然后读取0,每次读取0时,从堆栈中弹出一个0。
例如:
这种情况可以以ID形式编写为:
δ(q0, 0, Z) = δ(q0, 0Z)
δ(q0, 0, 0) = δ(q0, 00)
δ(q0, 1, 0) = δ(q1, 0)
δ(q0, 1, 0) = δ(q1, 0)
δ(q1, 0, 0) = δ(q1, ε)
δ(q0, ε, Z) = δ(q2, Z) (ACCEPT state)
现在,我们将为输入字符串“ 0011100”模拟此PDA。
δ(q0, 0011100, Z) ⊢ δ(q0, 011100, 0Z)
⊢ δ(q0, 11100, 00Z)
⊢ δ(q0, 1100, 00Z)
⊢ δ(q1, 100, 00Z)
⊢ δ(q1, 00, 00Z)
⊢ δ(q1, 0, 0Z)
⊢ δ(q1, ε, Z)
⊢ δ(q2, Z)
ACCEPT