有限オートマトン

**有限オートマトン**（ゆうげんオートマトン、）または**有限状態機械**（）とは、有限個の状態と遷移規則からなる状態機械。

チューリングマシンとは異なり計算状態を記憶するテープを持たず、チューリング完全ではないが、様々な応用がある。

## 概念と用語
状態（）は、システムの振る舞いのノードであり、システム内で遷移（）を実行するトリガーを待っている。一般に状態は、同じトリガーに対してシステムの反応が常に同じではない場合に導入される。例えば、カーラジオのシステムでは、特定のラジオ局の放送を聴いている状態で「次へ」というトリガーは次のラジオ局（の放送受信）への移行を意味する。しかし、CDプレーヤーのシステムでは、「次へ」は次のトラックへの移行を意味する。これらは、同じトリガーであっても現在状態によって異なる動作を引き起こす。一部の有限オートマトンの表現では、次のように動作（）と状態を対応付けることもある。
* 開始（）動作: その状態に入るときに行う動作
* 終了（）動作: その状態から出るときに行う動作
遷移（）は、条件が満たされたときまたはイベントを受信したときに実行される動作の集合である。

## 表現

### 状態遷移図

有限オートマトンについてその振る舞いを直接的に、状態をノード（節）とし遷移をエッジ（辺あるいは矢印）とした、ネットワーク構造（グラフ理論・グラフ (データ構造) ）の図にしたものが状態遷移図である。

### 状態遷移表
有限オートマトンについて、その遷移規則（関数）を表にしたものが状態遷移表である。現在の状態（例えばB）と入力（例えばY）の交差するところに次の状態（例えばC）を示す。以下にごく単純な一例を示す。

### UMLステートマシン
統一モデリング言語(UML)には状態機械（ステートマシン）を記述するための豊富な意味論と記法がある。UMLの状態遷移図は従来の有限オートマトンの主な利点を踏襲しつつ、その欠点を克服している。大きな拡張としては、状態の階層化や直交状態の導入があり、動作の記法も拡張されている。ミーリ・マシンもムーア・マシンも記述できる。ミーリ・マシンのように状態だけでなく、イベント（入力）をきっかけとして遷移するようにも書けるし、ムーア・マシンのように遷移ではなく状態と開始動作や終了動作を対応付けることもできる。

### SDLステートマシン
仕様及び記述言語(SDL) はITUの標準規格であり、遷移の際の以下のような動作を表す記号を定義している。

* イベント送信
* イベント受信
* タイマ開始
* タイマキャンセル
* 別の並行動作するステートマシンを開始
* 判断

SDLには、Abstract Data Types と呼ばれる基本データ型、動作言語、有限状態機械を実行可能にするための実行意味論を埋め込む。

### 他の状態図
有限オートマトンには他にも様々な表現方法があり、例えば図3もその一種である。

## 用途
ここで示しているような反応性システムの設計だけでなく、有限オートマトンは電気工学、言語学、計算機科学、哲学、生物学、数学、論理学など様々な領域で利用される。有限オートマトンはオートマトン理論や計算理論で研究される一種のオートマトンである。情報工学や計算機科学では、アプリケーションの動作のモデリング、デジタルシステムのハードウェア設計、ソフトウェア工学、コンパイラ設計、通信プロトコルの設計、計算と言語に関する研究などで幅広く活用されている。

## 分類

有限オートマトンは二種類に分類される。アクセプタ / リコグナイザとトランスデューサである。

### アクセプタ / リコグナイザ
このタイプの有限オートマトンは入力を受容（accept）したり、理解（recognize）して、外界に結果を知らせるために状態（state）を使用する。つまり、最終的に受容状態になったかどうかで「はい」または「いいえ」のいずれかを出力として返す。FSMの全状態は受容状態かそうでないかのいずれかである。全入力を処理したとき状態が受容状態なら、その入力は受容されたことになり、さもなくば拒絶 / 却下されたことになる。基本的に入力は記号（または文字）であり、動作（action）は使用されない。図4 に示した例は "nice" という単語を受容する有限オートマトンを示している。この場合、6番だけが受容状態である。

この機械は言語を定義するものとして説明することもできる。その言語とは、その機械が受容する全ての単語から構成され、それ以外の単語を全く含まないもので、そのような言語をその機械が「受容 / 受理」すると称する。定義から、FSM が受理する言語は正規言語であり、逆にある言語を受理する FSM が存在する場合、その言語を正規言語と称する。

#### 初期状態 / 開始状態
初期状態は、一般にどこからも矢印で指されていない状態である。

#### 受容状態 / 受理状態
受容状態は、その機械が手続きを成功裡に完了させた状態である。通常、二重丸で表現される。

図5の決定性有限オートマトン (DFA) は2進数の入力が偶数個の 0 を含むときに受容することを示している。*S*1 は初期状態でもあり、受容状態でもある。この機械は入力数列に"0"が偶数個含まれるときのみ正しく終了したと判定され、0個も偶数なので"0"が全く含まれない数字列も受容される。このDFAが受容する文字列の例としては、ε（空文字列）、1、11、00、010、1010、10110、などなどがある。

### トランスデューサ

トランスデューサ（変換機、transducer）は、与えられた入力と動作を伴う状態（両方または一方）に基づいて出力を生成する。このタイプの有限オートマトンは計算言語学の分野や制御などに使われる。また、トランスデューサは二種類に分類される。

; ムーア・マシン
: この有限オートマトンは開始動作のみを使用する。すなわち、出力は状態にのみ依存する。ムーア・モデルの利点はふるまいを単純化できることである。図6の例はエレベーターの扉についてのムーア・マシンを示している。この有限オートマトンは「開放命令」と「閉鎖命令」というふたつの命令を理解し、それによって状態が変化する。「開放途中」状態にある開始動作（E:）は扉の開くところを監視し始めることを示し、「閉鎖途中」状態にある開始動作（E:）は扉の閉じるところを監視し始めることを意味する。「開放」と「閉鎖」状態は動作を伴わないが、これらは外界（つまり他のオートマトン）に扉が開いているとか閉まっているといった状況を知らせる意味を持つ。
; ミーリ・マシン
: この有限オートマトンは入力動作のみを使用する。すなわち、出力は入力と状態に依存する。ミーリ・モデルは状態の数を減らす作用がある。図7の例はムーア・マシンの例と同じものをミーリ・マシンで実装したものを示している（実装された有限オートマトンのふるまいは実行モデルに依存する。例えばでは動作するが、では動作しない）。これは二つの入力動作を持つ。「閉鎖命令が来たら扉を閉めるためにモーターを起動する」という入力動作と「開放命令が来たら扉を開けるためにモーターを起動する」という入力動作である。

実際には、これらを混合したモデルがよく使用される。

ムーア・モデルとミーリ・モデルの違いの詳細は、実施例も含めて外部サイトの"Moore or Mealy model?"にある（ただし英語）。

### 決定性
さらなる分類方法として、**[[決定性有限オートマトン]]** (DFA) と**[[非決定性有限オートマトン]]** (NFA, GNFA) がある。決定性有限オートマトンでは、各状態の考えられる全ての入力について一意に次の状態が決定される。非決定性有限オートマトンでは、ある状態にある入力があったとき遷移がどうなるかが決定されない（遷移がないかもしれないし、複数の遷移が対応しているかもしれない）。このような区別は実行時間などの観点では重要だが、ふるまいに関する観点ではそれほど重要ではない。それぞれのオートマトンで表現可能なふるまいは同じであり、任意のNFAを等価な（しかしより大きな）DFAに変換するアルゴリズムが存在する（）。

ひとつしか状態を持たない有限オートマトンは結合有限オートマトンと呼ばれ、入力動作のみを持つ。これは複数の有限オートマトンが協調動作する場合に便利であり、結合有限オートマトンとして表せる部分を抽出して設計に活用する。

## 数学モデル
タイプによって、いくつかの定義が存在する。
**アクセプタ**有限オートマトンは &lang;*&Sigma;*, *S*, *s<sub>0</sub>*, *&delta;*, *F*&rang; の5要素から構成される。
* *&Sigma;* は入力文字セット（有限だが空ではないシンボルの集合）
* *S* は有限であって空でない状態の集合
* *s<sub>0</sub>* は *S* の要素でもある初期状態
* *&delta;* は状態遷移関数: *&delta;*: *S* &times; *&Sigma;* &rarr; *S* （非決定性有限オートマトンの場合、 *&delta;* は状態の集合を返すので \delta: S \times \Sigma \rightarrow \mathcal{P}(S) となる）
* *F* は終了状態の集合であり、 *S* の部分集合（空もありうる）

決定性FSMでも非決定性FSMでも \delta は部分関数でもよく、 \delta(q, x) としたとき、q \isin S と x \isin \Sigma のあらゆる組合せについて定義する必要はない。有限オートマトン M が q という状態で次の入力記号が x のとき、\delta(q, x) が未定義なら M はエラーを返す（すなわち、入力は拒絶・却下される）。これは汎用の状態機械の定義では便利だが、状態機械を変換するのにはあまり便利ではない。デフォルトの形式では全体関数であることを要求するアルゴリズムも存在する。

有限状態機械は制限されたチューリングマシンと見ることもでき、ヘッドが読み取り動作しかできず、常に左から右へと読み取っていくチューリングマシンと言える。

**トランスデューサ**有限オートマトンは &lang;*&Sigma;*, *&Gamma;*, *S*, *s<sub>0</sub>*, *&delta;*, *&omega;*&rang; の6要素から構成される。
* *&Sigma;* は入力文字セット（有限だが空ではないシンボルの集合）
* *&Gamma;* は出力文字セット（有限だが空ではないシンボルの集合）
* *S* は有限であって空でない状態の集合
* *s<sub>0</sub>* は *S* の要素でもある初期状態（非決定性有限オートマトンの場合は初期状態の集合）
* *&delta;* は状態遷移関数: *&delta;*: *S* &times; *&Sigma;* &rarr; *S*
* *&omega;* は出力関数

出力関数が状態と入力文字の関数 (*&omega;*: *S* &times; *&Sigma;* &rarr; *&Gamma;* ) ならば、その定義は**ミーリ・モデル**であり、ミーリ・マシンとしてモデル化できる。出力関数が状態のみに依存する (*&omega;*: *S* &rarr; *&Gamma;* ) ならば、その定義は**ムーア・モデル**であり、ムーア・マシンとしてモデル化できる。出力機能のない有限オートマトンは状態遷移系などと呼ばれる。

ムーア・マシンの最初の出力シンボル \omega (s_0) を無視すれば、ミーリ・マシンで遷移ごとに遷移先のムーア・マシンの状態の出力シンボルを出力するよう出力関数を設定すれば、ミーリ・マシンに容易に変換できる。ミーリ・マシンの状態はそこに遷移してくる矢印ごとに異なる出力ラベルが設定されているため、逆の変換はそれほど単純ではない。その場合は、出力シンボルごとに状態を設定してやる必要がある。

## 最適化
有限オートマトンの最適化とは、同じ機能を実現するのに必要とされる状態の数をいかに減らすかを意味する。既知の最速のアルゴリズムとして Hopcroft minimization algorithm がある。他にも Implication table や Moore reduction procedure といった手法が使われる。また、非環状FSAは線型時間で最小化できる。

## 実装
### ハードウェアへの適用例

デジタル回路では、プログラマブルロジックデバイス、プログラマブルロジックコントローラ、論理ゲート、フリップフロップ、リレーなどを使って有限オートマトンが構成される。もっと具体的に言えば、状態を格納するレジスタを持ち、状態遷移を決定する論理回路と出力を決定する論理回路を持つハードウェアが有限オートマトンであると言える。初期のハードウェア実装として Richards controller がある。

フリップフロップと出力の間には伝播遅延が存在するため、ミーリ・マシンやムーア・マシンからは非同期出力の論理回路が生成される。このため動作周波数が遅くなってしまう。ミーリ・マシンやムーア・マシンはフリップフロップから直接出力する形に変換でき、そうすることで動作周波数を高めることができる。このように変換した有限状態機械を Medvedev FSM と呼ぶことがある。その最も単純な例としてカウンタ回路がある。

### ソフトウェアへの適用例
有限オートマトンを使ったソフトウェアアプリケーションを作るのに以下のコンセプトが一般に使われる。
* 
* 
* Automata-based programming

## 脚注

### 注釈

### 出典

## 参考文献
### 一般
* Wagner, F., "Modeling Software with Finite State Machines: A Practical Approach", Auerbach Publications, 2006, ISBN 0-8493-8086-3.
* ITU-T, ''Recommendation Z.100 Specification and Description Language (SDL)''
* Samek, M., ''Practical Statecharts in C/C++'', CMP Books, 2002, ISBN 1-57820-110-1.
* Samek, M., ''Practical UML Statecharts in C/C++, 2nd Edition'', Newnes, 2008, ISBN 0-7506-8706-1.
* Gardner, T., ''Advanced State Management'', 2007
* Cassandras, C., Lafortune, S., "Introduction to Discrete Event Systems". Kluwer, 1999, ISBN 0-7923-8609-4.
* Timothy Kam, *Synthesis of Finite State Machines: Functional Optimization*. Kluwer Academic Publishers, Boston 1997, ISBN 0-7923-9842-4
* Tiziano Villa, *Synthesis of Finite State Machines: Logic Optimization*. Kluwer Academic Publishers, Boston 1997, ISBN 0-7923-9892-0
* Carroll, J., Long, D. , *Theory of Finite Automata with an Introduction to Formal Languages*. Prentice Hall, Englewood Cliffs, 1989.
* Kohavi, Z., *Switching and Finite Automata Theory*. McGraw-Hill, 1978.
* Gill, A., *Introduction to the Theory of Finite-state Machines*. McGraw-Hill, 1962.
* Ginsburg, S., *An Introduction to Mathematical Machine Theory*. Addison-Wesley, 1962.

### 理論計算機科学
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* Yuri Gurevich (2000), *Sequential Abstract State Machines Capture Sequential Algorithms*, ACM Transactions on Computational Logic, vl. 1, no. 1 (July 2000), pages 77-111. http://research.microsoft.com/~gurevich/Opera/141.pdf

### 機械学習
* 

### 回路合成などハードウェアへの応用
* 
* 
* 
* 

### 有限マルコフ連鎖プロセス
* 
* 

## 関連項目
* 正規言語 - 有限オートマトンによって表現できる言語のクラス
* 状態遷移系
* オートマトン
** プッシュダウン・オートマトン
** 線形拘束オートマトン
** チューリングマシン
* ペトリネット
* シミュレーション
* マービン・ミンスキー
* 状態遷移図
* 隠れマルコフモデル
* 制御システム
* OpenGL
* 人工知能

## 外部リンク

* Description from the Free On-Line Dictionary of Computing
* NIST Dictionary of Algorithms and Data Structures entry
* Hierarchical State Machines
* Round-trip Engineering State Machines
* SourceForge 状態機械に関するオープンソースのプロジェクト一覧
* A registry of finite-state technology at the IT Center for Science, Finland.