オートマトン・形式言語の問題
アルファベット 上の言語 を次のように定める。 は文字列 の長さを表す。
を受理する DFA を、次の手順で作る。
- :それまでに読んだ文字列 について、 を で割った余り()を状態として記憶する DFA。
- :それまでに読んだ文字列 の末尾が の先頭部分とどこまで一致しているか、を状態として記憶する DFA。状態は、 の末尾と一致する の先頭部分のうち最も長いものが「空文字列」「」「」の 通りに対応する。
- : と の積構成で作った DFA。状態は の状態と の状態の組で、 のすべての状態と のすべての状態の組をすべて状態とする。各文字を読むと、組の両方の成分をそれぞれの DFA の遷移に従って同時に動かす。初期状態は両方の初期状態の組、受理状態は両方の成分が受理状態である組とする。
このとき、DFA の状態の個数を求めよ。
この問題で使うもの
- 言語の条件から DFA を作る(余り・接尾辞・積構成)(説明と入口の問題)
この問題を解けるようになるまで(20 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
技能「言語の条件から DFA を作る(余り・接尾辞・積構成)」を使います。まず 2 つの条件それぞれについて、何を記憶すればよいか(状態)を決めましょう。
ヒント 2
は長さを で割った余り、 は末尾が のどこまでと一致しているかを記憶します。積構成では、状態は の組です。
ヒント 3
の状態は の 個、 の状態は「空文字列」「」「」に対応する 個です。あとは組の個数を積の法則で数えます。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
手順 1:(長さの余り)を作る。
状態を とする。 は「これまでに読んだ文字列の長さを で割った余りが 」を表す。どの文字を読んでも長さは 増えるので、遷移は
となる。初期状態は (空文字列の長さは )、受理状態は である。状態数は 。
手順 2:(接尾辞 )を作る。
状態を とし、 は末尾が の先頭部分と一致していない(一致する最長部分が空文字列)、 は末尾が 、 は末尾が を表す。遷移表は次のとおり。
| 状態 | ||
|---|---|---|
(例: で を読むと末尾が になるので 。 で を読むと末尾は なので 。)初期状態は 、受理状態は である。状態数は 。
手順 3:積構成。
の状態は組 ()である。 の選び方が 通り、 の選び方が 通りなので、積の法則より状態の個数は
である。初期状態は 、受理状態は の つだけである。
(確認) は長さ (余り )で で終わるので に属する。実際に でたどると
となり、受理状態で終わるので受理される。
よって、 の状態の個数は である。
別解
問題文の手順どおり、積構成の状態は の状態と の状態の組をすべて数える。 の状態は余り の 通り。 の状態は「空文字列」「」「」の 通り。
問題文は「すべての状態の組をすべて状態とする」と明記しているので、初期状態から到達できない状態があっても数に含める。したがって状態数は 。
念のため到達可能性を確かめる。初期状態は 。 を読むと 、 を読むと 。 から を読むと 、 を読むと 。 から を読むと 。 から次に読むと余り になり、、、 に到達できる。余り 、 についても同様に、、、 のすべてに到達できる。よって 個すべてが到達可能で、到達可能な状態だけで数えても答えは同じ。
の遷移は次のとおり。 は で 、 で に遷移する。 は で 、 で に遷移する。 は で 、 で に遷移する。 の受理状態は 。
の初期状態は 、受理状態は 。
答えは 。