下推自动机


2021-03-03 12:10:02 数学形式语言与自动机计算理论形式语言上下文无关语言上下文无关文法下推自动机

“无限状态自动机”:由无穷多个有限状态自动机组成的自动机L=n=00n1n={0n1nn0}L=\sum_{n=0}^\infty\bm 0^n\bm 1^n=\{0^n1^n|n\geq 0\}

# 下推自动机(Pushdown Automata, PDA)形式定义

PDA

PDA为一个七元组PP

P=(Q,Σ,Γ,δ,q0,Z0,F)P=(Q, \Sigma, \Gamma, \delta, q_0, Z_0, F)

  • QQ:有穷状态集
  • Σ\Sigma:字母表(有穷输入符号集)
  • Γ\Gamma:有穷栈符号集
  • δ\delta:状态转移函数,δ:Q×(Σ{ε})2Q×Γ\delta:Q\times(\Sigma\cup\{\varepsilon\})\rightarrow 2^{Q\times\Gamma^*}
  • q0q_0:初始状态,q0Qq_0\in Q
  • Z0Z_0:栈底符号,Z0ΓΣZ_0\in\Gamma-\Sigma
  • FF:终结状态集(接受状态集),FQF\subseteq Q

# 定义PDA的动作(状态转移函数详解)

对PDA的当前状态qQq\in Q、输入字符aΣa\in\Sigma、当前栈顶符号ZZ,状态转移函数:

δ(q,a,Z)={(p,β)pQ,βΓ}\delta(q,a,Z)=\{(p,\beta)|p\in Q,\beta\in\Gamma^*\}

表示PDA的状态转移为pQp\in Q、栈顶符号修改为字符串β\beta,且转移过程是非确定的。每一个状态的状态转移图表示为:

a,Z/β
q
p
  • 栈顶的一个符号ZZ修改为字符串β\beta\rightarrow弹出栈顶符号后再压入多个符号
  • 栈顶的一个符号ZZ修改为空串ε\varepsilon\rightarrow只弹出栈顶符号不压入符号

由定义可知,PDA还具有空转移能力:

δ(q,ε,Z)={(p,β)pQ,βΓ}\delta(q,\varepsilon,Z)=\{(p,\beta)|p\in Q,\beta\in\Gamma^*\}

每一个状态的状态转移图表示为:

ε,Z/β
q
p

综合得一次状态转移的状态转移图:

a,Z/β1
a,Z/...
a,Z/βi
ε,Z/...
ε,Z/βj
q
p1
...
pi
...
pj

# 例:语言L=n=00n1n={0n1nn0}L=\sum_{n=0}^\infty\bm 0^n\bm 1^n=\{0^n1^n|n\geq 0\}的PDA

0,Z_0/0Z_0
0,0/00
1,0/ε
1,0/ε
ε,Z0/Z0
q0
q1
q2接受

# PDA的瞬时描述

PDA的瞬时描述(Instantaneous Description, ID)定义为:

(q,w,γ)Q×Σ×Γ(q,w,\gamma)\in Q\times\Sigma^*\times\Gamma^*

表示此时PDA处于状态qq,剩余输入串为ww,栈内符号串为γ\gamma

# ID的转移

若PDAPP某一步状态转移(p,β)δ(q,a,Z)(p,\beta)\in\delta(q,a,Z),则这一步PDA的状态将由(q,aw,Zα)(q,aw,Z\alpha)变为(p,w,βα)(p,w,\beta\alpha),称为ID的转移,记为P\vdash_P

(p,β)δ(q,a,Z)(q,aw,Zα)P(p,w,βα)(p,\beta)\in\delta(q,a,Z)\Leftrightarrow(q,aw,Z\alpha)\vdash_P(p,w,\beta\alpha)

进一步,对于瞬时描述IIJJKK,可递归定义P\vdash_P^*

IPIIPJJPKIPK\begin{aligned} &I\vdash_P^*I\\ &I\vdash_PJ\wedge J\vdash_P^*K\Rightarrow I\vdash_P^*K\\ \end{aligned}

PP已知时可省略记为\vdash\vdash^*

# PDA的性质

# PDA一次状态转移不会用到输入字符之后的部分和栈顶符号之下的部分

(q,x,α)P(p,y,β)(q,xw,αγ)P(p,yw,βγ)(q,x,\alpha)\vdash_P^*(p,y,\beta)\Rightarrow(q,xw,\alpha\gamma)\vdash_P^*(p,yw,\beta\gamma)

# PDA多次状态转移不会用到输入字符之后的部分(但是可能会用到栈顶符号之下的部分)

(wΣ)(q,xw,αγ)P(p,yw,βγ)(q,x,α)P(p,y,β)(\forall w\in\Sigma^*)(q,xw,\alpha\gamma)\vdash_P^*(p,yw,\beta\gamma)\Rightarrow(q,x,\alpha)\vdash_P^*(p,y,\beta)

# PDA的语言

对于一个PDAP=(Q,Σ,Γ,δ,q0,Z0,F)P=(Q, \Sigma, \Gamma, \delta, q_0, Z_0, F),定义了两种接收语言的方式。

# L(P)\bm L(P):以终态方式接收的语言

这种语言中的字符串读取结束时可以让PDA运行到接受状态:

L(P)={w(q0,w,Z0)P(p,ε,γ),pF}\bm L(P)=\{w|(q_0,w,Z_0)\vdash_P^*(p,\varepsilon,\gamma),p\in F\}

# N(P)\bm N(P):以空栈方式接收的语言

这种语言中的字符串读取结束时可以让PDA的栈底符号弹出(栈弹空,使PDA无法正常运行):

L(P)={w(q0,w,Z0)P(p,ε,ε),pF}\bm L(P)=\{w|(q_0,w,Z_0)\vdash_P^*(p,\varepsilon,\varepsilon),p\in F\}

以空栈方式接收的语言有时可以让PDA的设计更加简单。

# 终态方式和空栈方式的等价性(未完成)

(L)PF(\forall L)P_F