課程名:形式語言與自動機
作者: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 五要素
- 有限狀態集Q
- 有限輸入符號集T
- 轉移函數δ:Q×T→Q:
- 一個開始狀態q0,q0∈Q
- 一個終態集合F,F⊆Q
3.2 一個DFA的定義
- M=(Q,T,δ,q0,F)
- Q={q0,q1,q2,q3}
- T={0,1}
- δ(q0,0)=q2,δ(q0,1)=q1
δ(q1,0)=q3,δ(q1,1)=q0
δ(q2,0)=q0,δ(q2,1)=q3
δ(q3,0)=q1,δ(q3,1)=q2
- q0
- F={q0,q3}
3.3 狀態轉移圖
3.4 狀態轉移表
3.5 字符串轉移函數δ′
δ′:Q×T∗→Q
對於任何q∈Q,定義
- δ′(q,ϵ)=q。即空串轉移到本狀態。
- 如果ω∈T∗,a∈T,定義δ′(q,ωa)=δ(δ′(q,ω),a)。即非空字符串ωa∣可以看作是其前長度爲∣ω∣的前綴$\omega $和長度爲1的字符a組成。
對於DFA,單個字符使用δ或者δ′進行轉移的結果相同。
3.6 DFA接受的語言
被DFA接收的字符串: 輸入結束後使DFA的狀態到達終 止狀態。否則該字符串不能被DFA接收.
DFA接收的語言: 被DFA接收的字符串的集合.L(M)={ω∣δ′(q0,ω)∈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 個字符且字母爲首的語言
DFA
ϵ−NFA
3.9 NFA的五要素
- NFA是一個五元組,M=(Q,T,δ,q0,F). 其中δ:Q×T→2Q,其餘與DFA相同.
- NFA的一個狀態接受一個字符後轉移到一個狀態集合,DFA僅僅轉移到單個狀態。
- 如果接收一個字符串後NFA進入一個狀態集, 而此集合中包含一個以上F中的狀態, 則稱NFA接收該字符串.
3.10 NFA的字符串轉移函數δ′
δ′:Q×T→2Q
- δ′(q,ϵ)={q},不允許空轉移到別的狀態。
- δ′(q,ωa)=P,P={p∣∃r∈δ′(q,ω)∧δ(r,a)},即先接受ω進行轉移,得到一個集合,然後將該集合內的狀態再接受a進行轉移,將所得狀態集並起來。
3.11 NFA接受的語言
- L(A)={ω∣δ′(q0,ω)∩F=∅}
- 即NFA接受字符串後轉移到的狀態集合包含F中的狀態。
3.12 NFA與DFA的等價性
等價性:接受的語言相相同
- DFA與NFA等價:顯然,因爲DFA⊂NFA
- NFA於NFA等價:使用子集構造法
3.13 子集構造法
精髓:將NFA的狀態集合看做DFA的單個狀態
方法:設 L 是某個 NFA N=(QN,T,δN,q0,FN) 的語言, 則 存在一個DFA M=(QD,T,δD,{q0},FD), 滿足L(M)=L(N)=L.
其中
- QD=2QN={R∣R⊆QN},即DFA的狀態集合是NFA的狀態的冪集(可以去掉無用狀態)。
- δD(R,a)=∪q∈R δN(q,a),即DFA的轉移是NFA轉移的並集。
- FD={R∣R⊆QN∧R∩FN=∅},即新的DFA的可接受狀態集是包含至少一個NFA可接受狀態的集合的集合。
例子:
3.14 ϵ−NFA的五要素
ϵ−NFA是一個五元組A=(Q,T,δ,q0,F)
- 與NFA的區別:δ:Q×(T∪{ϵ})→2Q,即可以使用空串轉移。
3.15 ϵ−CLOSURE
狀態 q 的ε - 閉包,記爲 ε - CLOSURE 或 ECLOSE ,定義爲從q 經所有的ε路徑可以到達 的狀態(包括q自身)。
即從q開始,經過零次或多次空轉移可以到達的狀態集合。
3.16 ϵ−NFA的字符串轉移函數δ′
δ′:Q×(T×{ϵ}→2Q)
- δ′(q,ϵ)=ϵ−CLOSURE(q),允許空轉移到一個狀態集合
- δ′(q,ωa)=ϵ−CLOSURE(δ(δ′(q0,ω),a),即先按接受ω進行δ′轉移,得到一個集合,然後將該集合內的狀態再接受字符a進行轉移,將所得狀態集並起來,再求其空閉包.
3.17 ϵ−NFA與NFA的等價性
- NFA與ε-NFA等價:顯然,因爲NFA⊂ε-NFA
- ϵ−NFA於NFA等價:消空
3.18 ϵ−NFA的消空
精髓:把qx接受由字符a和若干個空串ε能轉移到的所有狀態找出來,視爲qx接受a轉移到這些狀態的集合。此時空轉移是冗餘的,可以全部刪掉。
方法:遍歷原ϵ−NFA的非空轉移(qx接收字符a轉移到某個狀態集合),做以下操作:(實際上在求δϵ−NFA′(qx,a))
- 求qx的空閉包ϵ−CLOSURE(qx)。
- 遍歷ϵ−CLOSURE(qx)的每個狀態qi,找出qi接收字符a(不含空轉移)後所能到達的狀態集合。遍歷完成後,將得到的狀態集合取並集。
- 尋找取並集後的集合的空閉包,認爲qx接受a後直接到達該空閉包代表的集合,刪去所有用到的空轉移。
最後,還要對接受狀態集合進行修改
FNFA={ Fϵ−NFA∪{q0},ϵ−CLOSURE(q0)∩F=∅Fϵ−NFA,otherwise
例子:
3.19 自動機的求補
精髓:自動機求補其實是語言求補,有的語言正面設計自動機比較麻煩,可以考慮其補語言後,再對該自動機求補。
方法:對於L1,構造Lˉ的自動機M=(Q,T,δ,q0,F)的步驟如下
-
Q=Q1∪{γ},γ用於使得原先自動機中會被卡住的轉移在求補後被接受。
-
δ:
- 繼承已有轉移。
- 被卡死的轉移,現在轉到γ狀態被接受。
- γ狀態接受任何字符都在原地轉圈。
δ1(q,a)=δ(q,a)δ1(q,a)=∅→δ(q,a)=γδ(γ,T)=γ
-
F=(Q1−F1)∪{γ}。原自動機不被接受的狀態被接收,增加γ被接受。
例子:T={a,b},L中的任意三個連續符號中最多包含2個a,設計接受它的自動機。
分析:
可以先構造L的補語言Lˉ的自動機。
Lˉ的描述是:存在連續的三個字符,其包含大於2個a。
這句話可以轉述爲:存在aaa子串。
Lˉ的自動機很容易畫出。
(注:區分連續的字符和累積的字符:連續的字符失敗後要回到開始,累積的字符失敗後在原地轉圈。如果是後綴匹配的話,要找到最長後綴匹配的上一個狀態。)
Lˉ的自動機
再對其求補,得L的自動機爲