形式語言與自動機 Part 3.有限自動機

課程名:形式語言與自動機

作者:Lupinus_Linn

許可證:CC-BY-NC-SA 3.0 創作共用-署名-非商業性-相同方式共享

  • 署名(英語:Attribution,BY):您(用戶)可以複製、發行、展覽、表演、放映、廣播或通過信息網絡傳播本作品;您必須按照作者或者許可人指定的方式對作品進行署名。
  • 非商業性使用(英語:Noncommercial,NC):您可以自由複製、散佈、展示及演出本作品;您不得爲商業目的而使用本作品。
  • 相同方式共享(英語:Sharealike,SA):您可以自由複製、散佈、展示及演出本作品;若您改變、轉變或更改本作品,僅在遵守與本作品相同的許可條款下,您才能散佈由本作品產生的派生作品。(參見copyleft。)

引用:

  • 本文中部分文字與圖片引用自北京郵電大學計算機學院王柏教授的《形式語言與自動機》課程課件。
  • 緒論中的證明方法部分引自清華大學王生原老師課件。
  • 部分題目插圖引用自北京郵電大學出版社《形式語言與自動機 第二版》教材。

在此一併表示感謝,並不做商業用途。

本筆記所有內容的傳送門

Part.1緒論, Part.2 語言與文法
Part 3.有限自動機
Part.4 正則語言,2DFA,Mealy&Moore機
Part.5 上下文無關語言與下推自動機(PDA)
Part.6 圖靈機

Part 3.有限自動機

  • 具有離散輸入輸出系統的一種數學模型 (可以沒有輸出,比較特殊的也可以沒有輸入).
  • 有限的狀態
  • 狀態+輸入→狀態轉移
  • 每次轉換的後繼狀態都唯一 → DFA,每次轉換的後繼狀態不唯一→NFA

3.1 五要素

  • 有限狀態集QQ
  • 有限輸入符號集TT
  • 轉移函數δ:Q×TQ\delta:Q×T \rarr Q:
  • 一個開始狀態q0,q0Qq_0,q_0\in Q
  • 一個終態集合F,FQF,F\subseteq Q

3.2 一個DFA的定義

  • M=(Q,T,δ,q0,F)M= (Q, T, δ, q0 , F)
  • Q={q0,q1,q2,q3}Q = \{q0 , q1 , q2 , q3 \}
  • T={0,1}T = \{0, 1 \}
  • δ(q0,0)=q2,δ(q0,1)=q1\delta(q0 ,0) = q2 , \delta(q0 ,1) = q1
    δ(q1,0)=q3,δ(q1,1)=q0\delta(q1 ,0) = q3 , \delta(q1 ,1) = q0
    δ(q2,0)=q0,δ(q2,1)=q3\delta(q2 ,0) = q0 , \delta(q2 ,1) = q3
    δ(q3,0)=q1,δ(q3,1)=q2\delta(q3 ,0) = q1 , \delta(q3 ,1) = q2
  • q0q0
  • F={q0,q3}F = \{q0 , q3 \}

3.3 狀態轉移圖

在這裏插入圖片描述

3.4 狀態轉移表

在這裏插入圖片描述

3.5 字符串轉移函數δ\delta'

δ:Q×TQ\delta' :Q\times T^*\rarr Q
對於任何qQq\in Q,定義

  1. δ(q,ϵ)=q\delta'(q,\epsilon)=q。即空串轉移到本狀態。
  2. 如果ωT,aT\omega \in T^*,a\in T,定義δ(q,ωa)=δ(δ(q,ω),a)\delta'(q,\omega a)=\delta(\delta'(q,\omega),a)。即非空字符串ωa\omega a|可以看作是其前長度爲ω|\omega|的前綴$\omega $和長度爲11的字符aa組成。

對於DFA,單個字符使用δ\delta或者δ\delta'進行轉移的結果相同。

3.6 DFA接受的語言

被DFA接收的字符串: 輸入結束後使DFA的狀態到達終 止狀態。否則該字符串不能被DFA接收.

DFA接收的語言: 被DFA接收的字符串的集合.L(M)={ωδ(q0,ω)F}L(M) = \{ ω | \delta'( q0 , ω) \in F \}

3.7 格局

  • 有限自動機工作過程的瞬時描述,由當前狀態q,待輸入字符串ω構成的二元組(q,ω)表示,稱爲格局。
  • 初始格局:(q0, ω)
  • 終止格局: (q,ε), q∈F
  • 用格局描述的推導序列:(q0,001010)┝ (q2,01010) ┝ (q0,1010) ┝ (q1,010) ┝ (q3,10) ┝ (q2,0) ┝ (q0,ε)
  • 格局數量是無限的。
  • 有限狀態自動機是無記憶的,其跳轉到的狀態只與當前狀態和輸入的字符有關,和以前輸入的字符無關。

3.8 有限自動機的設計

3.8.1 識別所有由奇數個a和奇數個b組成的字符串

  • 不需要記住所看到的整個字符串,只需記住至此所看到 的a、b個數是偶數還是奇數。

在這裏插入圖片描述

3.8.2 識別包含000子串的語言

DFA

在這裏插入圖片描述
NFA

在這裏插入圖片描述

3.8.3 識別字符串代表的數字能被3整除的語言

  • 一個十進制數除以3,餘數只能爲0、1、2。將其設計爲狀態。
  • 狀態q0表示已讀入的數字和除3餘0
  • 狀態q1表示已讀入的數字和除3餘1
  • 狀態q2表示已讀入的數字和除3餘2

在這裏插入圖片描述

3.8.4 長度爲1-3 個字符且字母爲首的語言

DFADFA

在這裏插入圖片描述
ϵNFA\epsilon-NFA

在這裏插入圖片描述

3.9 NFA的五要素

  • NFA是一個五元組,M=(Q,T,δ,q0,F)M=(Q,T,δ,q0,F). 其中δ:Q×T2Qδ:Q×T\rarr2^Q,其餘與DFA相同.
  • NFA的一個狀態接受一個字符後轉移到一個狀態集合,DFA僅僅轉移到單個狀態。
  • 如果接收一個字符串後NFA進入一個狀態集, 而此集合中包含一個以上F中的狀態, 則稱NFA接收該字符串.

3.10 NFA的字符串轉移函數δ\delta '

δ:Q×T2Q\delta':Q\times T\rarr 2^Q

  1. δ(q,ϵ)={q}\delta'(q,\epsilon)=\{q\},不允許空轉移到別的狀態。
  2. δ(q,ωa)=P,P={prδ(q,ω)δ(r,a)}\delta'(q,\omega a)=P,P=\{p | \exists r\in \delta'(q,\omega)∧ \delta(r,a)\},即先接受ω\omega進行轉移,得到一個集合,然後將該集合內的狀態再接受aa進行轉移,將所得狀態集並起來。

3.11 NFA接受的語言

  • L(A)={ωδ(q0,ω)F}L(A)=\{\omega | \delta'(q_0,\omega)\cap F\ne \empty\}
  • 即NFA接受字符串後轉移到的狀態集合包含F中的狀態。

3.12 NFA與DFA的等價性

等價性:接受的語言相相同

  1. DFA與NFA等價:顯然,因爲DFA⊂NFA
  2. NFA於NFA等價:使用子集構造法

3.13 子集構造法

精髓:將NFA的狀態集合看做DFA的單個狀態

方法:設 L 是某個 NFA N=(QN,T,δN,q0,FN)NFA\ N = (Q_N, T, \delta_N , q_0 , F_N) 的語言, 則 存在一個DFA M=(QD,T,δD,{q0},FD)DFA\ M =(Q_D, T, \delta_D , \{q0 \}, F_D ), 滿足L(M)=L(N)=LL(M) = L(N) = L.
其中

  • QD=2QN={RRQN}Q_D=2^{Q_N}=\{R|R\subseteq Q_N\},即DFA的狀態集合是NFA的狀態的冪集(可以去掉無用狀態)。
  • δD(R,a)=qR δN(q,a)\delta_D(R,a)=\cup_{q\in R}\ \delta_N(q,a),即DFA的轉移是NFA轉移的並集。
  • FD={RRQNRFN}F_D=\{R|R\subseteq Q_N ∧ R\cap F_N\ne \empty\},即新的DFA的可接受狀態集是包含至少一個NFA可接受狀態的集合的集合。

例子

在這裏插入圖片描述

3.14 ϵNFA\epsilon-NFA的五要素

ϵNFA\epsilon-NFA是一個五元組A=(Q,T,δ,q0,F)A=(Q,T,δ,q0,F)

  • 與NFA的區別:δ:Q×(T{ϵ})2Q\delta:Q\times(T\cup \{\epsilon\})\rarr 2^Q,即可以使用空串轉移。

3.15 ϵCLOSURE\epsilon-CLOSURE

狀態 q 的ε - 閉包,記爲 ε - CLOSURE 或 ECLOSE ,定義爲從q 經所有的ε路徑可以到達 的狀態(包括q自身)。

即從q開始,經過零次或多次空轉移可以到達的狀態集合。

在這裏插入圖片描述

3.16 ϵNFA\epsilon-NFA的字符串轉移函數δ\delta'

δ:Q×(T×{ϵ}2Q)\delta':Q\times (T\times\{\epsilon\}\rarr 2^Q)

  1. δ(q,ϵ)=ϵCLOSURE(q)\delta'(q,\epsilon)=\epsilon-CLOSURE(q),允許空轉移到一個狀態集合
  2. δ(q,ωa)=ϵCLOSURE(δ(δ(q0,ω),a)\delta'(q,\omega a)=\epsilon-CLOSURE(\delta(\delta'(q_0,\omega),a),即先按接受ω\omega進行δ\delta'轉移,得到一個集合,然後將該集合內的狀態再接受字符aa進行轉移,將所得狀態集並起來,再求其空閉包.

3.17 ϵNFA\epsilon-NFANFANFA的等價性

  1. NFA與ε-NFA等價:顯然,因爲NFA⊂ε-NFA
  2. ϵNFA\epsilon-NFA於NFA等價:消空

3.18 ϵNFA\epsilon-NFA的消空

精髓:把qxq_x接受由字符aa和若干個空串ε能轉移到的所有狀態找出來,視爲qxq_x接受aa轉移到這些狀態的集合。此時空轉移是冗餘的,可以全部刪掉。

方法:遍歷原ϵNFA\epsilon-NFA的非空轉移(qxq_x接收字符aa轉移到某個狀態集合),做以下操作:(實際上在求δϵNFA(qx,a)\delta_{\epsilon-NFA}'(q_x,a)

  1. qxq_x的空閉包ϵCLOSURE(qx)\epsilon-CLOSURE(q_x)
  2. 遍歷ϵCLOSURE(qx)\epsilon-CLOSURE(q_x)的每個狀態qiq_i,找出qiq_i接收字符aa(不含空轉移)後所能到達的狀態集合。遍歷完成後,將得到的狀態集合取並集。
  3. 尋找取並集後的集合的空閉包,認爲qxq_x接受aa後直接到達該空閉包代表的集合,刪去所有用到的空轉移。

最後,還要對接受狀態集合進行修改
FNFA={ FϵNFA{q0},ϵCLOSURE(q0)FFϵNFA,otherwise F_{NFA}=\begin{cases}\ F_{\epsilon-NFA}\cup \{q_0\},\epsilon-CLOSURE(q_0)\cap F\ne \empty\\F_{\epsilon-NFA},otherwise\end{cases}

例子

在這裏插入圖片描述

3.19 自動機的求補

精髓:自動機求補其實是語言求補,有的語言正面設計自動機比較麻煩,可以考慮其補語言後,再對該自動機求補。
方法:對於L1L_1,構造Lˉ\bar L的自動機M=(Q,T,δ,q0,F)M=(Q,T,\delta,q_0,F)的步驟如下

  1. Q=Q1{γ}Q=Q_1\cup \{\gamma\}γ\gamma用於使得原先自動機中會被卡住的轉移在求補後被接受。

  2. δ\delta:

    1. 繼承已有轉移。
    2. 被卡死的轉移,現在轉到γ\gamma狀態被接受。
    3. γ\gamma狀態接受任何字符都在原地轉圈。

    δ1(q,a)=δ(q,a)δ1(q,a)=δ(q,a)=γδ(γ,T)=γ \delta_1(q,a)=\delta(q,a)\\ \delta_1(q,a)=\empty\to\delta(q,a)=\gamma\\ \delta(\gamma,T)=\gamma

  3. F=(Q1F1){γ}F=(Q_1-F_1)\cup \{\gamma\}。原自動機不被接受的狀態被接收,增加γ\gamma被接受。

例子T={a,b}T=\{a,b\},L中的任意三個連續符號中最多包含2個a,設計接受它的自動機。
分析:
可以先構造L的補語言Lˉ\bar L的自動機。
Lˉ\bar L的描述是:存在連續的三個字符,其包含大於2個a。
這句話可以轉述爲:存在aaa子串。
Lˉ\bar L的自動機很容易畫出。
(注:區分連續的字符和累積的字符:連續的字符失敗後要回到開始,累積的字符失敗後在原地轉圈。如果是後綴匹配的話,要找到最長後綴匹配的上一個狀態。)
Lˉ\bar L的自動機

b
a
a
a
a,b
q1
q2
q3
q4

再對其求補,得LL的自動機爲

b
a
b
a
b
a
a,b
q1
q2
q3
q4
γ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章