下推自动机(PDA)

168 阅读2分钟

1.下推自动机(PushDown Autumata)定义

不同于有限自动机,PDA能够“记住”输入串中的一部分字符,具备存储功能。
相对应的模块称为下推存储器,只允许读写顶部的符号。

Snipaste_2022-11-07_17-45-12.png

Elements of the Theory of Computation

接下来给出形式化的定义:


定义 3.3.1 下推自动机是一个六元组M=(K,Σ,Γ,Δ,s,F)M = (K,\Sigma,\Gamma,\Delta,s,F),其中\

KK是有穷的状态集合
Σ\Sigma是所有输入符号的字母表
Γ\Gamma是所有栈符号的字母表
sKs \in K初始状态
FKF \subseteq K终结状体的集合
Δ\Delta转移关系,它是(K×(Σ    {e})×Γ)×(K×Γ)(K \times (\Sigma \; \cup \; \{e\})\times\Gamma^*) \times (K \times \Gamma^*)的有穷子集


对于MM的一个转移((p,a,β),(q,γ))Δ((p,a,\beta),(q,\gamma)) \in \Delta,可以解释为:
MM处于状态pp、栈顶为β\beta时,它可以从输入带读入aa,在栈顶用γ\gamma替换β\beta,然后进入状态qq

推入:把一个符号加到栈顶上
如:((p,u,e),(q,a))((p,u,e),(q,a))推入a

托出:把一个符号从栈顶移去
如:((p,u,a),(q,e))((p,u,a),(q,e))托出a

下面定义PDA的格局为K×Σ×ΓK \times \Sigma^* \times \Gamma^*的成员
第一个分量为机器的状态
第二个分量是尚未读过的输入部分
第三个分量是存储器中的内容,自顶向下

2.一些例子

例 3.3.1 让我们来设计一个PDA接受语言L={wcwR:w{a,b}}L = \{ wcw^R : w\in \{a,b\}^*\}

M=(K,Σ,Γ,Δ,s,F)M = (K,\Sigma,\Gamma,\Delta,s,F),其中K={s,f}K = \{s,f\}Σ={a,b,c}\Sigma = \{ a,b,c \}Γ={a,b}\Gamma = \{ a,b \}F={f}F = \{f\},而Δ\Delta包含下述五个转移:

(1)((s,a,e),(s,a))(1) ((s,a,e),(s,a))
(2)((s,b,e),(s,b))(2) ((s,b,e),(s,b))
(3)((s,c,e),(f,e))(3) ((s,c,e),(f,e))
(4)((f,a,a),(f,e))(4) ((f,a,a),(f,e))
(5)((f,b,b),(f,e))(5) ((f,b,b),(f,e))

其中转移(1)和转移(2)的作用是将ww部分的字符记录在栈中,
转移(3)的作用是对应识别cc,并且状态转移到f中,
转移(4)(5)的作用是检验wRw^R,检验当前读取字符与栈顶元素是否相同,并且从栈顶托出。


例 3.3.3 接着设计一个PDA接受语言L={w{a,b}:a,b个数相同}L = \{ w \in \{a,b\}^* : a,b个数相同\}

M=(K,Σ,Γ,Δ,s,F)M = (K,\Sigma,\Gamma,\Delta,s,F),其中K={s,q,f}K = \{s,q,f\}Σ={a,b}\Sigma = \{ a,b \}Γ={a,b,c}\Gamma = \{ a,b,c \}F={f}F = \{f\},而Δ\Delta包含下述转移:

(1)((s,e,e),(q,c))(1) ((s,e,e),(q,c))
(2)((q,a,c),(q,ac))(2) ((q,a,c),(q,ac))
(3)((q,a,a),(q,aa))(3) ((q,a,a),(q,aa))
(4)((q,a,b),(q,e))(4) ((q,a,b),(q,e))
(5)((q,b,c),(q,bc))(5) ((q,b,c),(q,bc))
(6)((q,b,b),(q,bb))(6) ((q,b,b),(q,bb))
(7)((q,b,a),(q,e))(7) ((q,b,a),(q,e))
(8)((q,e,c),(f,e))(8) ((q,e,c),(f,e))

其中转移(1)的作用是在起始状态下往栈底填入cc以标识栈底位置,转移(2)(3)(5)(6)均为读取相应字符并且填入栈顶。转移(4)(7)则是消去当前与栈顶元素不同的元素。转移(8)是到达栈底进入终止状态。