3.4
等価性
99
NFA
クラスは自由移動を自動的に考慮してくれます。
NFA
を状態
3
で開始すると、入力を読
む前に状態
2
か
3
にいる可能性があることがわかります。したがって、
NFASimulation
は自
由移動について特別なことをする必要はありません。
これで取り得る状態の集合でNFAを生成し、それに文字を与えることで、最終的にどの状態になる
可能性があるかわかります。これはNFAをDFAに変換する上で不可欠なステップです。NFAが状態
2か3にいるときに
b
を読むと、どんな状態を取り得るでしょうか。
>>
nfa = nfa_design.to_nfa(Set[2, 3])
=> #<struct NFA current_states=#<Set: {2, 3}>, accept_states=[3], rulebook=
…
>
>>
nfa.read_character('b'); nfa.current_states
=> #<Set: {3, 1, 2}>
答えは、状態1か2 か3です。これは手作業による変換と同じ結果です(
Set
では、要素の順序は重
要でないことを思い出しましょう)。
それでは
NFASimulation
クラスを作って、特定の入力に対してシミュレーションの状態がどのよ
うに変化するか計算するメソッドを用意しましょう。ここではシミュレーションの状態をNFA が取り
得る状態(たとえば、“1, 2, or 3”)だと考えます。したがって、
#next_state
メソッドは、シミュレー
ションの ...