自動機

自動機類型:有限自動機(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

統計天然語言處理,宗成輕