📅  最后修改于: 2023-12-03 15:39:48.778000             🧑  作者: Mango
按最终状态下推自动机(Pushdown Automata,PDA)是一种十分有用的自动机,它比有限状态自动机(FSM)更加强大,可以处理来自上下文无关文法(CFG)生成的语言。
在PDA中,读入的输入符号可以被弹出(pop)或者压入(push)栈中,同时状态也会随着输入符号的读取而改变。其特殊之处在于,对于任意的状态转移,都需要指定一个要弹出的栈符号和要推入的栈符号,与FSM只需要接受或不接受输入符号的判断相比,PDA更加高效而且灵活。
确定性上下文无关文法PDA(DPDA),即所有状态的状态转移都是确定的。确定性PDA在实现和理解上都比较简单和直观,因此通常是初学者学习和使用的对象。DPDA要么接受一串输入符号,要么拒绝,不存在“疑惑”或者“回溯”的情况。
以下是一个接受以a结尾、中间全部为b的CFG的DPDA状态转移图:
我们可以看到,该DPDA在读入a之前,会先将$Z_0$压入栈中;在读入b时,会将B压入栈中,同时弹出一个栈顶的$Z_0$;在读入a时,弹出B,并将栈顶的$Z_0$弹出,最后状态转移到q2。
以下是该DPDA的状态转移函数:
$δ(q_0, a, Z_0) = (q_1, \varepsilon)$
$δ(q_1, b, Z_0) = (q_1, BZ_0)$
$δ(q_1, b, B) = (q_1, BB)$
$δ(q_1, a, B) = (q_2, \varepsilon)$
其中,每一个转移函数的左边描述了它的前置状态、输入符号和栈顶符号,而右边则是转移到的状态和该条状态转移过程中要弹出的栈符号和要推入的栈符号。
非确定性PDA(NPDA)的状态中,可能会有一些状态的一些状态转移不确定,可能会停在多个状态上,并且拥有一个特殊的状态$q_{reject}$,表示拒绝输入。
以下是一个接受以a结尾、中间全部为b的CFG的NPDA状态转移图:
我们可以看到,该NPDA的状态转移图和之前的DPDA状态转移图比起来,多了一些虚线箭头和无法确定的状态转移,此时NPDA可以接受两种不同的输入字符串"bbaa"和"bbbaaa"。
在DPDA或者NPDA的最终状态下,如果栈为空,那么表示PDA接受输入。这时候,如果DPDA或者NPDA同时有多个最终状态,那么只要任意一个最终状态满足栈为空,那么PDA就会接受该输入。如果DPDA或者NPDA最终状态下,栈不为空,那么表示PDA拒绝输入。因此,我们需要特别注意DPDA或者NPDA在状态转移时是否保证了栈的安全性,否则就可能会发生栈的溢出。