下推自动机

下推自动机

下推自动机有一个七元组定义:

下面给出一个例子:

 PDA的状态迁移图

PDA的瞬时描述

一个PDA的瞬时描述对应于一个三元组。

PDA瞬时描述的迁移:

 

PDA瞬时描述迁移的定理:

下推自动机接受的语言

  • 以终结状态的方式接受

PDA通过消耗输入并且j进入接受状态来接受它的输入串,这种方式称为"以终结状态接受",其形式化定义如下:

  • 以空栈方式接受

如果一个PDA的语言由所有从初始ID开始能够最终导致这个PDA的堆栈排空的串构成,那么称其为“以空栈方式接受”,其形式化定义如下:

 

 从空栈接受方式到终结状态接收方式

我们可以使用一个不在其堆栈符号表中的新符号X0,它既是PF的初始符号,也是一个放在栈底能让我们知道PN的堆栈已经为空了的标记。换句话说,如果PF在它的栈顶看到了X0,那么它就知道PN在同样的输入串上它的堆栈为空。其具体实现方式如下图:

 我们还需要一个新的初始状态p0,它唯一的作用就是把Z0(也就是PN的初始符号)压入堆栈中,然后进入状态q0(PN的初始状态)。在此之后,PF模拟PN,直到PN的堆栈符号为空——PF能够检测出这个事实,因为此时的栈顶符号为X0。最后,我们需要一个新的状态pf,它是PF的接受状态,当发现PN的堆栈符号会变为空时PF就转移到接受状态pf

从终结状态接受方式到空栈接受方式

现在可以考虑相反的方向:给定一个以终结状态方式接受的语言L的PDA PF,构造一个以空栈方式接受L的PDA PN

构造的过程比较简单,从PF的每一个接受状态,添加一个ε转移到一个新的状态p,当处在状态p时,PN从堆栈中弹出符号,同时不消耗任何输入。这样,只要PF在消耗输入w之后进入了接受状态,相应的PN就会在消耗了w之后清空堆栈。实现过程如下图:

为了避免PF清空了它的堆栈符号但是没有进入接受状态的情况,PN也一定要使用一个栈底标记X0,这个标记是PN的初始符号,PN必须从一个新的状态p0开始,p0的唯一作用就是把PF的初始符号压入堆栈并且进入PF的初始状态。

PDA和CFG的等价性

定理:一个语言由一个上下文无关文法生成当且仅当它能够被一个PDA接受。

从CFG到PDA

对于一个上下文无关的文法G=(V,T,Q,S),构造以空栈方式接受的PDA如下:

 

定理:如果一个PDA是通过上述方式转换而来的,那么N(P)=L(G)

从PDA到CFG

给定一个以空栈接受的PDA

构造出一个与之等价的CFG

首先构造CFG的非终止符合集V:

 然后需要构造的就是CFG的产生式R:

产生式分成两个部分:

第一个部分由PDA的初始状态和初始符号确定:

第二个部分由PDA的转移函数来确定:

  **其中的rk的含义是遍历PDA的状态集合的每个状态。

 下面给出一个例子:

构造终止字符集:

构造产生式:

剩下的产生式都根据PDA的转移函数来确定:

 定理:对于任意一个PDA P,存在一个上下文无关文法G满足L(G)=N(P)。

确定型PDA

 

也就是说存在两种类型的不确定性:一种是对于迁移的新状态的不确定,第二种是对于进行迁移时的输入符号的不确定性。

对于DPDA,两种接受方式并不是相同的,更确切的说,以空栈方式接受的语言正是以终结状态接受的语言且具有前缀性质的语言,前缀性质是指:语言中的任何串都不是其他串的前缀。

DPDA接受的语言:所有的正则语言都被DPDA(以终结状态方式)接受,而且存在被DPDA接受的非正则语言。DPDA语言是上下文无关语言,而且事实上是拥有无歧义文法CFG的语言。因此,DPDA是严格位于正则语言和上下文无关语言之间。

原文地址:https://www.cnblogs.com/TheFutureIsNow/p/11013305.html