以下に添付図面を参照して、この発明にかかる情報処理装置の好適な実施の形態を詳細に説明する。
(第1の実施の形態)
第1の実施の形態にかかる情報処理装置は、ε除去のパターン(ε除去パターン)の選択の結果が影響する状態の範囲を探索し、探索した範囲ごとにε除去を実行する。ε除去パターンの選択結果が影響する範囲は、ε遷移の向きに依存せずに探索する。このため、ε遷移の向きに依存せずにε除去を実行することができる。
ここで、ε除去パターンの詳細について説明する。状態qsからε遷移のみで到達できる状態を状態qdとする。受理する言語を変えることなく、この2つの状態間のε遷移を除去するためには、別の新たな遷移を生成する必要がある。ここで受理する言語とは有限状態オートマトンが受理する入力記号列の集合のことを言う。遷移の生成にはパターンがある。以下では、このパターンをε除去パターン(ε−removal pattern)と呼ぶこととする。ε除去パターンには少なくとも2つのパターンが存在する。
ε除去パターンの1つは、状態qsに入ってくる遷移(incoming transition)を、状態qdを次状態とする遷移として複製するというパターンである。もう1つのε除去パターンは、状態qdから出て行く遷移(outgoing transition)を、状態qsを前状態とする遷移として複製するというパターンである。いずれのε除去パターンを選択するかによって、最終的に得られる遷移の数が異なる。また、あるε除去パターンの選択の結果が、他の2つの状態間におけるε除去パターンの選択の結果に影響されることもある。このため、第1の実施の形態では、最初にこの選択が互いに影響する範囲を探索する。以下、第1の実施の形態の詳細について説明する。
図1は、第1の実施の形態にかかる情報処理装置100の機能構成の一例を示すブロック図である。図1に示すように、情報処理装置100は、第1集合生成部101と、第2集合生成部102と、組み合わせ生成部103と、除去部104と、を備えている。
第1集合生成部101は、処理対象となる有限状態オートマトンに含まれる状態のうち、ε遷移を順方向および逆方向に辿って到達できる状態の集合(第1集合)を表す無向ε閉包(undirected ε−closure)を生成する。
第2集合生成部102は、他の無向ε閉包と直接接続または間接接続されている無向ε閉包から成る集合(第2集合)を表す連結無向ε閉包(connected undirected ε−closure、CUEC)を生成する。また、第2集合生成部102は、他のいずれの無向ε閉包とも直接接続していない無向ε閉包1つから成る集合についても連結無向ε閉包に含める。なお、直接接続および間接接続の意味については後述する。連結無向ε閉包が、ε除去パターンの選択が互いに影響を与える範囲に相当する。ε除去は、このような連結無向ε閉包を処理対象として、連結無向ε閉包ごとに実行される。
組み合わせ生成部103は、連結無向ε閉包それぞれについて、連結無向ε閉包に含まれる状態間のε遷移それぞれに適用する除去パターンの組み合わせのうち、ε遷移を除去した後の連結無向ε閉包内の遷移数が最小となる組み合わせを求める。
除去部104は、生成された組み合わせに含まれる除去パターンで連結無向ε閉包内の各ε遷移のε除去を実行する。
次に、このように構成された第1の実施の形態にかかる情報処理装置100によるε除去処理について図2を用いて説明する。図2は、第1の実施の形態におけるε除去処理の全体の流れを示すフローチャートである。
まず、第1集合生成部101が、入力された有限状態オートマトン(FSA)の各状態および遷移を探索し、無向ε閉包を生成する(ステップS101)。次に、第2集合生成部102が、生成された無向ε閉包から連結無向ε閉包を生成する(ステップS102)。次に、組み合わせ生成部103が、連結無向ε閉包内のε遷移に適用できるε除去パターンの組み合わせのうち、遷移の数が最小となるε除去パターンの組み合わせを探索する(ステップS103)。
組み合わせ生成部103は、組み合わせの総数が少ない場合は、全組み合わせについて探索し、現実的な時間で調べられないほど組み合わせの総数が多いときには、一部の組み合わせのみを調べ、その中で最も遷移の数が少なくなる組み合わせを選ぶ。
次に、除去部104が、選んだ組み合わせに含まれる各除去パターンでε除去を実行する(ステップS104)。すなわち、選んだ組み合わせに含まれる各除去パターンで対応するε遷移を除去し、初期状態から到達不可能になった状態と関連する遷移を除去する。
次に、組み合わせ生成部103が、全ての連結無向ε閉包について処理が終了したか否かを判断する(ステップS105)。終了していない場合(ステップS105:No)、組み合わせ生成部103は、未処理の組み合わせ生成部103に対して処理を繰り返す(ステップS103)。終了した場合は(ステップS105:Yes)、ε除去処理を終了する。以上の処理により、ε遷移が存在しないFSAが得られる。
以下、図2の各ステップの詳細について説明する。
(準備)
FSAは、状態の集合Q、遷移の集合E、入力記号の集合Σ、初期状態の集合I、終了状態の集合Fから成る5つ組(Q,E,Σ,I,F)から構成される。遷移は、3つ組(前状態,入力記号,次状態)で構成される。これら5つの集合は、ε除去の処理対象となるFSAを構成する情報として常に参照することができるものとする。例えば、これらの情報が図示しない記憶部等に記憶され、以下に例示する擬似コード等から常に参照できるように構成する。
空集合はφと書く。集合Bの要素の数は|B|と書く。ε遷移のみで構成される経路をε経路と定義する。
ある状態から1本以上のε遷移をその遷移の向きに関わらず辿ることで到達できる状態の集合を無向ε閉包と呼ぶ。無向ε閉包C1とC2にそれぞれ含まれる状態をq1、q2とする。q1とq2がε遷移でない遷移1本のみで接続されているとき、無向ε閉包C1とC2は直接接続されているという。無向ε閉包C1、C2、C3において、C1とC2が接続されており、C2とC3も接続されているとき、C1とC3は間接接続されているという。
直接接続されているか間接接続されているかに関わらず接続されている無向ε閉包から成る集合と、他のいずれの無向ε閉包とも直接接続していない無向ε閉包1つから成る集合を連結無向ε閉包という。すなわち、連結無向ε閉包は1つ以上の無向ε閉包から構成され、2つ以上の無向ε閉包を含む場合、それらは直接接続または間接接続されている。
ε除去パターンの選択が互いに影響を受ける範囲に含まれる状態は、連結無向ε閉包に含まれる状態に等しい。接続されていない、すなわちε遷移以外の遷移が2本以上間に挟まっている2つの無向ε閉包において、一方の無向ε閉包に含まれるε除去パターンが他方の無向ε閉包に含まれるε除去パターンに影響を与えることはない。
(方法)
はじめにε除去パターンの選択が互いに影響を受ける範囲を得る方法について説明し、次にε除去パターンの選択をどのように行うかを説明する。最後に、選んだε除去パターンの選択に基づいてε遷移を除去する方法について説明する。
(無向ε閉包を得る方法:ステップS101)
各状態へと入ってくるε遷移が出て行くε遷移でもあるとみなして深さ優先探索(Depth First Search、DFS)で探索する。ここで探索する対象となる遷移はε遷移のみである。探索が必要な全ての状態に対して探索が終了すると、無向ε閉包が得られる。
図3は、無向ε閉包を得るための擬似コードの一例を示す図である。ここで、Θは無向ε閉包から成る集合である。Sはスタックであり、関数pushによって後に入れられた要素が関数popによって先に取り出される。input(e)、n(e)、p(e)はそれぞれ遷移eに割り当てられている入力記号、次状態、前状態を表す。図3の擬似コード(all−undirected−ε−closure)は、第1集合生成部101が実行する。
1行目で処理対象とするFSAに含まれる状態を全てQrに代入する。この時点ではQとQrは等しい。また、Θを空集合として初期化し、スタックSも空にする。
2行目でQrが空集合か否かを調べ、空集合であるなら17行目に処理を移す。空集合でなければまだ処理すべき状態が残っているということであるので、3行目へと進む。
3行目ではこれ以降の処理で使用するQεを空集合で初期化する。
4行目では集合Qrからいずれか1つの状態を選び、状態qに代入する。選び方はどのようにしてもよいが、例えばランダムに選ぶ、状態番号が最も小さいものを選ぶ、状態番号が最も大きいものを選ぶなどの方法がある。
5行目ではスタックSに状態qを追加する。
6行目ではスタックSが空集合であるか否かを調べ、空集合であれば14行目に処理を進める。そうでなければ7行目へと処理を進める。
7行目ではスタックSから要素が1つ取り出され、qεに代入される。代入されたqεはスタックSから取り除かれる。
8行目ではqεをQεに追加する。
9行目はεが入力記号として割り当てられている全ての遷移について10行目から13行目までの処理を行うことを表している。10行目から13行目で処理対象となる遷移はeで表される。
10行目では遷移eの前状態とqεが等しく、かつ、遷移eの次状態がQεに含まれていないことを判定し、判定が真なら11行目へと処理を進める。そうでなければ12行目へと処理を進める。
11行目では遷移eの次状態をスタックSに追加する。
12行目では遷移eの次状態とqεが等しく、かつ、遷移eの前状態がQεに含まれていないことを判定し、判定が真なら13行目へと処理を進める。そうでなれば9行目に戻る。
13行目では遷移eの前状態をスタックSに追加する。その後、9行目に戻る。
14行目ではQεに含まれる状態をQrから取り除く。
15行目ではQεに含まれる状態の数が2個以上であるか否かを判定し、2個以上であれば16行目に進む。そうでなければ2行目に戻る。
16行目まで処理が進んだとき、Qεは処理対象のFSAに含まれる無向ε閉包の1つになっている。16行目ではQεを無向ε閉包を要素とする集合Θに追加する。その後、2行目に戻る。
17行目ではこの処理で得られた集合Θを処理結果として返す。
図4は、このような処理により得られる無向ε閉包の一例を示す図である。図4の点線で囲まれた部分が無向ε閉包である。この例の場合、図3に示した方法で得られる結果は、Θ={{1,2},{3,4},{6,7,8}}となる。状態は円で表され、遷移は状態と状態とを接続する矢印で表されている。太線の円が初期状態であり、2重線の円が終了状態である。なお、この有限状態オートマトンは入力aaaのみを受理することができる。
(連結無向ε閉包を得る方法:ステップS102)
図5は、処理対象としているFSAに含まれる全ての連結無向ε閉包を得るための擬似コードの一例を示す図である。
1行目では連結無向ε閉包を要素とする集合Ψを空集合で初期化する。
2行目は指定された無向ε閉包の集合であるΘに含まれる無向ε閉包の要素全てについて3行目から13行目までの処理を行うことを表している。処理対象とする無向ε閉包はθであるとする。
3行目では無向ε閉包を要素とする集合ψをθを要素とする集合として初期化する。
4行目はθに含まれる全ての状態について5行目から8行目までを処理することを表している。5行目から8行目の間で処理対象となる状態をqとしている。
5行目はΘに含まれるθ以外の要素について、6行目から8行目を処理することを表している。処理対象とする要素をθ'とする。
6行目ではθ'に含まれる全ての状態について7行目と8行目を処理することを表している。処理対象とする状態をq'とする。
7行目ではε遷移でない遷移のうち、前状態がqであり次状態がq'であるような遷移、または、次状態がqであり前状態がq'であるような遷移が存在しているか否かを判断しており、存在していれば、8行目に進む。
8行目ではψにθ'を追加する。
4行目から8行目は、無向ε閉包θに直接接続されている無向ε閉包をψに集めていることに相当する。
4行目から8行目の一連の処理が完了すると、9行目の処理に移る。9行目はΨに含まれる全ての要素について10行目から12行目の処理を行うことを表している。10行目から12行目の各処理で処理対象とする要素はψ'と表す。
10行目ではψとψ'の積集合が空集合であるか否かを判定する。空集合である場合は9行目に戻る。そうでない場合は11行目に進む。
11行目ではψ'に含まれる要素である無向ε閉包をψに追加する。
12行目ではψ'をΨから取り除く。
9行目から12行目の処理は直接接続されている無向ε閉包から間接接続されている無向ε閉包を見つける処理に該当する。
13行目ではψをΨに追加する。
14行目では1行目から13行目の処理で得られた連結無向ε閉包を要素とする集合Ψを処理結果として返す。
図6は、このような処理により得られる連結無向ε閉包の一例を示す図である。図6の点線で囲まれている部分が連結無向ε閉包である。図6の上部の連結無向ε閉包は、2つの無向ε閉包がε遷移でない遷移1本のみで接続されているために得られる連結無向ε閉包である。一方、図6の下部の無向ε閉包は、上部の無向ε閉包とε遷移でない遷移2本で接続しているので、上部の連結無向ε閉包には含まれず、単独で連結無向ε閉包を構成する。
(ε除去パターン)
ここで、ε除去パターンの詳細について図7〜図9を用いてさらに説明する。図7は、ε遷移の一例を示す図である。図8および図9は、ε除去パターンの一例を示す図である。
ε経路で接続されている2つの状態q1、q2を考える。q1に入ってくる遷移と出て行く遷移の集合をそれぞれEi1、Eo1、q2に入ってくる遷移と出て行く遷移の集合をそれぞれEi2、Eo2とする(図7参照)。q1とq2の間のε遷移を全て削除したときのFSAが元のFSAと同じ動作をするためには、Ei1、Ei2、Eo1、Eo2に含まれる遷移の次状態や前状態を変更したり、複製した上で変更したりする必要がある。
ε遷移を除去しても同じ言語を受理できるように変形する際に必要となる遷移を生成するパターンであるε除去パターンは2つ考えられる。1つは、図8のようにEi1を複製するパターンであり、もう1つが図9のようにEo2を複製するパターンである。
以降、図8および図9のパターンを、それぞれをε除去パターン0、ε除去パターン1と呼ぶ。単に図7のようにε遷移が1本だけの場合では、|Eo1|>0かつ|Ei2|>0である場合はEo2とEi1のうち含まれる遷移の数が小さいほうを複製すればよい。|Eo1|=0の場合はEi1を状態2に移動し、|Ei2|=0の場合はEo2を状態1に移動すればよい。|Eo1|=0かつ|Ei2|=0の場合には、いずれを移動させても結果は同じである。
ところが3つ以上の状態が含まれる無向ε閉包では、ε経路1つを除去するときに最も遷移が減るε除去パターンを選んだとしても、他のε経路の除去も含めるとそのε除去パターンが全体として最も遷移が少ないパターンではないことがある。全ての組み合わせについて調べれば、遷移の数が最も少なくなる組み合わせを見つけることができる。
連結無向ε閉包内に含まれる選択が必要なε除去パターンの総数をNとし、i番目のε除去パターンの選択でε除去パターン0かε除去パターン1のいずれを選んだのかを記録しておく変数をxiとする。この変数xiをN個並べると、x1x2x3・・・xNとなり、これは配列として記録できる。これをε除去パターン配列xとする。
(選択が必要なε除去パターンの列挙)
ステップS103では、組み合わせ生成部103は、まず、選択が必要な全てのε除去パターンを列挙する。以下、詳細について説明する。
連結無向ε閉包に含まれる状態と、その状態から1本以上のε遷移を順方向に進むことで到達することのできる状態とで構成される2つ組をε組と呼ぶこととする。1つのε組につき1つのε除去パターンを選択しなければならないので、全てのε組を列挙できれば、選択が必要な全てのε除去パターンを列挙できたことになる。
図10は、連結無向ε閉包ψに含まれるε組を全て取得する擬似コードの一例を示す図である。ここで、ε−out(q)は、状態qから出て行く遷移のうちε遷移のみから成る集合である。
1行目では集合PεとスタックSを空集合で初期化する。
2行目は、無向ε閉包を要素とする集合ψに含まれる全ての要素について3行目から10行目を処理することを表している。3行目から10行目で処理対象となる無向ε閉包をθとする。
3行目は、無向ε閉包θに含まれる全ての状態について4行目から10行目を処理することを表している。4行目から10行目の各処理で対象となる状態をqとする。
4行目ではqをスタックSに追加し、Qsを空集合で初期化する。
5行目ではスタックSが空集合か否かを判定し、空集合であれば3行目に戻る。そうでなければ6行目に進む。
6行目ではスタックSから状態を取り出しqsに代入する。
7行目ではqsをQsに追加する。
8行目ではqsから出て行くε遷移のうち次状態がQsに含まれない遷移eについて9行目と10行目の処理を行う。
9行目ではPεにqと遷移eの次状態から成る2つ組を追加する。
10行目ではスタックSに遷移eの次状態を追加する。
1行目から10行目までの全ての処理が完了すると、Pεにε組が記録されるので、11行目でPεを処理結果として返す。
(ε除去後の遷移の数の計算)
次に、組み合わせ生成部103は、ε除去後の遷移の数を計算する。以下、詳細について説明する。
連結無向ε閉包内のε遷移をε除去パターン配列xに基づいて除去すると遷移の数がいくつになるかを計算する関数fnum(x,Pε)を考える。Pεはxに対応する図10で得られた状態の2つ組から成る集合である。つまり、Pεのi番目のε組に対応するε除去パターンがε除去パターン配列xのi番目に記録されることになる。したがって、xの長さ(要素の数)を|x|、Pεの要素の数を|Pε|とすると、|x|と|Pε|は等しい。各状態に入ってくる遷移と出て行く遷移の数がどのようになっているかが分かれば良いので、図11と図12で構成される方法によって実現できる。図11は、関数fnumの擬似コードの一例を示す図である。図12は、関数fnumの中で実行される関数make−transitionの擬似コードの一例を示す図である。
ε除去パターン配列xを用いて、ある連結無向ε閉包内のε除去を行う場合には図11のようなfnum(x,Pε)を呼び出す。
1行目ではε除去後の遷移の集合Eneを空集合として初期化する。また、Pεに状態の2つ組として含まれている各々の状態を全てQεに代入する。
2行目はQεに含まれている状態qに対して3行目から7行目を処理することを表している。
3行目では第1引数をq、第2引数をx、第3引数をPεとして関数make−transitionを呼び出し、その結果をEin、Eout、binitial、bfinal、berrorとして受け取る。Einはε除去後に状態qに入ってくる遷移の集合、Eoutはε除去後に状態qから出て行く遷移の集合、binitialはε除去後に状態qが初期状態であるか否かを表している値、bfinalはε除去後に状態qが終了状態であるか否かを表している値、berrorはε除去後に受理する言語が変わるか否かを表している値である。
4行目では受理する言語が変わるか否かを判定し、berrorが偽のときは6行目に進む。真のときは5行目に進む。
5行目では、エラーとして無限大の値、または、fnum(x,Pε)が返すことができる最大の値を返し、処理を完了する。
6行目では7行目へ進むか否かの判定を行う。EinとEoutが共に空集合でない、またはbinitialが真でEoutが空集合でない、またはbfinalが真でEinが空集合でなければ7行目へと進む。そうでなければ2行目へ戻る。
7行目ではEinとEoutをEneへ追加する。
8行目では1行目から7行目までの処理で得られたEneに含まれる遷移の数を処理結果として返す。
次に、図12の関数make−transitionについて説明する。
1行目ではqが初期状態であればbinitialを真(true)に、そうでなければ偽(false)に初期化する。同様にqが終了状態であればbfinalを真に、そうでなければ偽に初期化する。
2行目ではε遷移以外の遷移のうち状態qへと入ってくる遷移をEinに代入する。同様に、ε遷移以外の遷移のうち状態qから出て行く遷移をEoutに代入する。
3行目は変数iの値を1からPεの要素の数まで1ずつ増やしながら4行目から16行目を繰り返し処理することを表す。
4行目ではPεに含まれる要素のうち、i番目の要素である2つ組に含まれる状態をそれぞれqsとqdに代入する。qdはqsからε遷移を順方向に進むことでたどり着ける状態である。
5行目ではqsがqと同じ状態であるか否かを判定し、同じ状態でなければ10行目に進む。同じ状態であれば6行目に進む。
6行目ではε除去パターン配列xのうち、i番目の値が1であるか否かを判定し、1でなければ10行目に進む。1であれば7行目に進む。xiが1であるということはε除去パターン1を選択していることを意味している。すなわちqdから出て行く遷移がqsから出て行く遷移として複製されることを意味している。
7行目ではqdから出て行く遷移のうちε遷移でない遷移をqから出て行く遷移としてEoutに追加する。
8行目ではqdが終了状態か否かを判定し、終了状態でなければ10行目へ進む。そうでなければ9行目へ進む。
9行目ではbfinalに真を代入する。そして10行目へ進む。
10行目ではqdとqが等しいか否かを判定し、等しければ11行目へ進む。そうでなければ3行目へと戻る。
11行目ではε除去パターン配列xのうち、i番目の値が0であるか否かを判定し、0でなければ3行目へ戻る。0であれば12行目へ進む。xiが0であるということはε除去パターン0を選択していることを意味している。すなわちqsに入ってくる遷移がqdに入ってくる遷移として複製されることを意味している。
12行目ではqsが終了状態であるか否かを判定する。終了状態でなければ14行目へ進み、そうでなければ13行目へ進む。
13行目が処理されるとき、元のFSAと異なる言語を受理できるようになることを意味しており、正しいε除去が行えない。そのため、引数として受け取ったε除去パターン配列xが使用されることがないようにしなければならない。そこで、戻り値の5つ組の5つ目の値を真にすることでこのことを呼び出し側に伝達する。このとき5つ組の他の値は使用されないのでどのような値でもよい。
14行目ではqsに入ってくる遷移のうちε遷移でない遷移をqに入ってくる遷移としてEinに追加する。
15行目ではqsが初期状態か否かを判定し、初期状態であれば16行目に進む。そうでなければ3行目に戻る。
16行目ではbinitialに真を代入する。
3行目から16行目の繰り返し処理が完了すると、17行目へ進む。
17行目は1行目から16行目までの処理の結果を5つ組として返す。5つ組の1つ目にはEin、2つ目にはEout、3つ目にはbinitial、4つ目にはbfinal、異なる言語を受理するような変形は発生していないので5つ目には偽が設定される。
ここで、out(q)は状態qから出て行く遷移の集合、in(q)は状態qへ入ってくる遷移の集合である。xiは、Pεに含まれるi番目のε組に対応するε除去パターン配列xのi番目の要素である。
組み合わせ生成部103は、様々なxについてfnum(x,Pε)の値を求め、この値が最も小さくなるようなxを求める。除去部104は、このようにして得られたxに基づいて遷移の生成と破棄を行うことで、ε除去の向きに依存せずにε遷移を除去できる。組み合わせ生成部103がε除去パターン配列xが取りうる全ての値について計算すれば、ε遷移除去後の遷移の数を最小にできる。しかしながら、全ての組み合わせの数は2|x|個である。|x|が大きすぎるために取りうる全ての値について計算できない場合は、組み合わせ生成部103は、いくつかの組み合わせについてのみfnum(x,Pε)を計算し、その中で最も小さい値になるようなxを選ぶようにすればよい。
例えば、全て1と全て0の2パターンのみ計算して、fnum(x,Pε)の値が小さいほうを使うようにする方法が適用できる。他にも、xが0と1の列でしかないことから、遺伝的アルゴリズムなどの組み合わせ最適化問題で用いられる一般的な手法を適用してもよい。
(ε除去に伴う遷移の生成と破棄:ステップS104)
ε除去パターン配列xの値が決まれば、除去部104は、ε除去パターン配列xに基づいて遷移の生成と破棄を行うε除去を実行する。図13は、ε除去の擬似コード(CUEC-ε−removal)の一例を示す図である。
1行目ではPεに含まれる2つ組を構成する状態を全てQεに代入する。さらにQ、E、I、FをそれぞれQnew、Enew、Inew、Fnewに代入する。
2行目はQεに含まれる状態をqとし、Qεに含まれる全ての状態について3行目から12行目を繰り返し処理することを表している。
3行目では第1引数をq、第2引数をx、第3引数をPεとして関数make−transitionを呼び出す。結果は5つ組で戻ってくるが、5つ目の値は使用しない。1つ目がε除去後にqに入ってくる遷移の集合Ein、2つ目がε除去後にqから出て行く遷移の集合Eout、3つ目がε除去後にqが初期状態か否かを表す値binitial、4つ目がε除去後にqが終了状態か否かを表す値bfinalである。ここでは使用しない5つ目の値に対応する部分に「・」を記しているが、これ以降、このように使用しない値が組に含まれる場合には対応する部分に「・」を記すこととする。
4行目は、以下の(1)〜(4)の4つの条件のいずれかが満たされれば5行目でEinとEoutをEnewに追加することを表す。
(1)EinもEoutも空集合でないこと
(2)binitialが真かつEoutが空集合でないこと
(3)bfinalが真かつEinが空集合でないこと
(4)binitialが真かつbfinalが真であること
4行目の条件が満たされない場合、7行目が実行され、EinとEoutがEnewから除去される。さらにqが処理対象のFSAを構成するQnewから除去される。qが初期状態や終了状態である場合はInewやFnewからも削除される。
8行目でbinitialが真であれば9行目で状態qを初期状態の集合Inewに追加する。
10行目でbfinalが真であれば11行目で状態qを終了状態の集合Fnewに追加する。
12行目では状態qから出て行くε遷移をEnewから除去する。13行目で、3行目から12行目までの繰り返し処理で変更されたQnew、Enew、Inew、FnewをそれぞれQ、E、I、Fに代入する。ただし、Enewに関しては前状態と次状態がQnewに含まれる遷移のみをEに代入する。
(全てのε遷移を取り除く方法)
これまでに説明してきた方法を組み合わせると、有限状態オートマトンに含まれる全てのε遷移を取り除く方法(DI−ε−removal)を構成できる。図14は、有限状態オートマトンに含まれる全てのε遷移を取り除く方法の擬似コードの一例を示す図である。図14は、図2のε除去処理に対応する擬似コードの一例である。
1行目でall−undirected−ε−closure()(図3)により、無向ε閉包を計算し、その結果をΘに代入する。
2行目でall−CUEC(Θ)(図5)により、連結無向ε閉包を計算し、その結果をΨに代入する。Ψの要素を連結無向ε閉包ψとし、Ψに含まれる全ての要素に対して4行目から6行目を繰り返し実行する。
4行目ではall−ε−pair(ψ)(図10)により、ψに含まれるε組を取得し、結果をPεに代入する。5行目ではfnum(x',Pε)(図11)を最小にするような、または十分に小さくするようなx'を計算し、それをε除去パターン配列xに代入する。xの全組み合わせを調べても良いし、一部だけを調べてもよい。
6行目ではCUEC-ε−removal(x,Pε)(図13)により、5行目で求めたxに基づいて処理対象のFSAからε遷移を除去する。
全ての連結無向ε閉包について4行目から6行目の処理が完了すると、第1の実施の形態のε除去が完了することになる。
(処理例)
次に、従来法と第1の実施の形態による処理例について説明する。図15は、この例で用いるε除去前のFSAを示す図である。太線の円が初期状態であり、ここでは状態1である。2重線の円が終了状態であり、ここでは状態6である。各遷移の近傍に書かれている文字が割り当てられている入力記号である。ε遷移を除去する前の遷移の総数は10本である。
図16は、従来法によってε除去を行った結果を示す図である。図16に示すように、従来法でε除去を行った後の遷移の総数は9本である。
図17は、遷移の向きを反転させた後に従来法によってε除去を行った結果を示す図である。すなわち、図17は、遷移の向きを反転させた後、初期状態と終了状態を入れ替えた後に従来法によるε除去を行い、遷移の向きを元の向きに戻し、初期状態と終了状態も元に戻した場合のFSAを表す。図17に示すように、この場合のε除去後の遷移の総数は10本である。
図18は、第1の実施の形態で述べた方法によってε除去を行った結果を示す図である。図18に示すように、第1の実施の形態の方法でε除去を行った後の遷移の総数は8本である。
以下、擬似コードを用いて具体的な処理手順を説明する。
処理は、図14の1行目の擬似コードから開始する。1行目では関数all−undirected−ε−closureを用いて無向ε閉包を全て求める。この結果、Θ={{1,3},{2,4},{5,6,7}}が得られる。このΘを入力として、さらに関数all−CUECにより連結無向ε閉包が得られる。すなわち、Ψ={{{1,3},{2,4},{5,6,7}}}が得られる。この例の場合、全ての状態が1つの連結無向ε閉包に含まれることになる。したがって、図14の4行目から6行目は状態の集合{{1,3},{2,4},{5,6,7}}で構成される連結無向ε閉包に対してのみ実行されることになる。4行目で全てのε組を取得する。その結果、Pε={(1,3),(2,4),(5,6),(5,7)}が得られる。
1番目の組を(1,3)、2番目の組を(2,4)、3番目の組を(5,6)、4番目の組を(5,7)とすると、fnumを最も小さくするε除去パターン配列の1つはx=0111となる。これは、x1=0、x2=1、x3=1、x4=1であることを意味する。このε除去パターン配列に基づいて5行目で実際にε遷移を除去し、必要な遷移を生成する。
ε除去では、図13の3行目から12行目を各状態について処理していけばよい。Qε={1,2,3,4,5,6,7}である。最後に13行目でQやEにε除去の結果を反映させる。
q=1の場合について述べる。このとき、3行目の結果はEin=φ、Eout={(1,b,2)}、binitial=true、bfinal=falseとなる。4行目の2番目の条件を満たすので、5行目を実行するが、Enewは変化しない。追加される遷移や状態は既に元のFSAに含まれているからである。8行目の条件を満たすが、元々状態1はInewに含まれているので9行目を実行してもInewに変化はない。12行目でε遷移(1、ε、3)をEnewから除去する。
q=2の場合について述べる。このとき、3行目の結果はEin={(1,b,2)}、Eout={(2,a,5)}、binitial=false、bfinal=falseとなる。4行目の1番目の条件を満たすので5行目により、Enewに遷移(2,a,5)が追加される。(1,b,2)は元のFSAに含まれている。12行目でε遷移(2,ε,4)をEnewから除去する。
q=3の場合について述べる。このとき、3行目の結果はEin={(5,c,3)}、Eout={(3,a,5)}、binitial=true、bfinal=falseとなる。4行目の1番目と2番目の条件を満たすので、5行目で(5,c,3)、(3,a,5)が追加されるが元々存在しているので、Enewに変化はない。8行目の条件も満たすので9行目を実行すると、状態3が初期状態に追加される。
q=4の場合について述べる。このとき、3行目の結果はEin=φ、Eout={(4,a,5)}、binitial=false、bfinal=falseとなる。4行目の条件を満たさないので7行目を実行するとEnewから遷移(4,a,5)が除去され、Qnewから状態4が除去される。
q=5の場合について述べる。このとき、3行目の結果はEin={(3,a,5),(4,a,5)}、Eout={(5,c,3),(5,a,7),(5,b,6)}、binitial=false、bfinal=trueとなる。4行目の条件を満たすので、Ein、EoutをEnewに追加する。既に存在する遷移もあるが、新たにEnewに追加される遷移は(5,a,7)と(5,b,6)である。10行目の条件も満たすので、状態5はFnewに追加され、終了状態となる。12行目で遷移(5,ε,6)と(5,ε,7)をEnewから削除する。
q=6の場合について述べる。このとき、3行目の結果はEin={(7,b,6)}、Eout={(6,a,7)}、binitial=false、bfinal=trueとなる。4行目の条件を満たすので、EinとEoutをEnewに追加するが、Enewに既に存在するので新たに追加される遷移はない。
q=7の場合について述べる。このとき、3行目の結果はEin={(6,a,7)}、Eout={(7,b,6)}、binitial=false、bfinal=falseとなる。4行目の条件を満たすので、EinとEoutをEnewに追加するが、Enewに既に存在するので新たに追加される遷移はない。
最後に13行目でEnewに含まれる遷移のうち前状態と次状態がQnewに含まれる遷移をEに代入し、Qnew、Inew、FnewをそれぞれQ、I、Fに代入すれば、第1の実施の形態によるε除去が完了し、図18のような結果が得られる。
次に、第1の実施の形態の情報処理装置100のハードウェア構成について説明する。図19は、第1の実施の形態の情報処理装置100のハードウェア構成例を示すブロック図である。
図19に示されるように、情報処理装置100は、CPU(Central Processing Unit)1、操作部2、表示部3、ROM(Read Only Memory)4、RAM(Random Access Memory)5、記憶部6、およびバス7等を備えている。各部はバス7により接続されている。
CPU1は、RAM5の所定領域を作業領域として、ROM4または記憶部6に予め記憶された各種制御プログラムとの協働により各種処理を実行し、情報処理装置100を構成する各部(第1集合生成部、第2集合生成部、組み合わせ生成部、除去部等)の動作を統括的に制御する。またCPU1は、ROM4または記憶部6に予め記憶された所定のプログラムとの協働により各部の機能を実現させる。
操作部2は、マウスやキーボード等の入力デバイスであって、ユーザから操作入力された情報を指示信号として受け付け、その指示信号をCPU1に出力する。
表示部3は、LCD(Liquid Crystal Display)等の表示装置により構成され、CPU1からの表示信号に基づいて、各種情報を表示する。
ROM4は、情報処理装置100の制御にかかるプログラムや各種設定情報等を書き換え不可能に記憶する。
RAM5は、SDRAM等の揮発性の記憶媒体であって、CPU1の作業エリアとして機能する。具体的には、ε除去処理時において生成される各種変数やパラメータの値等を一時記憶するバッファ等の役割を果たす。
記憶部6は、フラッシュメモリ等の半導体による記憶媒体や、磁気的または光学的に記録可能な記憶媒体を有し、情報処理装置100の制御にかかるプログラムや各種設定情報等を書き換え可能に記憶する。また記憶部7は、FSAに係る各種の情報を予め記憶したり、ε除去処理の処理結果であるFSAを記録したりする。
第1の実施の形態にかかる情報処理装置で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでCD−ROM(Compact Disk Read Only Memory)、フレキシブルディスク(FD)、CD−R(Compact Disk Recordable)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録されてコンピュータプログラムプロダクトとして提供される。
また、第1の実施の形態にかかる情報処理装置で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、第1の実施の形態にかかる情報処理装置で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
また、第1の実施の形態のプログラムを、ROM等に予め組み込んで提供するように構成してもよい。
なお、後述する第2および第3の実施の形態の情報処理装置のハードウェア構成も図19と同様である。また、第2および第3の実施の形態の情報処理装置で実行されるプログラムも上記説明と同様の構成で同様の手法により提供される。
以上のように、第1の実施の形態にかかる情報処理装置では、ε除去パターンの選択の結果が影響する状態の範囲(連結無向ε閉包)を求め、求めた連結無向ε閉包ごとにε除去を実行する。連結無向ε閉包は、ε遷移の向きに依存せずに探索される。このため、ε除去の向きに対する依存性がなくなり、元の遷移の向きでε除去を行うか、元の遷移の向きとは逆向きにε除去を行うかを選ぶ必要がなくなる。さらに、従来の方法と同じかそれよりも少ない数の遷移で構成される有限状態オートマトンを得ることができる。
(第2の実施の形態)
第2の実施の形態では、重み付き有限状態オートマトン(WFSA)に現れるε遷移を除去する方法を説明する。ここでいうε遷移とは、入力記号がεであるような遷移のことを言う。WFSAは、ある記号列が入力されるとその記号列を受理するか否かを判定し、さらに受理する場合はその重みを出力する機能を持つ。出力される重みは、入力される記号列に対応する経路上にある重みを、次に説明する一定の規則で計算することで求められる。
記号列xの入力に対応する経路のうちi番目の経路をπiとする。経路πは1または複数の遷移で構成され、それぞれの遷移を初期状態から到達できる順にe1、e2、・・・、enとする。遷移eiの重みをw(ei)とし、経路πの重みをw(π)=w(e1)(×)w(e2)(×)・・・(×)w(en)であるとする。記号列xに対応する重みはw(x)=w(π1)(+)w(π2)(+)・・・(+)w(πn)とする。すなわち、全ての経路の重みを(+)で演算した結果とする。
ここで、演算(+)には例えばminやmaxなどの演算を用いることができる。また、演算(×)には例えば+(加算)や×(乗算)などを用いることができる。任意の重みcに対して1#をc(×)1#=1#(×)c=cを満たす値であると定義する。例えば(×)が+の場合は1#は0であり、(×)が×である場合は1#は1である。すなわち、1#は、任意の状態間を結ぶ経路上の重みの計算をするときにその値がなかったとしても計算結果が変化しない値(特定値)である。
このような重みの演算を一般化するこのような手法についてはMehryar Mohri,“Semiring Frameworks and Algorithms for Shortest−distance Problems”(Journal of Automata,Languages and Combinatorics,2002,vol.7,pp.321−350)に詳しい記載がある。
ε遷移上に1#以外の値が割り当てられているときにε遷移を取り除くと、取り除いたε遷移を含む経路に対応する記号列を入力したときに得られる重みが変化する。したがって、第1の実施の形態で説明した方法を用いてε遷移を除去するためには、事前にε遷移上の重みが1#になるようにWFSAを変形する必要がある。
図20は、第2の実施の形態にかかる情報処理装置200の構成の一例を示すブロック図である。図20に示すように、情報処理装置200は、変更部205と、第1集合生成部101と、第2集合生成部102と、組み合わせ生成部203と、除去部204と、を備えている。
第2の実施の形態では、変更部205を追加したこと、および、組み合わせ生成部203と除去部204の機能が第1の実施の形態と異なっている。その他の構成および機能は、第1の実施の形態にかかる情報処理装置100の構成を表すブロック図である図1と同様であるので、同一符号を付し、ここでの説明は省略する。
変更部205は、WFSAに含まれる任意の状態間を結ぶ経路に含まれるε遷移の重みを特定値1#となるように変更する。組み合わせ生成部203は、重みを考慮して遷移数を評価する点が第1の実施の形態の組み合わせ生成部103と異なる。除去部204は、重みを考慮してε除去を実行する点が、第1の実施の形態の除去部104と異なる。
(方法)
次に、このように構成された第2の実施の形態にかかる情報処理装置200によるε除去処理について説明する。上記の理由により、WFSAの場合には、全てのε遷移上にある重みが1#になるようにWFSAを変形した後、第1の実施の形態と同様の方法によってε遷移を除去する。
(重みの移動)
ε遷移上に重みができる限り残らないように(ε遷移上の重みができる限り1#になるように)ε遷移の前後に重みを移動させる。図21は、重みを移動させる方法の擬似コード(push−weight)の一例を示す図である。なお、図中の丸印の中に+を含む記号は上述の(+)に相当し、丸印の中に×を含む記号は上述の(×)に相当する。重みが小さいほうが良い経路の場合は、(+)をminで、(×)を+で、1#を0であるとして処理すれば良い。重みが大きいほうが良い経路の場合は、(+)をmaxで、(×)を+で、1#を0であるとして処理すればよい。
1行目ではPεに含まれている状態の2つ組のうち、1つ目の状態を集めてQsに代入する。同様に2つ目の状態を集めてQdに代入する。また、Wを空集合で初期化する。
2行目はQsに含まれる状態をqsとし、Qsに含まれる各状態について3行目から15行目を処理することを表している。
3行目ではPεに含まれる状態の2つ組のうち、1つ目の状態がqsであるような2つ目の状態を集め、Qnに代入する。これは、qsからε経路を順方向にたどることで到達できる状態の集合を取得することに等しい。
4行目ではqsからQnに含まれる各々の状態までのε経路のうちの最良経路の重みを関数ε−distanceによって計算し、その結果をW’に代入する。W'の要素は3つ組(ε経路の最初の状態、ε経路の最後の状態、ε経路上の重み)である。ここでは3つ組の1番目の状態はqsであり、2番目の状態はQnに含まれる状態のいずれかである。3番目は、1番目の状態と2番目の状態間のε経路のうちの最良経路の重みである。
ε−distanceは良く知られているダイクストラのアルゴリズムによって計算することができる。また、上述のMohriの文献に記載されている1つの状態からの最短距離問題(single−source shortest−distance problem)を解く一般的な方法によっても計算することができる。
5行目では状態qsに入ってくるε遷移が存在するか、または、状態qsが終了状態であれば、6行目でW'をWに追加する。そうでなければ、8行目に進む。
8行目では4行目で得られた3つ組の3番目の値である重み全てと状態qsから出て行く遷移のうちε遷移でない遷移の重み全てとを(+)で演算し、その結果をwに代入する。ここで、weight(e)は遷移eに割り当てられている重みである。(+)がminなら、これらの重みのうち最も小さい値が得られることになる。
9行目では、W'に含まれる3つ組の3番目に記録されている重みとwm −1とを(×)演算で処理した値を新たな3番目の値とする3つ組をWに追加する。(+)がmaxで(×)が+であるか、または、(+)がminで(×)が+である場合、y−1は−yと等しい。例えば、wmが2でwが3の場合、wm −1(×)w=−wm+w=−2+3=1になる。
10行目と11行目では、qsから出て行く遷移のうちε遷移を除く遷移の重みwを、wm −1とwを(×)によって演算した結果に置き換える処理を行う。
12行目と13行目では、qsに入ってくる遷移のうちε遷移を除く遷移の重みwをwとwmを(×)によって演算した結果に置き換える処理を行う。例えば、qsに入ってくる遷移eの重みが10で、wmが2であり、(×)を+としているのであれば、この処理の完了後は、遷移eの重みは12となる。
14行目と15行目では、状態qsが初期状態である場合に状態qsの初期重みλ(qs)をλ(qs)(×)wmに置き換える。
2行目から15行目の処理の結果、ε遷移に割り当てられている重みが遷移の向きとは逆向きの方向に押し出されることになる。
16行目はQdに含まれる状態をqdとし、Qdに含まれる各状態について17行目から25行目の処理を行うことを表している。
17行目ではWに含まれる3つ組のうち、2番目に記録されている状態がqdであるような3つ組の3番目に記録されている重み全てと、状態qdに入ってくる遷移のうちε遷移でない遷移に割り当てられている重み全てを(+)で演算し、wmに代入する。
18行目と19行目ではWに含まれる3つ組のうち、2番目に記録されている状態がqdであるような3つ組の3番目に記録されている重みwをw(×)wm −1によって得られる値に置き換える。
20行目と21行目では、ε遷移でないqdに入ってくる遷移の重みwをw(×)wm −1で得られる値に置き換える。
22行目と23行目では、ε遷移でないqdから出て行く遷移の重みwをwm(×)wで得られる値に置き換える。
24行目と25行目では、状態qdが終了状態である場合に状態qdの終了重みρ(qd)をwm(×)ρ(qd)に置き換える。
16行目から25行目の処理の結果、ε遷移に割り当てられている重みが遷移の向きに押し出されることになる。
26行目では、Wに含まれる3つ組の3番目に記録されている重みが1#である3つ組をWから取り除く。
27行目で1行目から26行目の処理によって得られたWをこの処理の結果として返す。
図21に示すpush−weightだけではε経路上の重みが全て1#になるとは限らない。そこで、ε経路上の重みを全て1#にするために、重みが残っているε経路ごとに新たに状態と遷移を追加する。追加の方法は2種類存在する。1つはε経路の前の状態とその状態へ入ってくる遷移を複製して、ε遷移上の重みを割り当てる方法である。もう1つはε経路による次の状態とその状態から出て行く遷移を複製して、ε遷移上の重みを割り当てる方法である。前者の方法をプッシュパターン0と呼び、後者の方法をプッシュパターン1と呼ぶ。この2つを総称してプッシュパターンと呼ぶ。
図22は、プッシュパターンの一例を示す図である。図22中の個々の遷移の付近にあるスラッシュで分けられて記載されている部分のスラッシュの左側がその遷移に割り当てられた入力記号であり、スラッシュの右側が重みである。
図23は、ε除去パターン配列xの一例を示す図である。いずれのプッシュパターンを用いるかを表す0と1の列を、第1の実施の形態におけるε除去パターン配列xに付け加える。すると、図23のようにε除去パターン配列xは、ε除去用のε除去パターンを記述した部分と重みの処理用のプッシュパターンを記述した部分とに分かれる。
したがって、組み合わせ生成部203が遷移数の評価に用いる関数fnum(x,Pε)は第1の実施の形態とは異なることになる。一方で組み合わせの探索に関しては第1の実施の形態と同様に行うことができる。以下では、第2の実施の形態の組み合わせ生成部203が関数fnumの代わりに用いる関数を関数gnum(x,Pε,W)と表す。ここで、Wは図21に示すpush−weightが処理結果として返す集合である。図24は、関数gnumの擬似コードの一例を示す図である。図25は、関数gnumで用いられる関数make−pathの擬似コードの一例を示す図である。
図24の1行目ではxとPεとWに基づいて新たな状態と遷移が生成される。生成された状態と遷移がそれぞれQnewとEnewに代入される。そのうち、初期状態はInewに代入され、終了状態はFnewに代入される。新たな状態と遷移が生成されるため、ε組が変化する。変化したε組がPε'に代入される。
2行目から5行目の処理は、1行目で生成した状態や遷移を追加したWFSAからε除去後の遷移の数を取得する処理である。具体的には次のとおりである。
2行目では、処理対象であるWFSAに含まれる状態、遷移、初期状態、終了状態をそれぞれ、Qold、Eold、Iold、Foldに記録する。
3行目ではQnew、Enew、Inew、Fnewをそれぞれ、処理対象であるWFSAの状態の集合Q、遷移の集合E、初期状態の集合I、終了状態の集合Fに追加する。
4行目では第1の実施の形態で用いた関数fnumによってε除去後の遷移の数を取得し、それをNに代入する。
5行目では、2行目で保存したQold、Eold、Iold、Foldを用いて元のWFSAに戻す。
6行目では、1行目から5行目の処理で得られた遷移の数Nを処理の結果として返す。
次に、図25の関数make−pathについて説明する。図25の1行目ではQnewとEnewを空集合として初期化する。
2行目は3行目から15行目の処理についてi=1から|x|−|Pε|まで繰り返し処理することを表している。
3行目ではWのi番目の要素であるwiに記録されている3つ組の1番目をqsに2番目をqdに3番目をwに代入する。
4行目ではQに含まれていない新しい状態を作成し、qnewに代入する。
5行目では4行目で作成した新しい状態qnewをQnewに追加する。
6行目ではxのi+|Pε|番目の値が0か否かを判定し、0なら7行目へ進む。0以外なら12行目へ進む。
7行目から10行目ではプッシュパターン0に基づいて遷移の生成とε組の変更などを行う。
7行目では状態qsに入ってくる遷移のうち、ε遷移でない遷移を状態qnewに入ってくる遷移として複製する。このとき重みをweからwe(×)wに置き換える。
8行目では不要になるε組(qs,qd)をPεから取り除き、新たにε組(qnew、qd)を追加する。
9行目でqsが初期状態か否かを判定し、初期状態であれば10行目でqnewをInewに追加し、qnewの初期重みをqsの初期重みとwを(×)で演算した結果にする。
12行目から15行目はプッシュパターン1に基づいて遷移の生成とε組の変更などを行う。
12行目では状態qdから出て行く遷移のうち、ε遷移でない遷移を状態qnewから出て行く遷移として複製する。このとき重みをweからw(×)weに置き換える。
13行目では不要になるε組(qs,qd)をPεから取り除き、新たにε組(qs,qnew)を追加する。
14行目でqdが終了状態か否かを判定し、終了状態であれば15行目でqnewをFnewに追加し、qnewの終了重みをwとqdの終了重みを(×)で演算した結果にする。
16行目では1行目から15行目の処理の結果として、5つ組(Qnew,Enew,Inew,Fnew,Pε)を返す。
(WFSAに含まれる全てのε遷移を除去する方法)
以上で説明した方法を組み合わせることで、WFSAに含まれるε遷移を全て除去することができる。図26は、WFSAに含まれるε遷移を全て除去する方法の擬似コード(WFSA−DI−ε−removal)の一例を示す図である。
1行目では第1の実施の形態と同様に、all−undirected−ε−closure()(図3)により、無向ε閉包を計算し、その結果をΘに代入する。
2行目でall−CUEC(Θ)(図5)により、連結無向ε閉包を計算し、その結果をΨに代入する。
3行目はΨに含まれる連結無向ε閉包ψの各々について4行目から9行目までを処理することを表している。
4行目では第1の実施の形態と同様に、ε組を求め、Pεに代入する。
5行目では、ε組Pεを第1引数として図21の方法を用いることによってε遷移上の重みをできる限り前後のε遷移でない遷移に移動させる。さらに、重みの移動後のε組の状態間を結ぶε経路のうち最良経路の重みがその経路の最初の状態と最後の状態と共に3つ組として得られる。その3つ組から構成される集合がWに代入される。
6行目では、長さが|Pε|+|W|であるようなε除去パターン配列x'の内容を様々に変えることで関数gnumが最も小さくなるx'を見つけ、それをxに代入する。第1の実施の形態のときと同様、全てのxの組み合わせを探索することもできるし、一部のみの探索にとどめておくこともできる。第1の実施の形態と同様、どこを探索するかは一般的な組み合わせ最適化の方法を用いればよい。例えば遺伝的アルゴリズムを適用できる。全てが0か全てが1の2通りのみを調べるだけにすることもできる。
7行目では6行目で得られたxに基づいて図25の関数make−pathによって得られる新たな状態の集合と遷移の集合、初期状態の集合、終了状態の集合をそれぞれQnew、Enew、Inew、Fnewに代入する。また、それに伴うPεの変更も行う。
8行目では7行目で得られたQnew、Enew、Inew、FnewをそれぞれQ、E、I、Fに追加する。
9行目では、8行目で状態や遷移を追加したWFSAのε遷移をxとPεに基づいて除去し、それに伴う必要な変形を行う。これは第1の実施の形態と同じである。ただし、初期重みと終了重みの処理が追加される(詳細は後述)。以上の処理により、WFSAのε遷移を除去することができる。
次に、図26の9行目で用いる関数WFSA−CUEC−ε−removalの詳細について図27を用いて説明する。図27は、ε除去の擬似コード(WFSA−CUEC-ε−removal)の一例を示す図である。
3行目で得られる戻り値に初期重みと終了重みの項目が追加され、その値を用いて9行目で初期重みの設定を、11行目で終了重みの設定を行うように追加される。さらに1行目と13行目にも初期重みと終了重みに関する処理が追加される。1行目には、初期状態q∈Iに対応する初期重みλ(q)をλnew(q)に代入し、同様に終了状態q∈Fに対応する初期重みρ(q)をρnew(q)に代入する処理が追加される。13行目には、初期状態q∈Inewに対応する初期重みλnew(q)をλ(q)に、終了状態q∈Fnewに対応する終了重みρnew(q)をρ(q)に代入する処理が追加される。その他は、第1の実施の形態のε除去の擬似コードである図13のCUEC-ε−removalと同様であるため説明を省略する。
図28は、図27の3行目で使用される関数WFSA−make−transitionの擬似コードの一例を示す図である。図28は、図12の関数make−transitionに以下のような処理を追加している。
1行目では初期重みと終了重みの処理を追加している。λqに状態qの初期重みを、ρqに状態qの終了重みを代入している。状態qが初期状態でない場合において、(+)にmin、(×)に+を使うときは∞を、(+)にmax、(×)に+を使うときは−∞をλqに代入する。状態qが終了状態でない場合も同様に扱う。
9行目では最良の終了重みを計算する処理を、16行目では最良の初期重みを計算する処理を加えている。また、13行目と17行目の戻り値にλqとρqを追加している。
(処理例)
次に、従来法と第2の実施の形態による処理例について説明する。図29は、この例で用いるε除去前のWFSAを示す図である。太線の円が初期状態であり、スラッシュの左側が状態番号を表し、右側が初期重みを表す。ここでは状態1と2が初期状態であり、それぞれ初期重みが2と5である。2重線の円が終了状態であり、スラッシュの左側が状態番号を表し、右側が終了重みを表す。ここでは状態6と7が終了状態であり、それぞれ終了重みが1と3である。各遷移の近傍に書かれている文字のうち、スラッシュの左側が割り当てられている入力記号であり、右側が割り当てられている重みである。ε遷移を除去する前の遷移の総数は9本である。
第2の実施の形態による方法も従来法も、この例では(+)をmin、(×)を+として重みの処理を行うこととする。
図30は、従来法によってε除去を行った結果を示す図である。図30に示すように、従来法でε除去を行った後の遷移の総数は6本である。
図31は、遷移の向きを反転させた後に従来法によってε除去を行った結果を示す図である。すなわち、図31は、遷移の向きを反転させた後、初期状態と終了状態を入れ替えた後に従来法によるε除去を行い、遷移の向きを元の向きに戻し、初期状態と終了状態も元に戻した場合のWFSAを表す。図31に示すように、この場合のε除去後の遷移の総数は7本である。
以下、第2の実施の形態によってε除去を行う場合について説明する。図26の2行目で連結無向ε閉包が得られる。すなわち、Ψ={{{2,3,4,5,6}}}が得られる。この例の場合は、連結無向ε閉包は1つだけなので、それについて3行目から8行目を処理する。
4行目でε組が得られる。すなわち、Pε={(2,4),(2,5),(3,5),(3,6)}が得られる。5行目でε遷移上の重みをできるだけ前後に移動させて、ε遷移上の重みをなくす。ただし、元のε遷移に割り当てられている重みは変更する必要はない。変更後の情報は戻り値を代入して得られるWに記録されている。すなわち、W={(3,5,1)}となる。状態3と状態5のε経路に重みが1残っているが、それ以外の経路は重みが残っていないことを表している。図32は、このようにして重みを移動した後のWFSAを示す図である。
6行目で最も遷移の数が少なくなるxが得られる。1番目の組を(2,4)、2番目の組を(2,5)、3番目の組を(3,5)、4番目の組を(3,6)とし、5番目に記録されるプッシュパターンに対応するWの要素を(3,5,1)とする。この場合、関数gnumを最も小さくするε除去パターン配列の1つはx=11111となる。これは、x1=1、x2=1、x3=1、x4=1、x5=1であることを意味する。6行目と7行目で必要な状態と遷移を生成し、Pεを更新する。図33は、この処理の後に得られるWFSAを示す図である。
新しく生成された状態8には入ってくる遷移がないが、ε組として更新後のPεに含まれているため次のε除去処理で問題になることはない。なお、更新後のPεは{(2,4),(2,5),(3,8),(3,6)}となっている。最後に8行目で実際にε遷移を除去し、必要な遷移を生成する。図34は、ε除去の最終結果を示す図である。
このように、第2の実施の形態にかかる情報処理装置では、WFSAのような入力記号以外の情報が遷移に割り当てられている有限状態オートマトンに対しても、遷移の方向に依存せずにε遷移の除去を行うことができる。さらに、従来法と同じかそれより少ない遷移のWFSAを得ることができる。
(第3の実施の形態)
第3の実施の形態では、有限状態トランスデューサ(FST)のε遷移の除去方法を説明する。FSTの場合も第2の実施の形態の場合と同様に、全てのε遷移上にある文字列が空文字列(空記号)であるεになるようにFSTを変形した後に第1の実施の形態の方法でε除去を行う。第2の実施の形態で用いた1#がεに該当する。
図35は、第3の実施の形態にかかる情報処理装置300の構成の一例を示すブロック図である。図35に示すように、情報処理装置300は、変更部305と、第1集合生成部101と、第2集合生成部102と、組み合わせ生成部303と、除去部304と、を備えている。
第3の実施の形態では、変更部305、組み合わせ生成部303、および除去部304の機能が第2の実施の形態と異なっている。その他の構成および機能は、第2の実施の形態にかかる情報処理装置200の構成を表すブロック図である図20と同様であるので、同一符号を付し、ここでの説明は省略する。
変更部305は、FSTに含まれる任意の状態間を結ぶ経路に含まれるε遷移の出力記号を空記号εとなるように変更する。組み合わせ生成部303は、重みの代わりに出力記号を用いて遷移数を評価する点が第2の実施の形態の組み合わせ生成部203と異なる。除去部304は、重みの代わりに出力記号を用いてε除去を実行する点が、第2の実施の形態の除去部204と異なる。
(方法)
次に、このように構成された第3の実施の形態にかかる情報処理装置300によるε除去処理について説明する。
(文字列の移動)
第3の実施の形態では、まず、ε遷移上にある文字列ができる限り空文字列となるように文字列を移動させる。第2の実施の形態で説明した重みの移動処理(図21のpush−weight)と基本的には同じである。ただし、ε−distanceの部分を次に説明するε−outputに変更し、(+)を前方最長一致演算とし、(×)を出力記号列の連結演算であるとする。この場合、例えば、ab(+)ac=a、a(×)b=ab、a(×)ε=ε(×)a=aのようになる。
図36は、文字列の移動方法の擬似コード(push−output)の一例を示す図である。
1行目ではPεに含まれている状態の2つ組のうち、1つ目の状態を集めてQsに代入する。同様に2つ目の状態を集めてQdに代入する。また、Oを空集合で初期化する。
2行目はQsに含まれる状態をqsとし、Qsに含まれる全ての状態について3行目から15行目を処理することを表している。
3行目は図21と同様である。
4行目ではqsからQnに含まれる各々の状態までのε経路にある出力記号を関数ε−outputによって計算し、その結果をO'に代入する。O'の要素は3つ組(ε経路の最初の状態,ε経路の最後の状態,ε経路上の出力記号)である。ここでは3つ組の1番目の状態はqsであり、2番目の状態はQnに含まれる状態のいずれかである。3番目は、1番目の状態と2番目の状態間のε経路にある出力記号である。ε−outputについては後述する。
5行目と6行目では状態qsに入ってくるε遷移が存在するか、または、qsが終了状態であるとき、O'をOに追加する。そうでないときは、8行目に進む。
8行目では4行目で得られた3つ組の3番目の値である出力記号全てと状態qsから出て行く遷移のうちε遷移でない遷移の出力記号全てとで前方最長一致演算を行い、その結果をomに代入する。ここで、output(e)は遷移eに割り当てられている出力記号である。
9行目では、O'に含まれる3つ組の3番目に記録されている出力記号とom −1とを(×)演算で処理した値を新たな3番目の値とする3つ組をOに追加する。om −1(×)oは、出力記号oの前方からomを取り除く処理を表している。例えばom=abでoがabcなら、この処理の結果はcになる。
10行目と11行目では、qsから出て行く遷移のうちε遷移を除く遷移の出力記号oの前方からomを取り除いた出力記号に置き換える処理を行う。例えば、qsから出て行く遷移eの出力記号がbcで、wmがbであれば、この処理の完了後は、遷移eの出力記号はcとなる。
12行目と13行目では、qsに入ってくる遷移のうちε遷移を除く遷移の出力記号oをoとomをつなげた出力記号に置き換える処理を行う。例えば、qsに入ってくる遷移eの出力記号がaで、wmがbであれば、この処理の完了後は、遷移eの出力記号はabとなる。
14行目と15行目では、状態qsが初期状態である場合に状態qsの初期出力記号λo(qs)をλo(qs)(×)omで得られる出力記号に置き換える。
16行目はQdに含まれる状態をqdとし、Qdに含まれる各状態のうちqdから出て行くε遷移がなくqdが初期状態でない場合について、17行目から26行目の処理を行うことを表している。
17行目ではOに含まれる3つ組のうち、2番目に記録されている状態がqdであるような3つ組の3番目に記録されている出力記号全てと、状態qdに入ってくる遷移のうちε遷移でない遷移に割り当てられている出力記号全てとを逆向きにしたうえで前方最長一致演算によって処理する。例えば出力記号にabcとbbcが存在するなら、omにはcbが代入されることになる。なお擬似コード中のrevは出力記号を逆向きにする関数である。
18行目から20行目ではOに含まれる3つ組のうち、2番目に記録されている状態がqdであるような3つ組の3番目に記録されている出力記号oを次の出力記号に置き換える。その出力記号とは、oを逆向きにして、前方からomを取り除き、その結果の出力記号を逆向きにしたものである。
21行目と22行目では、ε遷移でないqdに入ってくる遷移eの出力記号を逆向きにし、その前方からomを取り除き、さらに逆向きにした結果を遷移eの新たな出力記号とする。
23行目と24行目では、ε遷移でないqdから出て行く遷移eの出力記号を、その出力記号の前方にomを逆向きにした出力記号をつなげた出力記号に置き換える。
25行目と26行目では、状態qdが終了状態である場合に状態qdの終了出力記号ρo(qd)を、omを逆向きにした出力記号とρo(qd)とをつなげた出力記号に置き換える。
27行目では、Oに含まれる3つ組の3番目に記録されている出力記号がε、すなわち出力記号が空である3つ組をOから取り除く。
28行目では1行目から27行目の処理によって得られたOをこの処理の結果として返す。
次に、ε−outputの詳細について説明する。ε−distanceと異なり、ε−outputは2つの状態間を結ぶε遷移のみで構成される経路上にある出力記号列の組み合わせ全てを計算する。図37は、関数ε−outputの擬似コードの一例を示す図である。
1行目では後述する関数ε−DFSを呼び出し、その結果を状態の集合Qoと遷移の集合Eoに代入する。出力記号の集合Lも空集合に初期化する。
2行目は、3行目から7行目の処理をQoに含まれる各々の状態qに対して処理することを表している。ただし、その処理順序は遷移の集合Eoのみを使って計算したトポロジカル順であるとする。そうすることで、ある状態を処理するときには、qsからその状態に到達するために通過する経路上にある状態については既に3行目から7行目の処理が完了していることが保証される。
3行目は、Eoに含まれる遷移のうち、qに入ってくるε遷移eについて4行目から7行目の処理を行うことを表している。
4行目と5行目では、遷移eの前の状態に対応する出力記号の集合L(p(e))が空集合の場合、状態qに対応する出力記号の集合L(q)に遷移eの出力記号を追加する。
6行目は、遷移eの前状態に記録されている出力記号の集合L(p(e))に含まれる出力記号oについて7行目を処理することを表している。
7行目では、出力記号oに遷移Eに割り当てられている出力記号をつなげた出力記号を状態qに割り当てられる出力記号L(q)に追加する。
8行目から11行目では、7行目までで得られた結果を処理結果として返すための形式に変換する。その結果、集合Rには3つ組(qs,Qdに含まれる状態のいずれか,出力記号)が要素として記録される。3つ組の3番目にはqsから2番目に記録されている状態までのε経路上の出力記号が記録されることになる。
12行目では、11行目までの処理で得られた集合Rを処理結果として返す。
次に、関数ε−DFSの詳細について説明する。この関数によって、第1引数で指定される状態を最初の状態とする全てのε経路上にある状態の集合と遷移の集合を得ることができる。図38は、関数ε−DFSの擬似コードの一例を示す図である。
1行目では状態の集合QsとQoにqを追加する。Eoには空集合を代入する。
2行目は、状態qから出て行くε遷移eについて3行目から7行目までの処理を行うことを表している。
3行目では遷移eの次状態がQsに含まれているか否かを判定し、含まれていなければ4行目に処理を進める。
4行目ではEoに遷移eを追加する。
5行目では遷移eの次状態がQoに含まれているか否かを判定し、含まれていなければ6行目に処理を進める。
6行目では関数ε−DFSを再帰的に呼び出す。引数は、遷移eの次状態とQsとQoである。得られた結果はQrとErに代入する。
7行目では6行目で得られたQrとErをそれぞれQoとEoに追加する。
8行目では、7行目までの処理で得られた結果としてQoとEoから成る2つ組を返す。
(FSTに含まれる全てのε遷移を除去する方法)
FSTに含まれる全てのε遷移を除去するには、図26の重みに関する処理を出力記号に関する処理に置き換えればよい。置き換える箇所を以下に説明する。1つは4行目のpush−weightをpush−outputに変更することである。それに伴いWに記録されている3つ組の3番目が重みから出力記号に変わる。他には、初期状態qに対応する初期重みλ(q)に対する処理を初期出力記号λo(q)に変更する。また、終了状態qに対応する終了重みρ(q)に対する処理を終了出力記号ρo(q)に変更する。同様に図25、図27、図28の重みに関する処理を出力記号に関する処理に置き換えればよい。
(処理例)
次に、従来法と第3の実施の形態による処理例について説明する。図39は、この例で用いるε除去前のFSTを示す図である。太線の円が初期状態であり、スラッシュの左側が状態番号であり右側が初期出力記号である。ここでは状態1と2が初期状態であり、それぞれ初期出力記号がAとεである。2重線の円が終了状態であり、スラッシュの左側が状態番号であり右側が終了出力記号である。ここでは状態6と7が終了状態であり、それぞれ終了出力記号がBとεである。各遷移の近傍に書かれている文字のうち、コロンの左側が割り当てられている入力記号であり、右側が割り当てられている出力記号である。
図40は、従来法によってε除去を行った結果を示す図である。図41は、遷移の向きを反転させた後に従来法によってε除去を行った結果を示す図である。すなわち、図41は、遷移の向きを反転させ、出力記号も反転させ、初期状態と終了状態を入れ替えてから従来によるε除去を行い、遷移の向きを元の向きに戻し、初期状態と終了状態を再度入れ替えた場合のFSTを表す。
図42は、第3の実施の形態によるε除去処理の結果を示す図である。この例では遷移の本数は従来法の結果を表す図40と同じであるが、出力記号の割り当て方が異なっていることが分かる。
(重み付き有限状態トランスデューサの場合)
重み付き有限状態トランスデューサの場合は、重みの移動と出力記号列の移動の両方を順に行った後、重みと出力記号の組を重みとみなして第2の実施の形態に記載のε除去処理を実行すればよい。
このように、第3の実施の形態にかかる情報処理装置では、FSTおよびWFSTなどのように、入力記号以外の情報が遷移に割り当てられている場合であっても、遷移の方向に依存せずにε遷移の除去を行うことができる。さらに、遷移の数を従来の方法と同じかそれより少なくすることができる。
なお、本発明は、上記実施の形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化することができる。また、上記実施の形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素からいくつかの構成要素を削除してもよい。さらに、異なる実施の形態にわたる構成要素を適宜組み合わせても良い。