非確定型有限自動機(NFA)

ε-NFA(an epsilon-NFA)

/ epsilon = EP-si-lon (the symbol ε) /

ε-NFA 是一種非確定型有限自動機,除了能分岔之外,還被允許在空字串 ε(epsilon)上做免費移動。它是有限自動機諸模型中最寬鬆的一個:在任一狀態它可以在好幾個下一狀態之間猜測、可以完全沒有移動,也可以不讀輸入就在狀態間飄移。它最看重的就是給設計者的便利。

形式上它和 NFA 一樣是個五元組 (Q, Σ, δ, q0, F),差別在於轉移函數定義在 Σ ∪ {ε} 上——也就是定義在每個真實符號「以及」空字串上。所以對每個符號 a,δ(q, a) 是一個狀態集合,而 δ(q, ε) 是免費可達的狀態集合。要跑它就得倚靠 ε-封閉:追蹤可能狀態的集合,並在每一步之後把這個集合擴張,加入所有經 ε-移動可達的狀態。

關鍵在於,ε-NFA 並不比普通 NFA 或 DFA 更強。有一套標準程序可以消除 ε-移動(利用 ε-封閉,把每個 ε-跳躍與其兩側的真實移動合成而重新接線),把 ε-NFA 變成辨識同一語言的普通 NFA;接著子集構造法再給出一台 DFA。這就是那個大等價的第三隻腳:DFA、NFA、ε-NFA 辨識的「恰好」都是正規語言。ε-NFA 在 Thompson 構造法中大放異彩——正規表示式的各個運算子在那裡對應到以 ε 黏接的小巧裝置。

辨識 a*(零個或多個 a)的 ε-NFA:單一狀態 s,它既是起始也是接受狀態,δ(s, a) = {s},就這樣。空字串會被接受,因為 s 透過它自己的 ε-封閉本來就是接受狀態;aaa 則靠迴圈被接受。用 ε-移動把這類小裝置黏起來,你就能為任何正規表示式建出一台機器。

ε-移動讓機器容易組合;把它們消除掉就回到普通的 NFA。

儘管多了這份自由,ε-NFA 辨識的仍只有正規語言——與 DFA 同一族。這份自由是描述上的,並不是額外的運算能力。

又稱
NFA with epsilon-movesε-NFA帶 ε-移動的 NFA