0%

形式语言与自动机理论(4)下推自动机

下推自动机


一个下推自动机和一个$\epsilon$-NFA类似,拥有一个无限长的输入带,一个有穷状态控制器,一个读头。同时具有$\epsilon$-NFA的特性:

  • 有限状态
  • 非确定
  • $\epsilon$转移
    与之不同的是,下推自动机增加一个符号栈,符号栈有一个读写头,读写的时候后进先出,只用栈顶,栈长度无限。
  • $pop$:仅仅弹出栈顶一个符号
  • $push$:可压入一个符号

读头从输入带上一次读入一个字符,并向右移动一个单位长度,控制符号栈读头弹出一个符号。有穷控制器根据读入的字符,弹出的栈顶符号以及当前的状态,修改当前状态,并向符号栈压入一个新串。

下推自动机能识别的语言比有穷自动机更多

形式定义

下推自动机(PDA,Pushdown Automata),$P$为七元组

  • $Q$:有穷状态集
  • $\Sigma$:有穷输入符号集
  • $\Gamma$:有穷栈符号集
  • $\delta:Q \times (\Sigma \cup \lbrace \epsilon \rbrace) \times \Gamma \to 2^{Q \times \Gamma^{\ast}}$:状态转移函数
  • $q_0 \in Q$:初始状态
  • $Z_0 \in \Gamma - \Sigma$:栈底符号
  • $F \subseteq Q$:接受状态集或终态集

如果$q,p_i \in Q(1 \leq i \leq m)$,$a \in \Sigma$,$Z \in \Gamma$,$\beta_i \in \Gamma^{\ast}$,可以有动作

对于状态为$q$的情况,接受一个字符$a$或者$\epsilon$,当栈顶为$Z$时,弹出$Z$,接下来可以压入串$\beta_i$,并跳到状态$p_i$;也可以压入串$\beta_j$,并跳到状态$p_j$,对应的状态转移图如下:

例1:设计识别$L_{01}=\lbrace 0^n1^n \vert n \geq 1 \rbrace$的PDA。

正则语言不能表示的语言,PDA可以表达。当读入0的时候,把0都压入栈中;当读入1时,弹出一个0。当读完最后一个符号,如果正好栈置0,可以通过空转移跳转到接受状态。为此引入一个栈底符号$Z_0$,它事先存在于栈中。

一开始,状态为$q_0$时对应接受0的状态,当栈顶是$Z_0$和0时压入一个0。当读到1且栈顶为0,就跳转到$q_1$准备接受1,此后每次读1都出栈一个0。如果串合法,读完后栈顶是$Z_0$,此时通过空转移跳转到接受状态。

例2:设计识别$L_{wwr} = \lbrace ww^R \vert w \in (0+1)^{\ast} \rbrace$

即识别01构成的回文串。在读$w$的时候压栈,读$w^R$时出栈,则出栈的符号和读入的符号相同。具体流程是:在读$w$时候对应$q_0$,无论栈顶是什么,都仅把读入的压栈,两种读入,三种栈顶情况,一共考虑六种可能。读完$w$后,通过$\epsilon$-转移转移到$q_1$开始读$w^R$,考虑三种栈顶可能。在$q_1$状态时吗,读入和栈顶相等时,只弹出。当读完$ww^R$,栈顶变为$Z_0$,通过空转移跳转到接收状态。

瞬时描述和转移符号

定义:为描述PDA瞬间的格局,定义$Q \times \Sigma^{\ast} \times \Gamma^{\ast}$中三元组$(q,w,\gamma)$为瞬时描述(ID,Instananeous Description),表示此时PDA处于状态$q$,剩余输入串$w$,栈中当前全部符号为$\gamma$

定义:在PDA $P$中如果$(p,\beta) \in \delta(q,a,Z)$,由$(q,aw,Z\alpha)$到$(p,w,\beta\alpha)$,称为$ID$的转移$\vdash_P$,记为

其中$w \in \Sigma^{\ast}, \ \alpha \in \Gamma^{\ast}$
若有$ID \ I,J,K$,递归定义$\vdash_P^{\ast}$为:

  • $I \vdash_P^{\ast} I$
  • 若$I \vdash_P^{\ast} J,\ J \vdash_P^{\ast} K$,则$I \vdash_P^{\ast} K$

若$P$已知,可省略,记为$\vdash$和$\vdash^{\ast}$

续例:语言$L_{01} = \lbrace 0^n1^n \vert n \geq 1 \rbrace$的PDA,识别0011时的$ID$序列。

定理23:对$\forall w \in \Sigma^{\ast}, \forall \gamma \in \Gamma^{\ast}$,如果

那么

即:“输入串后加一个$w$,栈后面加一个$\gamma$,$ID$依然可以转移”,原因是PDA没有用到输入串$x$之后的部分$w$和栈$\beta$后的部分$\gamma$

定理24
对$\forall w \in \Sigma^{\ast}$,如果

那么

因为转移过程输入串没有用到$w$,所以可以删掉。

注意对栈不实用删除$w$

下推自动机接受的语言

定义:PDA $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$

  • $P$以终态方式接受的语言,记为$\boldsymbol{L}(P)$,定义为
  • 以空栈方式接受的语言,记为$\boldsymbol{N}(P)$,定义为

续例2:识别$L_{wwr} = \lbrace ww^R \vert w \in (0+1)^{\ast} \rbrace$ 的PDA $P$,从终态方式接受,改为空栈方式接受。

用$\delta(q_1,\epsilon,Z_0)=\lbrace(q_1,\epsilon) \rbrace$代替$\delta(q_1,\epsilon,Z_0)=\lbrace (q_2,Z_0)\rbrace$即可。

从终态方式到空栈方式

定理25:如果PDA $P_F$以终态方式接受语言$L$,那么一定存在PDA $P_N$以空栈方式接受$L

证明:设$P_F=(Q,\Sigma, \Gamma,\delta_F,q_0,Z_0,F)$,构造PDA $P_N$
模拟$P_F$

增加一个状态$p0$,用$\epsilon$转移把$P_F$的栈底符压入栈中,然后让$P_F$去接受他该接受的字符串,当完成字符串读取,他的状态会落入到某一个接受状态中(例如$q{fi}$或$q{f_j}$),再利用空转移,再利用$\epsilon$转移将栈中符号弹出,跳转到$p$,再$p$中再利用空转移,将栈中符号全部弹出,栈空。即:如果一个串可以被$P_F$接受,那么也一定可以再$p$状态被$P_F$以空栈方式接受。

由于大部分都是模拟$P_F$,所以其中的$\delta_N$大部分是$P_F$的状态转移函数。$\delta_N$的定义如下:

  • $P_N$首先将$P_F$的栈底符号压栈,开始模拟$P_F$:
  • $P_N$模拟$P_F$的动作:$\forall q \in Q, \ \forall a \in \Sigma \cup \lbrace \epsilon \rbrace,\ \forall Y \in \Gamma$
  • 从$q_f \in F$开始弹出栈中符号,即$\forall q_f \in F,\forall Y \in \Gamma \cup \lbrace X_0 \rbrace$
  • 在状态$p$时,弹出全部栈中符号,即$\forall Y \in \Gamma \cup \lbrace X_0 \rbrace$

接下来证明构造的正确性。对于$\forall w \in \Sigma^{\ast}$有:

即$\boldsymbol{N}(P_F) \subseteq \boldsymbol{L}(P_N)$
对$\forall w \in \Sigma^{\ast}$有

即$\boldsymbol{N}(P_N) \subseteq \boldsymbol{L}(P_F)$,所以$\boldsymbol{N}(P_N) = \boldsymbol{L}(P_F)$

从空栈方式到终态方式

定理26:如果PDA $P_N$以空栈方式接受语言$L$,那么一定存在PDA $P_F$以以终态方式接受$L$

证明:设$P_N= (Q,\Sigma,\Gamma,\delta_N,q_0,Z_0,\emptyset)$,构造PDA $P_F$


其中$\delta_F$定义如下:

  • $P_F$开始时,将$P_N$栈底符号压入栈,并开始模拟$P_N$
    • $P_F$模拟$P_N$,$\forall q \in Q,\ \forall a \in \Sigma \cup \lbrace \epsilon \rbrace, \ \forall Y \in \Gamma$:
  • 在$\forall q \in Q$时,看到$P_F$的栈底$X_0$,则转移到新终态$p_f$:

对$\forall w \in \Sigma^{\ast}$有

即$\boldsymbol{N}(P_N) \subseteq \boldsymbol{L}(P_F)$
对$\forall w \in \Sigma^{\ast}$有

即$\boldsymbol{N}(P_F) \subseteq \boldsymbol{L}(P_N)$,所以$\boldsymbol{L}(P_F) = \boldsymbol{N}(P_N)$

例3:接受$L=\lbrace 0,1 \rbrace^{\ast} \vert w \text{中字符0和1的数量相同} \rbrace$的PDA

例4:接受$L=\lbrace 0^n1^m \vert 0 \leq n \leq m \leq 2n \rbrace$的PDA

下推自动机与文法的等价性

由CFG到PDA

例5:设计语言$L=\lbrace 0^n1^m \vert 1 \leq m \leq n \rbrace$的PDA

续例5:设计语言$L=\lbrace 0^n1^m \vert 1 \leq m \leq n \rbrace$的CFG

字符串00011的最左派生:

续例5:语言$L=\lbrace 0^n1^m \vert 1 \leq m \leq n \rbrace$

用PDA栈顶符号的替换,模拟文法的最左派生

续例5:语言$L=\lbrace 0^n1^m \vert 1 \leq m \leq n \rbrace$

定理27:任何CFL $L$,一定存在PDA $P$,使$L=\boldsymbol{N}(P)$

构造与文法等价的PDA
如果CFG $G= (V,T,P^{\prime},S)$,构造PDA

其中$\delta$为:

  • $\forall A \in V$:
  • $\forall a \in T$:那么$\boldsymbol{L}(G) = \boldsymbol{N}(P)$

例6:为文法$S \to aAA,\ A \to aA \vert bS \vert a$,构造PDA

证明:往证

【充分性】往证

设$S \underset{lm}{\stackrel{\ast}{\Rightarrow}} w$中第$i$个左句型为$x_iA_i\alpha_i$,其中$x_i \in \Sigma^{\ast},A_i \in V,\alpha_i \in (V \cup T)^{\ast}$。并将$S$看作第0个左句型$x_0A_0\alpha_0=S$,那么

将$w$看作第$n$个左句型$x_nA_n\alpha_n=w$,那么

再对派生步骤$i$归证,往证

归纳基础:当左派生要0步时,显然成立

归纳递推:假设$i$步时上式成立,当第$i+1$步时,一定是$A_i \to \beta$应用到$x_iA_i\alpha_i$

变元$A{i+1}$一定再$\beta\alpha_i$中,设$A{i+1}$之前的终结符为$x^{\prime}$,则有

又因为$w=xiy_i=x_ix^{\prime}y{i+1}=x{i+1}y{i+1}$,所以有

那么,再PDA中从ID $(q,y_i,A_i\alpha_i)$模拟最左派生,用产生式$A_i \to \beta$替换栈顶$A_i$后,有

因此$S \underset{lm}{\stackrel{\ast}{\Rightarrow}} w \Rightarrow (q,w,S) \vdash^{\ast} (q,y_n,A_n\alpha_n)=(q,\epsilon,\epsilon)$,即充分性得证。

【必要性】往证更一般的,对任何变元$A$,都有:

可以看作“从输入带中消耗掉$x$”与“从栈中弹出$A$”两种作用相互抵消。对ID转移$(q,x,A) \vdash^i (q,\epsilon,\epsilon)$的次数$i$归纳证明。

归纳基础:当$i=1$次时,只能是$x=\epsilon$且$A \to \epsilon$为产生式,所以$A \underset{}{\stackrel{\ast}{\Rightarrow}} \epsilon$且$A

归纳递推:假设$i \leq n(n \geq 0)$时上式成立。当$i = n+1$时,因为$A$是变元,其第1步转移一定是

且$A \to Y_1 Y_2 \dots Y_m$是产生式,其中$Y_i$是变元或终结符,而其余的$n$步转移

中每个$Y_i$从栈中被完全弹出时,将消耗掉的那部分$x$记为$x_i$,那么显然有

而每个$Y_i$从栈中被完全弹出时,都不超过$n$步,所以由归纳假设

再由$A$的产生式$A \to Y_1 Y_2 \dots Y_m$,有

因此当$A=S,x=w$时,

成立,即必要性得证。所以,任何CFL都可由PDA识别。

构造与GNF格式文法等价的PDA
如果GNF格式的CFG $G=(V,T,P^{\prime},S)$,那么构造PDA

为每个产生式,定义$\delta$为:

续例6:文法$S \to aAA, A \to aS \vert bS \vert a$为GNF格式,构造等价的PDA

从PDA到CFG

定理:如果PDA $P$,由$L=\boldsymbol{N}(P)$,那么$L$是上下文无关语言。

构造与PDA等价的CFG
如果PDA $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$,那么构造CFG $G=(V,T,P^{\prime},S)$,其中$V$和$P^{\prime}$为:

  1. $V=\lbrace [qX_p] \vert p,q \in Q,X \in \Gamma \rbrace \cup \lbrace S \rbrace$
  2. 对$\forall p \in Q$,构造产生式$S \to [q_0Z_0p]$
  3. 对$\forall (p,Y_1 Y_2 \dots Y_n) \in \delta(q,a,X)$,构造$\vert Q \vert^{n}$个产生式

其中$a \in \Sigma \cup \lbrace \epsilon \rbrace, X,Y_i \in \Gamma$,而$r_i \in Q$是$n$次$\vert Q \vert$种状态的组合。若$i=0$,为$[qX_p] \to a$

例7:将PDA $P=(\lbrace p,q \rbrace,(0,1),\lbrace X,Z \rbrace, \delta, q,Z)$
转为CFG,其中$\delta$如下:

确定性下推自动机

定义:如果PDA $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$满足

  1. $\forall a \in \Sigma \cup \lbrace \epsilon \rbrace, \delta(q,a,X)$至多有一个动作
  2. $\forall a \in \Sigma$,如果$\delta(q,a,X) \not= \emptyset$,那么$\delta(q,\epsilon,X)=\emptyset$

则称$P$为确定型下推自动机(DPDA)

DPDA $P$以终态的方式接受的语言$\boldsymbol{L}(P)$称为DCFL

  • DPDA中$\forall (q,a,Z) \in Q \times \Sigma \times \Gamma$满足$\vert \delta(q,a,Z) \vert + \vert \delta(q,\epsilon,Z) \vert \leq 1$
  • DPDA与PDA不等价

例8:任何DPDA都无法接受$L_{wwr}$,但是可以接受

DCFL的重要应用

  • 非固有歧义语言的真子集
  • 程序设计语言的语法分析器
  • $LR(k)$文法,Yacc的基础,解析时间复杂度为$O(n)$

正则语言与DPDA

定理29:如果$L$是正则语言,那么存在DPDA $P$以终态方式接受$L$,即$L=\boldsymbol{L}(P)$

证明:显然,DPDA $P$可以不用栈而莫模拟任何DFA

  • $L_{wcwr}$显然CFL,所以DCFL语言类真包含正则语言
  • DPDA无法识别$L_{wwr}$,所以DCFL语言真包含于CFL

定义:如果语言$L$中不存在字符串$x$和$y$,使$x$是$y$的前缀,称语言$L$满足前缀性质

定理30:DPDA $P$且$L=\boldsymbol{N}(P)$,当且仅当$L$由前缀性质,且存在DPDA $P^{\prime}$使$L=\boldsymbol{L}(P^{\prime})$

  • DPDA $P$的$\boldsymbol{N}(P)$更有限,即使正则语言$\boldsymbol{0}^{\ast}$也无法接受
  • 但却可以被某个DPDA以终态方式接受

DPDA与歧义文法

定理31:DPDA $P$,语言$L=\boldsymbol{L}(P)$,那么$L$有无歧义的CFG

定理32:DPDA $P$,语言$L=\boldsymbol{N}(P)$,那么$L$有无歧义的CFG

  • 因此DPDA再语法分析中占重要地位
  • 但是并非所有固有歧义CFL都会被DPDA识别如$L_{wwr}$有无歧义文法$S \to 0S1 \vert 1S1 \vert \epsilon$

语言之间的关系:

Disqus评论区没有正常加载,请使用科学上网