部分集合構成法のソースを表示
←
部分集合構成法
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''部分集合構成法'''(ぶぶんしゅうごうこうせいほう、{{lang-en-short |subset construction}})あるいは'''冪集合構成法'''(べきしゅうごうこうせいほう、{{lang-en-short |powerset construction}})とは、[[計算理論]]において[[非決定性有限オートマトン]](NFA)を等価な[[決定性有限オートマトン]](DFA)へと変換するための標準的な手法である。本手法はDFAとNFAが同じ能力であることを示すことから理論上重要であるとされる。また実用の面においても、本手法を用いることにより、柔軟に構築できるNFAを実行効率で勝るDFAに変換できるため、極めて有用である。一方、本手法により生成されるDFAの状態数は、変換前のNFAの状態から指数関数的に増大する可能性があり、このため巨大なNFAから生成されるDFAは全く実用的でない場合がある。 オートマトンにおける他の類似の構成法との区別のため、NFAをDFAに変換するこの手法は'''ラビン-スコット冪集合構成法'''(あるいは部分集合構成法)と呼ばれることがある。これは本手法を1959年に初めて提案した[[マイケル・ラビン]]と[[デイナ・スコット]]にちなむ<ref>{{cite journal |last1=Rabin |first1=M. O. |authorlink1=マイケル・ラビン |last2=Scott |first2=D. |authorlink2=デイナ・スコット |date=1959 |title=Finite automata and their decision problems |journal=IBM Journal of Research and Development |issn=0018-8646 |doi=10.1147/rd.32.0114 |volume=3 |issue=2 |pages=114–125 |lang=en}}</ref>。 == 概要 == DFAの実行をシミュレートする場合、たった1つの状態を追い続けることになる。つまり、初期状態から始め、入力を1文字読むたびに遷移規則によりただ一つに定まる新しい状態へと注目を移す。一方、NFAの実行のシミュレーションでは追うべき状態が複数になりうる。すなわち、ある文字を読み遷移した後の状態全てを把握しなければならない。ここで、NFAにおける状態の集合をDFAにおける1つの状態であると考えると、NFAのシミュレーションはDFAのシミュレーションであると捉えられるようになる{{Sfn |Sipser |2008 |pp=63-64}}。 == 構成法 == まず単純な場合として、文字を読み取らずとも遷移すること(いわゆるε-遷移)を許さないNFAを考える。このようなNFAを5つ組 <math>(Q, \Sigma, \delta, q_0, A)</math> を以って定める。このNFAを部分集合構成法を用いて変換するとDFA <math>(\mathcal{P}(Q), \Sigma, \delta', \{q_0\}, F')</math> が得られる。ただし、 * <math>\delta'(R, a) = \bigcup_{r \in R} \delta(r, a)</math> * <math>F' = \{R \in \mathcal{P}(Q) | R \cap F \neq \emptyset\}</math> である{{Efn2 |ここで用いた5つ組の定義は[[非決定性有限オートマトン#形式的定義]]および[[決定性有限オートマトン#形式的定義]]をそれぞれ参照せよ。}}{{Sfn |Sipser |2008 |pp=64-65}}{{Sfn |Hopcroft |Motwani |Ullman |2006 |pp=60-61}}。 上述の方法は最も単純な方法であるが、初期状態から到達できない状態が大量に生成される可能性がある。これを避けるためには、初期状態から任意の文字列を与えて遷移を行うことを繰り返し、実際に到達できた状態集合だけを変換後の状態とする必要がある<ref>{{Cite book |和書 |title=最新コンパイラ構成技法 |first=Andrew W. |last=Appel |others=神林靖・滝本宗宏 訳 |date=2009-10-29 |origyear=1999 |publisher=翔泳社 |isbn=9784798114682 |pages=24-25 |ref={{SfnRef |Appel |2009}}}}</ref><ref name="schneider">{{cite book |last=Schneider |first=Klaus |date=2004 |title=Verification of reactive systems: formal methods and algorithms |publisher=Springer |isbn=978-3-540-00296-3 |pages=210–212 |url=https://books.google.com/books?id=Z92bL1VrD_sC&pg=PA210}}</ref>。 === ε-遷移を伴うNFAの場合 === ε-遷移を許すNFAに対しては、ある状態に対してそこからε-遷移のみで到達可能な状態の集合(ε-閉包)を考える必要がある。ε-遷移を伴うNFAについて、van Noordは3つの対処法が考えられるとした<ref name="vannoord">{{cite journal |last=Van Noord |first=Gertjan |title=Treatment of epsilon moves in subset construction |journal=Computational Linguistics |volume=26 |issue=1 |year=2000 |pages=61–76 |url=http://www.mitpressjournals.org/doi/pdfplus/10.1162/089120100561638 |doi=10.1162/089120100561638|arxiv=cmp-lg/9804003 |s2cid=5622079 }}</ref>。 * 変換前のNFAの状態それぞれのε-閉包を考慮し、ε-遷移を伴わないNFAを生成してから部分集合構成法を適用する方法。3つの中で最も実装が簡単であるが、[[自然言語処理]]の際によく生じるような、ε-遷移を多く含むNFAに対しては実用的ではないことがある。 * 部分集合構成法の計算中において、変換前のNFAの各状態ごとにε-閉包を計算する方法。状態が現れるたびにε-閉包を計算しても良いし、最初に到達した時点の計算結果をキャッシュとして保持しておいても良い。 * 部分集合構成法の計算中において、変換後のDFAの各状態ごと、すなわち変換前のNFAの状態の集合ごとにε-閉包を計算する方法。 === 初期状態が複数存在するNFAの場合 === 初期状態が複数存在するNFA<ref>{{cite book |title=Complexity Theory and Cryptology: An Introduction to Cryptocomplexity|series=Texts in Theoretical Computer Science |first=Jörg |last=Rothe |publisher=Springer |year=2006 |isbn=9783540285205 |pages=21–22 |url=https://books.google.com/books?id=YnLmsHAtvYEC&pg=PA21}}</ref>に対しては以下の2つの対処が考えられる。 * 初期状態全てからなる集合を考え、これに対応するDFAでの状態を初期状態とする。 * 変換しようとするNFAがε-遷移を許すならば、新たに状態を1つ加えてこれを初期状態とし、元の初期状態それぞれへε-遷移できるように遷移規則を書き換える。 === NFAの認識する言語 === 上で示したアルゴリズムにより任意のNFAに対し等価なDFAを構成できることが分かった。一方で任意のDFAに対してもそれと等価なNFAを構築することができる。すなわち、DFA <math>(Q, \Sigma, \delta, q_0, F)</math> に対しては、<math>\delta'(q, a) = \{\delta(q, a)\}</math> を用いたNFA <math>(Q, \Sigma, \delta', q_0, F)</math> を考えれば良い{{Sfn |Hopcroft |Motwani |Ullman |2006 |pp=64}}。これにより、ある言語が正規であることと、あるNFAによって認識されることが同値であることが示される{{Sfn |Sipser |2008 |p=65-66}}。 == 例 == 下の[[状態遷移図]]で示されるNFAを例に取る。このNFAは4つの状態からなり、状態 <math>1</math> が初期状態、状態 <math>3</math>、<math>4</math> が受理状態であり、遷移規則にはε-遷移を含む。またアルファベットは <math>\{0, 1\}</math> である。 [[File:NFA-powerset-construction-example.svg|frameless|center|upright=1.5]] 変換後のDFAにおける初期状態は、NFAの初期状態である状態 <math>1</math> のε-閉包を考えれば良く、今回の例では <math>\{1, 2, 3\}</math> である。次に状態 <math>\{1, 2, 3\}</math> において入力 <math>0</math> が与えられた際の遷移について、状態 <math>1</math> から状態 <math>2</math> への遷移と状態 <math>2</math> から状態 <math>4</math> への遷移が考えられる。ここで状態 <math>2</math> 及び <math> 4 </math> はいずれもε-遷移を持たないから、<math>\delta'(\{1, 2, 3\}, 0) = \{2, 4\}</math> であることが分かる。以降このようにして、変換後の遷移規則の検討を新しい状態の集合が発生するたびに行う。すると下に示されるようなDFAが得られる。 [[File:DFA-powerset-construction-example.svg|frameless|center|upright=1.5]] 今回の例では、変換前のNFAは4状態からなるため状態の冪集合の大きさは16であるが、実際に到達可能な状態の集合はたったの5つである。 == 計算量 == [[File:NFA_and_blown-up_equivalent_DFA_01.svg|thumb|upright=1.8|5状態からなるNFA(左)と16状態からなるDFA(右)はいずれも同じ言語を認識する<ref name="schneider"/>]] 変換後のDFAの状態数は変換前のNFAに依存する。NFAの状態数が <math>n</math> であるとき、DFAの状態数は最大で <math>2^n</math> となりうる{{Sfn |Appel |2009 |p=24}}。特に、任意の[[自然数]] <math>n</math> に対して、<math>n</math> 個の状態からなるNFAであって、変換後のDFAの状態数が <math>2^n</math> である、すなわち初期状態から任意の状態の部分集合に到達可能であるものが存在することが知られており、故に[[計算量|最悪計算量]]が <math>\Theta (2^n)</math> となることが示されている<ref>{{Cite conference |title=Economy of description by automata, grammars, and formal systems |first1=A. R. |last1=Meyer |first2=M.J. |last2=Fischer |publisher=IEEE |book-title=Proceedings of SWAT 1971 |pages=188-191 |year=1971 |doi=10.1109/SWAT.1971.11}}</ref>。変換後のDFAの状態数が非常に大きくなる例として、<math>\{0, 1\}</math> をアルファベットとし、最後から <math>n</math> 番目の要素が <math>1</math> であるような文字列を受理するオートマトンを考える。これをNFAで構築した場合状態数は <math>n+1</math> となるが、DFAでは <math>2^n</math> 個の状態を要する{{Sfn|Hopcroft|Motwani|Ullman|2006|pp=64-65}}<ref name="schneider"/>。図は <math>n=4</math> におけるNFAとDFAの状態遷移図である。 == 応用 == DFA最小化に関するBrzozowskiのアルゴリズムは内部で部分集合構成法を用いる。具体的には、まず与えられたDFAの遷移規則全てを逆向きにし、また初期状態と受理状態を入れ替えることにより、元のDFAが受理する全ての文字列の逆順{{Efn2 |文字列 <math>w = w_1 w_2 \cdots w_n</math> に対し、<math>w_n \cdots w_2 w_1</math> を <math>w</math> の逆順と呼ぶ。}}をちょうど受理するNFAを得る。次にこのNFAに対して部分集合構成法を適用して等価なDFAへと変換する。この手続きをもう一度繰り返すことにより、元のDFAと等価でかつ状態数最小のDFAが得られる。このアルゴリズムは前述の通り部分集合構成法を用いるため、その最悪計算量は指数オーダーとなる<ref>{{cite conference |last=Brzozowski |first=J. A. |contribution=Canonical regular expressions and minimal state graphs for definite events |mr=0175719 |pages=529–561 |publisher=Polytechnic Press of Polytechnic Inst. of Brooklyn |location=Brooklyn, N.Y. |title=Proc. Sympos. Math. Theory of Automata (New York, 1962) |year=1963}}</ref>。 == 脚注 == {{脚注ヘルプ}} === 注釈 === {{Notelist2}} === 出典 === {{Reflist|2}} == 参考文献 == * {{Cite book |和書 |title=計算理論の基礎 [原著第2版] 1.オートマトンと言語 |first=Michael |last=Sipser |others=太田和夫・田中圭介 監訳 阿部正幸・ 植田広樹・藤岡淳・渡辺治 訳 |isbn=9784320122079 |date=2008-05-25 |origyear=2006 |publisher=共立出版 |ref={{SfnRef |Sipser |2008}}}} * {{cite book |last1=Hopcroft |first1=John E. |authorlink1=ジョン・ホップクロフト |first2=Rajeev |last2=Motwani |last3=Ullman |first3=Jeffrey D. |authorlink3=ジェフリー・ウルマン |date=2006 |title=Introduction to Automata Theory, Languages, and Computation 3rd Edition |publisher=Addison-Wesley |location=Reading Massachusetts |lang=en |isbn=0-321-45536-3 |ref={{SfnRef |Hopcroft |Motwani |Ullman |2006}}}} == 関連項目 == * [[有限オートマトン]] * [[組合せ爆発]] {{DEFAULTSORT:ふふんしゆうこうこうせいほう}} [[Category:離散数学の定理]] [[Category:形式言語]] [[Category:構文解析 (プログラミング)]] [[Category:有限オートマトン]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Cite conference
(
ソースを閲覧
)
テンプレート:Cite journal
(
ソースを閲覧
)
テンプレート:Efn2
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Notelist2
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:Sfn
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
部分集合構成法
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報