一、概念
下推自动机的定义:一个不确定的PDA可以表达成一个7元组: M = (Σ, Q, Γ, δ, q0, Z0, F) 其中,Σ 是输入符号的有穷集合; Q 是状态的有限集合; q0 ∈ Q 是初始状态; Γ 为下推存储器符号的有穷集合; Z0∈Γ 为最初出现在下推存储器顶端的开始符号; F 是终止状态集合,F ⊆ Q; δ 是从 Q×(Σ∪{ε})×Γ 到 Q×Γ* 的子集的映射。
映射关系 δ(q, a, Z) = {(q1, γ1), (q2, γ2), …, (qm, γm)} 其中, q1, q2, …, qm∈Q, a∈Σ, Z∈Γ, γ1, γ2,…,γm∈Γ*。 该映射的意思是:当PDA处于状态 q,面临输入符号 a时,自动机将进入到 qi, i = 1, 2, …, m 状态,并以 γi 来代替下推存储器(栈)顶端符号Z,同时将输入头 指向下一个字符 。当 Z 被 γi 取代时,γi 的符号按照 从左到右的顺序依次从下向上推入到存储器。
特殊情况下,δ(q, ε, Z)={(q1, γ1), (q2, γ2), …, (qm, γm)} 时,输入头位置不移动,只用于处理下推存储器内部 的操作,叫作 “ε移动”。
这些定义我看得快炸了,没理解这是什么意思。下面是一个图,可能比较直观的显示出,下推自动机与有限自动机的区别就是多出一个下推存储器。
以上的定义都是教材的内容,如果光看理论,我反正是一头雾水,不知所云。不过结合一个例子可能会有所理解。下面的例子是判断一个句子是否能够被下推自动机所接受。
二、下推自动机接受的语言
下推自动机 M 所接受的语言定义为: T(M) = {x|x: (q0, Z0) (q, M γ), γ ∈Γ*, q ∈F }。下面通过这个例子来走一遍过程。看着下面这些符号实在是头大,不过通过具体的例子分析也不难理解。
对于输入 abbcbba 这个句子。下推自动机 是怎么样判断这个句子是否合法呢?它的处理步骤如下:
(一)、#是开始符号,0是初始状态。首先从输入带的第一个字符读入。输入了a,根据规则 1。将A压入栈。状态仍然为0;
(二)、状态为0,输入b。根据规则 2。将B压入栈,状态仍然为0.
(三)、状态为0,输入b。根据规则 2。将B压入栈,状态仍然为0.
(四)、状态为0,输入c。根据规则 3。将ε(空串)压入栈中,也就是什么都不做,状态变为1.
(五)、状态为1,输入b。根据规则 5。将B弹出栈,状态仍然为1.
(六)、状态为1,输入b。根据规则 5。将B弹出栈,状态仍然为1.
(七)、状态为1,输入b。根据规则 4。将A弹出栈,状态仍然为1。
到此为止,所有的字符读取完毕,此时检查到栈里面也只有开始字符,状态为1(中止状态)。因此abbcbba被此下推自动机所接受。
最后,我这里面所用到的语言可能不准确,但都是为了便于自己理解,,算法的实现过程可能有错误,如果各位看到有什么错误遗漏不当之处,还望不吝赐教,拜谢。
参考资料有:宗成庆的《统计自然语言处理》