技能一覧 › 大学数学 オートマトン・形式言語

言語の条件から DFA を作る(余り・接尾辞・積構成)

「2 進数の値が の倍数」( による余りの遷移)、「 の個数が の倍数」、「 で終わる」などの条件を記憶する状態を決めて DFA を作り、2 つの条件の積(状態の組)として共通部分を受理する DFA の状態数を求められる

前提

この技能までの道筋(19 技能)
算数中学高校大学大学院

読み込み中…

右端(太枠)がこの技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。

一覧で見る(前提が先)
  1. 決定性有限オートマトンの動作と受理判定 (大学数学 オートマトン・形式言語)
  2. 分数のたし算・ひき算 (算数 計算と数のきまり)
  3. 小数の四則計算 (算数 計算と数のきまり)
  4. 正負の数の加法・減法 (中学数学 数と式)
  5. 分数のかけ算・わり算 (算数 計算と数のきまり)
  6. 四則の混じった計算の順序 (算数 計算と数のきまり)
  7. 正負の数の乗除・累乗と四則混合 (中学数学 数と式)
  8. 分配法則を使った計算のくふう (算数 計算と数のきまり)
  9. 文字式の計算(同類項・分配法則) (中学数学 数と式)
  10. 乗法公式による展開 (中学数学 数と式)
  11. 因数分解 (中学数学 数と式)
  12. 約数の見つけ方 (算数 整数の性質)
  13. 文字式で表した整数の性質 (中学数学 数と式)
  14. 余りによる整数の分類 (数学A 整数の性質)
  15. 樹形図で数え上げる (算数 場合の数)
  16. 積の法則と和の法則 (算数 場合の数)
  17. 和の法則・積の法則と樹形図 (数学A 場合の数と確率)
  18. 合同式 (数学A 整数の性質)
  19. n 進法 (数学A 整数の性質)

説明

「2 進数として読んだ値が の倍数」「 の個数が の倍数」「 で終わる」のような言語の条件について、その条件を満たす文字列だけを受理する DFA を自分で設計できるようになります。そのために、文字列を左から読むあいだ「何を覚えておけば判定に足りるか」を決め、それをそのまま状態にします。さらに、2 つの条件を同時に満たす文字列(共通部分)を受理する DFA は、2 つの DFA の状態の組を状態とする「積構成」で作れます。このとき積 DFA の状態数も求められます。

なぜそうしてよいのか

DFA は読み終えた部分の情報を有限個の状態でしか覚えられません。ですから、まず「それまでに読んだ部分 について、どの有限個の情報を覚えておけば、次の 1 文字 を読んだあとの情報も計算でき、最後に条件の判定もできるか」を考えます。2 進数の場合は です。合同式の性質から、 ならば となります。つまり そのものは覚えなくてよく、余り だけで次の余りが決まります。これで 個の状態で足ります。「 の個数が の倍数」なら、個数を で割った余りを覚え、 を読むたびに 増やせば()十分です。

「 で終わる」のような接尾辞の条件では、「今の末尾が、パターンの先頭から何文字と一致しているか(一致する最長の長さ)」を覚えます。パターンの長さを とすると、この長さは から の 通りです。次の 1 文字を足したあとの末尾も、この長さと新しい文字だけで決まります。長さ のとき、ちょうどパターンで終わっています。

積構成では、2 つの DFA と を同じ入力で同時に動かします。状態を組 にとり、 と定めます。すると、文字列を読み終えた状態は になり、各成分はそれぞれの DFA を単独で動かした結果と一致します。したがって受理状態を (両成分とも受理状態である組)にすれば、両方の条件を満たす だけが受理されます。状態の組の数は積の法則により です。

手順

  1. 各条件について、読んだ部分の何を覚えれば判定できるかを決め、それを状態にする(2 進数の値の による余り 、文字の個数の余り、パターンの先頭と末尾が一致する最長の長さ など)。

  2. 初期状態を、空文字列に対応する情報にする(余り 、個数 、一致長 )。

  3. 1 文字 を読んだときの情報の更新を遷移にする。2 進数なら 、個数なら該当文字のとき 、接尾辞なら「新しい末尾がパターンの先頭と一致する最長の長さ」へ移す。

  4. 条件を満たす情報を表す状態を受理状態にする(余り 、一致長 = パターンの長さ など)。

  5. 共通部分を受理させるには積構成を使う。状態は 、遷移は 、初期状態は 、受理状態は とする。状態数は 、受理状態の数は になる。

例題

アルファベット 上の文字列 を 2 進数として読んだ値を とする(空文字列の値は とし、先頭の も許す)。言語 を受理する DFA を、次の手順で作る。条件 1 には余り を記憶する 3 状態の DFA を使う。条件 2 には「末尾が の先頭何文字と一致しているか( 文字)」を記憶する 3 状態の DFA を使う。この 2 つから積構成で DFA を作るとき、その状態数と受理状態の個数を順に求めよ。

例題の解答

【手順 1〜4: を作る】状態は余り で、初期状態は 、受理状態は です。遷移は です。

状態入力 0入力 1
0(初期・受理)01
120
212

【手順 1〜4: を作る】状態は一致長 で、初期状態は 、受理状態は です。状態 で を読むと末尾が「0」となり、 の先頭 1 文字と一致するので に移ります。 を読むと一致しないので のままです。状態 で を読むと末尾は「…00」で、最後の「0」が先頭と一致するので のままです。 を読むと「01」が完成して に移ります。状態 で を読むと末尾「…010」の最後の「0」が一致して に、 を読むと「…011」で一致がなくなり に移ります。

状態入力 0入力 1
0(初期)10
112
2(受理)10

【手順 5:積構成】状態は組 で、、 です。遷移は 、初期状態は です。受理状態は です。したがって状態数は 、受理状態の個数は です。(実際に初期状態からたどると、9 個の組はすべて到達可能です。)

【確認】 では で、 は で終わるので です。積 DFA でたどると となり、最後の状態は受理状態です。

答え:状態数 、受理状態の個数 。

答え:

よくある誤り

この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。

入口の問題

この技能を使う問題

この技能の次に学べること