「30分以内に正規表現をDFAに変換する」ことを望んでいるので、比較的小さな例を手作業で作業していると思います。
この場合、Brzozowskiのアルゴリズム 使用できます。このアルゴリズムは、言語のNerodeオートマトン(最小決定論的オートマトンに等しいことが知られています)を直接計算します。これは導関数の直接計算に基づいており、交差および補完を可能にする拡張正規表現でも機能します。このアルゴリズムの欠点は、途中で計算される式の等価性をチェックする必要があることです。これは高価なプロセスです。しかし、実際には、小さな例では、非常に効率的です。[ 1 ]
左商。してみましょう言語もとlet言葉も。次いで、
言語呼び出され、左商を(または誘導体左)の。A * U U - 1 L = { V ∈ A * | UがV ∈ L } U - 1 LのLLA∗あなたは
あなたは− 1L = { V ∈ A∗| UはV ∈ L }
あなたは−1LL
Nerodeさんオートマトン。のNerodeオートマトンは決定論的オートマトンですここで、そして、遷移関数は、各に対して、式によって
定義されます
このかなり抽象的な定義に注意してください。各状態は、単語による左商であり、したがって言語です。初期状態は言語であり、最終状態のセットはすべての左商のセットです。LA(L )= (Q 、A 、⋅ 、L 、F)Q = { u− 1L | U ∈ A∗}F= { u− 1L | U ∈ L }∈ A
(あなた− 1L )⋅ A = A− 1(あなた− 1L )= (u a )− 1L
ALA∗LLの言葉によって、。
L
Brzozowskiのアルゴリズム。ましょう手紙も。次の式を使用して左商を計算できます。
a,b
a−11a−1(L1∪L2)a−1(L1∩L2)=0=a−1L1∪u−1L2,=a−1L1∩u−1L2,a−1ba−1(L1∖L2)a−1L∗={10if a=bif a≠b=a−1L1∖u−1L2,=(a−1L)L∗
a−1(L1L2)={(a−1L1)L2(a−1L1)L2∪a−1L2si 1∉L1,si 1∈L1
例。用、我々は連続し得る:
以下の最小限のオートマトンを提供します。
L=(a(ab)∗)∗∪ (b a )∗
1− 1La− 1L1b− 1L1a− 1L2b− 1L2a− 1L3b− 1L3a− 1L4b− 1L4a− 1L5b− 1L5= L = L1= (a b )∗(a (a b )∗)∗= L2= a (b a )∗= L3= b (a b )∗(a (a b )∗)∗∪ (a b )∗(a (a b )∗)∗= b L2∪ L2= L4= ∅= (b a )∗= L5= ∅= a− 1(b L2∪ L2)= a− 1L2= L4= b− 1(b L2∪ L2)= L2∪ B− 1L2= L2= ∅= a (b a )∗= L3
[ 1 ] J.ブルゾゾフスキー、正規表現の派生物、J.ACM 11(4)、481–494、1964。
編集。(2015年4月5日)同様の質問を発見しました:特定の正規表現で記述された言語を認識するDFAを構築するためのアルゴリズムは何ですか?cstheoryで尋ねられました。答えは部分的に複雑さの問題に対処します。
a(a|ab|ac)*a+
。これをNDFAに直接変換してDFAに変換するか、DFAにすぐにマッピングされるものに正規化することができます。