自动机

自动机类型:有限自动机(finite automata,FA),下推自动机(push-down automata, PDA),线性界限自动机(linear-bounded automata)和图灵机(Turing machine)函数

有限自动机

肯定性有限自动机

DFA(deterministic automata) M 是一个五元组blog

$M=(\Sigma, Q, \delta, q_0, F)$input

其中,$\Sigma$是输入符号的有穷集合,Q 是状态的有限集合,$q_0 \in Q$是初始状态,F 是终止状态集合,$F \subseteq Q$,$\delta$ 是 $Q \times  \Sigma$ 到 Q(下一个状态)的映射,也称状态转移函数。it

注:$Q \times \Sigma$表示两个集合的直积,这里表示分别从两个集合中取任意元素的组成的有序对,生成有序对的集合。扩展

DFA M 接受的语言,记做T(M):gc

$T(M)=\lbrace x | \delta(q_0,x) \in F \rbrace$im

其中,x 表示一个句子,且 $x \in \Sigma^*$,咱们扩辗转移函数为,d3

$\hat {\delta}: Q \times \Sigma^* \rightarrow Q $统计

$\hat {\delta} (q, \epsilon) = q$top

$\hat {\delta}(q, xa) = \hat {\delta}(\delta(q, a),x)$

其中$x' \rightarrow xa$为右线性正则文法产生式(应用到句子上的状况)

不肯定性有限自动机

NFA(non-definite automata) M 是一个五元组

$M=(\Sigma, Q, \delta, q_0, F)$

其中,$\Sigma$是输入符号的有穷集合,Q 是状态的有限集合,$q_0 \in Q$是初始状态,F 是终止状态集合,$\delta$是直积$Q \times  \Sigma$ 到 Q的幂集的映射。集合的幂集是集合全部的子集(包括空集和自身)组成的集合,这个集合的元素个数为$2^{|Q|} = \sum_{i=0}^{|Q|} \binom {|Q|} {i}$

NFA与DFA不一样的是,DFA 的$\delta(q,a)$是一个肯定的状态做为下一个状态,而NFA的$\delta(q,a)$是一个集合,其中任一状态都有可能做为下一状态,

$\delta: Q \times \Sigma \rightarrow P(Q)$

咱们扩辗转移函数以下,

$\hat {\delta}: Q \times \Sigma^* \rightarrow P(Q)$

$\hat {\delta}(q, \epsilon) = s$

$\hat{\delta}(q, xa) = \bigcup_{r \in \delta(q, a)} \hat{\delta}(r,x)$

NFA M 接受的语言为,

$T(M)=\lbrace x|p \in \delta(q_0, x), p \in F$

其中,x 表示一个句子

正则文法与FA

定理:若$G=(V_N, V_T, P, S)$表示一个正则文法,则存在一个$FA M = (\Sigma, Q, \delta, q_0, F)$,使得$T(M)=L(G)$

其中,$V_N$表示非终结符,$V_T$表示终结符

因而能够由给定正则文法构造FA M,步骤以下:

  1. 令$\Sigma = V_T, Q=V_N \cup {T}, q_0 = S$,其中 T 是新增的一个非终结符
  2. 若是P中存在产生式$S \rightarrow \epsilon$,则 $F=\lbrace S, T \rbrace$,不然$F=\lbrace T \rbrace$
  3. 若是P中存在产生式$B \rightarrow a, B \in V_N, a \in V_T$,则$T \in \delta(B, a)$
  4. 若是P中存在产生式$B \rightarrow aC, B, C \in V_N, a \in V_T$,则$C \in \delta(B, a)$
  5. 对于每一个$a \in V_T$,有$\delta(T, a) = \varnothing$

 上面这个步骤给出的太忽然,初看可能会不太容易理解。

咱们从给出的正则文法出发,根据上篇文章的介绍,正则文法的规则是(为了与上面步骤相一致,以右线性正则文法为例)$A \rightarrow x|xB$,可见非终结符老是由一种或多种终结符的方幂链接而成,也就是说,非终结符是有终结符组成,因此正则文法所识别的句子最终都是由终结符组成,因此步骤(1)中,FA M的输入符号集就是$\Sigma = V_T$,FA M的上个状态在某一输入符的条件下转换到下一状态,而这个输入符正是文法中的终结符x,正好对应文法规则的产生式$A \rightarrow xB$,不难想到,这对应着FA M中状态转变,即状态 A 转换到 状态 B,而A 和 B 是文法中的非终结符,因此FA M的状态集合$Q = V_N$。不过,这样就OK了吗?显然没有,此时Q中的状态所有是$V_N$中的非终结符,根据文法产生式,非终结符老是要继续推导下去的,这说明,Q中少了能表示终止的状态,不然就是要构造无限长度的句子了。咱们新增一个非终结符T,这个非终结符T很特殊,它没有产生式,它的具体意义稍后就会解释。不过咱们的Q 就完整了,因而$Q=V_N \cup {T} $。另外,FA M的起始状态则不难理解为是文法的起始符$q_0=S$。

接着看步骤三、4和5

右线性正则文法的产生式有:$B \rightarrow a, B \in V_N, a \in V_T$,表示一个非空终止符B 产生出一个终止符a,这个产生式的右端没有非终结符,根据这种产生式,对应于FA M则是由状态B 接收一个输入符a 后进入下一个状态,这个状态就是前面新引入的那个T,即,但凡应用了$B \rightarrow a$这种右端没有非终结符的产生式,FA M就进入下一个状态T,由状态B并接收一个输入符a进入下一个状态T,若是是NFA,则是下一个状态集合,这里为了避免失通常性,咱们考虑NFA(毕竟DFA是NFA的特例),即$\delta(B, a)$是下一个状态集合,那么若是通过产生式$B \rightarrow a$变换后,,FA M进入状态T,则 $T \in \delta(B, a)$。

根据右线性正则文法,若是有产生式:$B \rightarrow aC, B, C \in V_N, a \in V_T$,那么根据上面的阐述,应该知道应用了此产生式后,FA M进入下一个状态C,且$C \in \delta(B, a)$。固然若是还有产生式$B \rightarrow aD$,那么$D \in \delta(B, a)$;若是B 只有一个产生式$B \rightarrow a$,那么$\delta(B, a)$只有一个元素,$\delta (B, a) = \lbrace T \rbrace$

前面提到过,新引入的非终结符T没有产生式,没有$T \rightarrow a|aA$这样的产生式,因此$\delta(T, a) = \varnothing$

而后来看步骤2,

FA M的终止状态集合$F \subseteq Q$,显然集合Q里面只有状态T 能够做为终止状态,即应用了文法产生式$B \rightarrow a$以后进入状态T,因此$F = \lbrace T \rbrace$。前面咱们介绍文法时,没有引入$\epsilon$,如今将其引入,这样就能够产生“空句子”,若是$S \rightarrow \epsilon$,即产生一个 空句子 ,那么显然,使用起始状态 S 做为此时的终止状态,因此,若是有产生式$S \rightarrow \epsilon$,此时$F=\lbrace S, T \rbrace$,而 $S \in V_N$,此时依然能保证$F \subseteq Q$,固然若是没有产生式$S \rightarrow \epsilon$,那么$F = \lbrace T \rbrace$,即只有非空句子的终止状态T

定理:若$M=(\Sigma, Q, \delta, q_0, F)$是一个有限自动机,则存在一个正则文法$G=(V_N, V_T,P,S)$,使得$L(G)=T(M)$

由FA M构造G的步骤:

  1. 令$V_N=Q$,$V_T = \Sigma$,$S=q_0$。根据前面的说明,这里应该不难理解
  2. 若是$C \in \delta(B, a), B, C \in Q, a \in \Sigma$,则在P中存在产生式:$B \rightarrow aC$。根据前面的说明,反过来就获得这条步骤
  3. 若是$C \in \delta(B, a), C \in F$,则P中存在产生式$B \rightarrow a$。根据前面的说明,这里C 就是T

上下文无关文法与下推自动机

 下推自动机(Pushdown Automata, PDA)用于实现上下文无关文法(CFG)。PDA 能够表达成一个七元组:

$M=(\Sigma, Q, \Gamma, \delta, q_0, Z_0, F)$

$Q$: 状态的有限集合

$\Sigma$: 输入符号集

$\Gamma$: 栈符号表

$\delta$: 转移函数

$q_0$: 初始状态

$Z_0$: 初始栈顶符号(也有叫栈底符号的,由于初始时栈里仅有这一个符号)

$F$: 终止状态集或可接受状态集,$F \subseteq Q$

$$ \begin{aligned} \delta : & \quad \quad Q & \quad \times   \quad \quad \Sigma \quad \times &   \quad  \Gamma \quad \Rightarrow \quad & Q \quad \times \quad & \Gamma^* \\ & \text{old state} & \text{input symb.} & \text{stack top} & \text{new state(s)} & \text{new stack top(s)} \end{aligned}$$

$\delta (q,a,X) = \lbrace (p, Y), ...$

从状态q 转移到状态 p,a是下一个输入符号,X是当前栈顶符号,Y是下一个用于替换X的栈顶符号,以下图所示,$Y \in \Gamma^*$,

(图来源网上)

  • 若是$Y = \epsilon$,直接将X从栈顶弹出
  • 若是$Y=X$,栈顶符号不变仍是X
  • 若是$Y=Z_{1}Z_{2}...Z_{k}$,将X从栈顶弹出,而后将Y压入栈,按从右往左的顺序压入栈,此时$Z_1$位于栈顶

PDA相似NFA,比NFA多了一个stack,正是这个stack使得PDA能够识别一些非正则的语言。输入符号集与栈符号集可能会不一样,因此分别用$\Sigma$和$\Gamma$表示。

图灵机

略(之后再专门讲述,主要是内容跟书上太太重复了,可是本身又不会组织语言,因此只能先等等)。

ref

统计天然语言处理,宗成轻

相关文章
相关标签/搜索