3.6. オートマトン

1. はじめに

 オートマトンは、計算理論や形式言語理論の基本的な概念であり、コンピュータサイエンスにおける重要な役割を果たします。形式言語理論はプログラミング言語設計やコンパイラ開発の基礎となるだけでなく、計算の本質的な限界を理解する上でも重要です。本記事では、有限オートマトンの概念、形式言語との関係、チューリング機械との関係について詳しく解説します。

2. 形式言語の階層(チョムスキー階層)

形式言語は、厳密な規則に従って構成される言語です。チョムスキー階層という概念で分類されており、上に行くほど表現力が高くなります:

  1. 正規言語(Type 3): 最も制約が多い
  2. 文脈自由言語(Type 2)
  3. 文脈依存言語(Type 1)
  4. 帰納的可算言語(Type 0): 最も表現力が高い

3. 正規言語とオートマトン

3.1. 正規言語(Regular Language)

最も単純な形式言語で、正規表現で表現できます。例えば「aやbが任意の回数続く文字列」など。

3.2. 有限オートマトン(Finite Automaton/FA)

 有限オートマトンは、有限個の状態を持ち、それぞれの状態間で遷移が定義された数学的モデルです。このモデルは、入力を受け取って、その入力に基づいて状態を遷移させることで、最終的な状態に到達します。有限オートマトンは、受理できる入力文字列を形式言語(正規言語)として定義し、その形式言語に属する文字列を認識することが可能です。

 正規言語を認識するための計算モデルと言えます。

  • 状態の集合を持ちます
  • 入力記号によって状態間を移動します
  • 初期状態から始まり、受理状態で終わると入力文字列を受理します

 正規言語とFAは等価です。つまり、ある言語が正規言語であるとき、それを認識するFAが必ず存在します。

3.3. 状態遷移図と状態遷移表

 状態遷移図は、オートマトンの各状態とその遷移を視覚的に表現した図です。各状態はノードとして表され、遷移は矢印で示されます。これにより、どの入力でどの状態に遷移するのかが一目で分かります。一方、状態遷移表は、各状態と入力文字に対してどの状態に遷移するかを表形式で示します。これにより、オートマトンの挙動を体系的に理解することができます。

図1:状態遷移図の例

状態 入力 0 入力 1
S0 S2 S1
S1 S1 S3
S2 S2 S0
S3 (受理状態) S3 S3

表1:状態遷移表の例

4. 文脈自由言語とプッシュダウンオートマトン

4.1. 文脈自由言語(Context-Free Language)

正規言語より表現力が高く、プログラミング言語の構文などを表現できます。例:「対応する括弧」など。

4.2. プッシュダウンオートマトン(Pushdown Automaton/PDA)

FAにスタック(後入れ先出しのメモリ)を追加したものです。

  • 基本的な状態遷移の仕組みはFAと同じ
  • スタックにデータを保存・取り出しできる
  • このスタックがあるため「カウント」や「対応関係」を記憶できる

例:「a^n b^n」(aがn回、bがn回出現する文字列)を認識できます。これは正規言語では表現できません。

プッシュダウンオートマトンと文脈自由言語は等価です。

5. チューリングマシン

5.1. チューリングマシン(Turing Machine/TM)

最も強力な計算モデルです。

  • 無限長のテープ(両方向に伸びる)
  • テープ上の読み書きヘッド
  • 状態遷移規則の集合

動作:

  1. 現在の状態とヘッドの位置のシンボルを読む
  2. 遷移規則に従って新たなシンボルを書き込む
  3. ヘッドを左右どちらかに動かす
  4. 状態を変える

チューリングマシンは帰納的可算言語(Type 0言語)を認識できます。現代のコンピュータはこのモデルに基づいています。

6. 計算能力の比較

計算能力の順序:

有限オートマトン < プッシュダウンオートマトン < チューリングマシン

言語クラスの包含関係:

正規言語 ⊂ 文脈自由言語 ⊂ 文脈依存言語 ⊂ 帰納的可算言語

5. 例題

例題1: 有限オートマトンの文字列受理

問題:
 次の状態遷移図に基づいて、有限オートマトンが文字列 1011 を受理するかどうかを判定しなさい。

 状態遷移図:

  • 状態 S0: 初期状態。1 を読み込むと S1 に遷移し、0 を読み込むと S2 に遷移する。
  • 状態 S1: 0 を読み込むと S1 に留まり、1 を読み込むと S3 に遷移する。
  • 状態 S2: 1 を読み込むと S0 に戻り、0 を読み込むと S2 に留まる。
  • 状態 S3: 受理状態。どの入力を読み込んでも S3 に留まる。

解答:

  1. 初期状態 S0 にいるとき、最初の 1 を読み込むと S1 に遷移。
  2. S1 にいるとき、次の 0 を読み込むと S1 に留まる。
  3. S1 にいるとき、次の 1 を読み込むと S3 に遷移。
  4. S3 にいるとき、最後の 1 を読み込むと S3 に留まる。

 最終的に状態 S3 に到達し、S3 は受理状態であるため、文字列 1011 はこの有限オートマトンによって受理されます。

解説:
 有限オートマトンが文字列を受理するかどうかは、入力文字列を1文字ずつ順に処理し、状態遷移を追跡していくことで判断します。この場合、最終的に受理状態に到達するため、与えられた文字列は受理されると判断できます。

例題2: プッシュダウンオートマトンによる括弧の対応

問題:
 次のプッシュダウンオートマトンが、文字列 (()) を受理するかどうかを判定しなさい。

 プッシュダウンオートマトンの動作:

  • 初期状態 S0 では、スタックは空である。
  • ( を読み込むと、スタックに ( をプッシュし、状態は S1 に遷移。
  • S1 にいるとき、( を読み込むとスタックに ( をプッシュし、S1 に留まる。
  • S1 にいるとき、) を読み込むとスタックのトップから ( をポップし、スタックが空であれば S0 に戻る。スタックが空でなければ S1 に留まる。
  • すべての入力を処理した後、スタックが空であれば受理状態に遷移。

解答例:

  1. 初期状態 S0 にいるとき、最初の ( を読み込むと S1 に遷移し、スタックに ( がプッシュされる。
  2. S1 にいるとき、次の ( を読み込むとスタックに ( がプッシュされ、S1 に留まる。
  3. S1 にいるとき、次の ) を読み込むとスタックのトップから ( がポップされ、スタックには ( が1つ残る。S1 に留まる。
  4. S1 にいるとき、最後の ) を読み込むとスタックのトップから ( がポップされ、スタックが空になる。S0 に遷移し、スタックが空のため受理状態に遷移。

最終的に、プッシュダウンオートマトンは受理状態に到達し、文字列 (()) は受理されます。

解説:
 プッシュダウンオートマトンは、スタックを使用して括弧の対応をチェックします。この例では、開き括弧を読み込むたびにスタックにプッシュし、閉じ括弧を読み込むたびに対応する開き括弧をポップしていきます。最終的にスタックが空になり、受理状態に到達すれば、文字列は正しい括弧の対応を持ち、受理されます。

6. 応用例

 形式言語理論の各計算モデルは、コンピュータサイエンスの様々な分野で実用的な応用がされています。それぞれの計算モデルの特性を活かした応用例を以下に示します。

6.1. 正規言語・有限オートマトン (FA)

 正規言語と有限オートマトンは、シンプルながらも強力な計算モデルとして、以下のような場面で活用されています:

  • 文字列パターンマッチング: テキスト検索やフィルタリングにおいて、特定のパターンを持つ文字列を効率的に検出します
  • 字句解析(トークン化): コンパイラやインタプリタの最初のステップとして、ソースコードを意味のある単位(トークン)に分割します
  • 正規表現エンジン: プログラミング言語やテキストエディタに組み込まれた正規表現機能は、有限オートマトンに基づいて実装されています
  • テキスト処理: 特定のパターンを含む文字列の検索・置換において、正規表現に対応するオートマトンを生成し、パターンに一致する文字列を効率的に処理します
  • プロトコル検証: 通信プロトコルの状態遷移を検証し、正しい順序でメッセージが送受信されるか確認します
  • ユーザーインターフェース設計: UIの状態遷移を定義し、ユーザー操作に対する適切な応答を保証します

6.2. 文脈自由言語・プッシュダウンオートマトン (PDA)

 文脈自由言語とプッシュダウンオートマトンは、「記憶」する能力があるため、より複雑な構造を扱うことができます:

  • プログラミング言語の構文解析: ソースコードが正しい構文で記述されているかをチェックし、構文木を生成します
  • XML/HTMLの検証: 開始タグと終了タグの対応関係を検証し、正しい入れ子構造になっているかを確認します
  • 括弧の対応チェック: プログラミングにおける括弧やブロックの対応関係を検証します
  • プログラムの構文解析: パーサはスタックを用いて括弧の対応や入れ子構造の解析を行い、エラーが検出された場合には適切なエラーメッセージを出力します
  • 数式評価: 数式の構造を解析し、適切な順序で計算を行います
  • 自然言語処理の一部: 文の構造解析(構文解析)において利用されます

6.3. チューリングマシン

 チューリングマシンは最も強力な計算モデルであり、理論上はあらゆる計算を行うことができます:

  • 実際のコンピュータ(理論上): 現代のコンピュータはチューリングマシンの概念に基づいています
  • あらゆるアルゴリズムの実行: どんな複雑なアルゴリズムも、チューリングマシンで表現可能です
  • 計算可能性の研究: ある問題が計算機で解決可能かどうかを判断する理論的基盤となっています
  • プログラミング言語設計: チューリング完全な言語を設計する際の理論的基礎となっています
  • オペレーティングシステム: リソース管理や並行処理などの複雑な制御を実装する理論的基盤です
  • 人工知能: 複雑な推論や学習アルゴリズムを実装する基盤となっています

6.4. 各計算モデルの実用的価値

 形式言語理論の各計算モデルは、それぞれ異なる複雑さの問題に対して最適な解決策を提供します:

  • 有限オートマトン: シンプルで効率的、メモリ消費が少なく、実装が容易です。パターンマッチングなどの単純な処理に適しています。
  • プッシュダウンオートマトン: 構造化されたデータや階層的な情報を処理する能力があり、構文解析などの複雑な処理に適しています。
  • チューリングマシン: 理論上はあらゆる計算問題を解決できますが、実際の実装では効率性や終了性の問題が生じることがあります。

 適切な計算モデルを選択することで、問題に対して効率的で信頼性の高いソリューションを設計することができます。

7. まとめ

各計算モデルはそれぞれに対応する言語クラスを認識でき、「記憶容量」の違いが計算能力の違いになっています:

  • FA: 記憶能力なし(現在の状態のみ)
  • PDA: 制限付き記憶能力(スタックのみ)
  • TM: 無制限の記憶能力(テープ全体)

計算理論の美しさは、これらの異なるモデルが様々な問題に対して最適な抽象化を提供することにあります。実装する問題に応じて適切なモデルを選ぶことが、効率的なソフトウェア設計への第一歩です。

タイトルとURLをコピーしました