DFA-[Deterministic Finite Automaton]
在計算理論中,確定有限狀態自動機或確定有限自動機(英語:deterministic finite automaton, DFA)是一個能實現狀態轉移的自動機。對於一個給定的屬於該自動機的狀態和一個屬於該自動機字母表Σ的字符,它都能根據事先給定的轉移函數轉移到下一個狀態(這個狀態可以是先前那個狀態)。
可以通過建立狀態機來解決問題。
每次輸入都會引起狀態的改變或者不變。再次輸入一個值,狀態又會改變。
我們把所有狀態羅列出來,每次輸入都改變他的狀態。如果最后的狀態是合法的,那么證明這個輸入符合條件。
相應的數學建模中也用到類似的算法思想,解決商人過河問題、人狼羊菜過河問題,以及操作系統中也有涉獵,輸出進程安全序列也是類似的思想
DFA是一個由五元組定義的數學模型:M=(S,∑,δ,s0,F)
(2)S是一個有窮狀態集合
(3)∑是一個有窮的輸入字母表
(4)δ是狀態轉換函數,是SX∑->S上的單值部分映射,δ(s,a)=s'(s∈S,s'∈S)
(5)s0是唯一初態
(6)F是終態集合,F是S的子集
NFA
M = ( S,Σ ,δ,s0,F )
(1) S:有窮狀態集
(2)Σ:輸入符號集合,即輸入字母表。假設ε 不是Σ中的元素
(3)δ:將S×Σ映射到2S的轉換函數。s∈S, a∈Σ, δ(s,a)表示從狀態s出發,沿着標記為a的邊所能到達的狀態集合
(4)s0:開始狀態 (或初始狀態),s0∈S
(5)F:接收狀態(或終止狀態)集合,F⊆ S
dfa和nfa的區別
NFA | DFA | |
初始狀態 | 不唯一 | 唯一 |
弧上的標記 | 字(單字符字/ε) | 字符(串) |
轉換關系 | 非確定 | 確定 |
兩個DFA的等價指的是對任何兩個DFA,M和M',如果L(M)=L(M'),則稱兩者是等價的
NFA的確定化-子集法
思路:DFA的每一個狀態對應於NFA的一組狀態,用DFA的一個狀態去記錄NFA輸入一個符號后可能達到的狀態集合
(1)狀態集合I的閉包ε-Closure(I),定義
- 若q∈I,q∈ε-Closure(I)
- 若q∈I,設從q出發經過任意條ε弧能達到的狀態為q‘,則q’∈ε-Closure(I)
(2)狀態集合I的a弧轉換表示為Ia,Ia=ε-Closure(move(I,a))
DFA的最小化
對於給定的DFA M,尋找一個狀態數比M小的DFA M'使得L(M)=L(M')
1.狀態的等價性:
假設s和t為M的兩個狀態(終態和非終態)
①若分別從狀態s和狀態t出發都能讀出某個字α而停止於終態,則稱s和t等價
②存在一個字α,使得s和t一個讀出α停止於終態,另一個讀出α停止於非終態,則稱s和t可區別
2.基本思想:
①把M的狀態集分為一些不相交的子集,使任何兩個不同子集狀態是可區別的,而同一子集的任何兩個狀態是等價的
②讓每個子集選出一個代表,同時消去其他狀態
3.划分
①把S划分為終態和非終態兩個子集,形成基本划分∏
②假定某個時候∏已含m個子集,記為∏={I(1),I(2),…,I(m)},檢查∏中的每個子集能否進一步划分:
(a)假定s1和s2是I(i)={s1,s2,…sk}中的兩個狀態,它們經過a弧分別到達t1和t2,而t1和t2屬於現行∏中的兩個不同子集,則s1和s2不等價
(b)一般地,對於某個I(i),若Ia(i)落於現行∏中N個不同的子集,則應把I(i)划分成N個不相交的組
例:
正則表達式
語言 L = { a } { a , b } ∗ ( { ϵ } ∪ ( { . , _ } { a , b } { a , b } ∗ ) ) L=\{a\}\{a,b\}^*(\{\epsilon \} \cup (\{.,\_\}\{a,b\}\{a,b\}^*))L={a}{a,b}∗({ϵ}∪({.,_}{a,b}{a,b}∗))
這個語言是指,由a
開頭,后接任意長度的a、b
串,然后再接空串(代表結束)。或者是接以.
或_
開頭的,后接長度大於等於1的a、b
串。
正則表達式(Regular Expression, RE)是一種用來描述正則語言的更緊湊的表示方法。
以上面的語言舉例,寫成正則表達式則可表示成:r = a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ( a ∣ b ) ∗ ) r=a(a|b)^*(\epsilon | (.|_)(a|b)(a|b)^*)r=a(a∣b)∗(ϵ∣(.∣)(a∣b)(a∣b)∗)
正則表達式可以由較小的正則表達式按照特定規則遞歸地構建。每個正則表達式r
定義一個語言。記為L(r)
。這個語言也是根據r
的子表達式所表示的語言遞歸定義的。
定義
- 如果ϵ \epsilonϵ是一個RE,L ( ϵ ) = { ϵ } L(\epsilon) = \{\epsilon\}L(ϵ)={ϵ}
- 如果α ∈ ∑ \alpha \in \sumα∈∑,則α \alphaα是一個RE,L ( α ) = { α } L(\alpha)=\{\alpha\}L(α)={α}
- 假設
r
和s
都是RE,表示的語言分別是L(r)
和L(s)
,則- r ∣ s r|sr∣s是一個RE,L ( r ∣ s ) = L ( r ) ∪ L ( s ) L(r|s) = L(r) \cup L(s)L(r∣s)=L(r)∪L(s)
rs
(r連接s)是一個RE,L ( r ∣ s ) = L ( r ) L ( s ) L(r|s) = L(r)L(s)L(r∣s)=L(r)L(s)- r ∗ r^*r∗是一個RE,L ( r ∗ ) = ( L ( r ) ) ∗ L(r^*) = (L(r))^*L(r∗)=(L(r))∗
- ( r ) (r)(r)是一個RE,L ( ( r ) ) = L ( r ) L((r)) = L(r)L((r))=L(r)
注:運算的優先級:*、連接、|
例:∑ = { a , b } \sum = \{a,b\}∑={a,b},則
- L ( a ∣ b ) = L ( a ) ∪ L ( b ) = { a } ∪ { b } = { a , b } L(a|b) = L(a) \cup L(b) = \{a\} \cup \{b\} = \{a,b\}L(a∣b)=L(a)∪L(b)={a}∪{b}={a,b}
- L ( ( a ∣ b ) ( a ∣ b ) ) = L ( a ∣ b ) L ( a ∣ b ) = { a , b } { a , b } = { a a , a b , b a , b b } L((a|b)(a|b)) = L(a|b)L(a|b) = \{a,b\}\{a,b\} = \{aa,ab,ba,bb\}L((a∣b)(a∣b))=L(a∣b)L(a∣b)={a,b}{a,b}={aa,ab,ba,bb}
- L ( a ∗ ) = ( L ( a ) ) ∗ = { a } ∗ = { ϵ , a , a a , a a a , . . . } L(a^*) = (L(a))^* = \{a\}^* = \{\epsilon,a,aa,aaa,...\}L(a∗)=(L(a))∗={a}∗={ϵ,a,aa,aaa,...}
- L ( ( a ∣ b ) ∗ ) = ( L ( a ∣ b ) ) ∗ = a , b ∗ = { ϵ , a , b , a a , a b , b a , b b , . . . } L((a|b)^*) = (L(a|b))^* = {a,b}^* = \{\epsilon,a,b,aa,ab,ba,bb,...\}L((a∣b)∗)=(L(a∣b))∗=a,b∗={ϵ,a,b,aa,ab,ba,bb,...}
- L ( a ∣ a ∗ b ) = L ( a ) ∪ L ( a ∗ b ) = L ( a ) ∪ L ( a ∗ ) L ( b ) = { a , b , a b , a a b , a a a b , . . . } L(a|a^*b) = L(a) \cup L(a^*b) = L(a) \cup L(a^*)L(b) = \{a,b,ab,aab,aaab,...\}L(a∣a∗b)=L(a)∪L(a∗b)=L(a)∪L(a∗)L(b)={a,b,ab,aab,aaab,...}
注:可以用RE定義的語言叫做正則語言(regular language)或正則集合(regular set)。
RE的代數定理
定律 | 描述 |
---|---|
r | s = s | r | | 是可以交換的 |
r | (s | t) = (r | s) | t | | 是可以結合的 |
r ( s t ) = ( r s ) t | 連接是可以結合的 |
r (s | t) = rs | rt | 連接對 | 是可分配的 |
ϵ r = r ϵ = r \epsilon r = r \epsilon = rϵr=rϵ=r | ϵ \epsilonϵ是連接的單位元 |
$r^* = (r | \epsilon)^*$ |
r ∗ ∗ = r ∗ r^{**} = r^*r∗∗=r∗ | *具有冪等性 |
正則文法與正則表達式等價
- 對任何正則文法
G
,存在定義同一語言的正則表達式r
- 對任何正則表達式
r
,存在生成同一語言的正則文法