573 字
3 分钟
[形式语言与自动机] 下推自动机
PDA
有栈用了
定义是一个七元组:
- 是一个有限的状态集合
- 是一个有限的输入符号集合
- 是一个有限的栈符号集合
- 是一个状态转移函数,定义为 ,其中 表示幂集
- 是初始状态
- 是初始栈符号
- 是接受状态集合
绘制PDA
状态转移条件形如,表示消费输入符号,且当前栈顶符号为时,然后将压入栈中
- ,表示消费输入符号,且当前栈顶符号为时,然后将栈顶符号弹出
- ,表示消费输入符号,且当前栈顶符号为时,不进行任何操作,保持栈顶符号不变
- ,表示不消费任何符号,且当前栈顶符号为时,不进行任何操作,保持栈顶符号不变
PDA的接受方式
- 终态接受:当输入字符串被完全消费,且PDA处于一个接受状态
- 空栈接受:当输入字符串被完全消费,且PDA的栈为空(栈底也被弹出)
PDA与DPDA
DPDA是确定性下推自动机,PDA是非确定性下推自动机
相比与PDA,DPDA有以下限制:
- 对于同一个输入符号,从同一个状态和栈顶符号出发,最多只能有一个转移
- 如果存在转移,则不能有任何其他转移(读还是不读输入符号)
DPDA推荐使用终态接受方式,DPDA中终态接受强于空栈接受
一些技巧
由于PDA只能看见栈顶和当前输入,看不到栈中更下方的符号,因此在设计PDA时,可以自定义栈符号来存储一些结构化信息,例如可以将字母表产生的组合表示为符号,这样就可以在一次转移中看到更多的信息,这个方法还可以用来计数,比如用表示刚刚已经压入了个,而且还可以用来实现条件分支
[形式语言与自动机] 下推自动机
https://alkaid114.github.io/posts/automata/pda/