オートマトン・形式言語の問題
アルファベット 上の文字列 について、 に含まれる の個数を と書く。言語 を次のように定める。
条件「」を判定する DFA と、条件「 は で終わる」を判定する DFA を、それぞれ状態数が最小になるように作る。次に、 の状態と の状態の組 をすべて状態とする積構成によって、 を受理する DFA を作る。
の状態数を求めよ。
この問題で使うもの
- 言語の条件から DFA を作る(余り・接尾辞・積構成)(説明と入口の問題)
この問題を解けるようになるまで(20 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
条件ごとに「何を記憶すればよいか」を決めて DFA を作り、積構成(状態の組)で共通部分の DFA を作る技能を使います。
ヒント 2
条件 (i) では の個数を で割った余りを、条件 (ii) では「末尾が のどこまで一致しているか」(何もなし//)を記憶します。積構成の状態数は、2 つの DFA の状態数の積です。
ヒント 3
は余り に対応する 状態、 は (一致なし)、(末尾が )、(末尾が )の 状態です。あとは組の個数を数えます。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
手順 1:条件 (i)「」の DFA を作る。
記憶しておけばよい情報は「これまでに読んだ の個数を で割った余り」だけである。そこで、余り に対応する状態 を用意する。
- 初期状態は (空文字列では は 個)
- を読んでも の個数は変わらないので、
- を読むと個数が 増えるので、
- 受理状態は
この 4 状態はどの 2 つも区別しなければならない。たとえば と ()は、後ろに を 個つけると、 からは (受理)に、 からは 以外(不受理)に行く。よって の最小の状態数は である。
手順 2:条件 (ii)「 で終わる」の DFA を作る。
記憶しておけばよい情報は「 の末尾が の先頭部分とどこまで一致しているか」である。
- :末尾が でも でもない(空文字列を含む)
- :末尾が
- :末尾が
遷移は次のとおり。
| 状態 | ||
|---|---|---|
| (初期) | ||
| (受理) |
だけが受理状態なので、 は と区別される。 と は、後ろに をつけると (不受理)、(受理)となるので区別される。よって の最小の状態数は である。
手順 3:積構成で を作る。
の状態は組 で、 文字読むごとに両方の成分を同時に遷移させる。たとえば である。初期状態は 、受理状態は両方の条件を満たす のみである。
状態の組の個数は、積の法則より
である。
したがって、 の状態数は である。
別解
(最小 DFA): 状態は の個数を 4 で割った余り の 4 個。初期状態は 、受理状態は 。遷移は では状態を変えず、 では とする。
状態 () は、接尾辞 を とすると、 からは受理されるが からは受理されない。よって 4 状態はすべて区別でき、最小は 4 状態である。
(最小 DFA): 状態は (直前が でなく、 の途中でもない。初期状態)、(直前の文字が )、( で終わっている)の 3 個。受理状態は 。
| 状態 | ||
|---|---|---|
区別可能性は次のとおり。 だけが受理状態なので、 は他と区別できる。 と は、文字列 を読むと (非受理)、(受理)となるので区別できる。したがって最小は 3 状態である。
積構成: 問題文の指定により、状態集合は のすべての組である。到達可能かどうかで数を減らさない。
初期状態は 、受理状態は 。遷移は成分ごとに とする。
状態数は 。
検算: 到達可能性を確かめると、 から で 、 で 、 で などと進み、12 個すべてに到達できる。よって到達不能状態を除いても 12 個で、答えは変わらない。