オートマトン・形式言語の問題
アルファベット 上の文字列 について、 に含まれる の個数を と書く。言語 を
と定める( も の倍数とみなす)。 を受理する決定性有限オートマトン(DFA)のうち、状態数が最小のものの状態数を求めよ。ただし、DFA の遷移関数はすべての状態とすべての入力記号に対して定義されている(完全な DFA)とする。
この問題で使うもの
- マイヒル・ネローデの定理と最小状態数(説明と入口の問題)
- 言語の条件から DFA を作る(余り・接尾辞・積構成)(説明と入口の問題)
- DFA の最小化(区別可能な状態の対)(説明と入口の問題)
この問題を解けるようになるまで(22 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
マイヒル・ネローデの定理を使い、「 の個数を 3 で割った余り」と「末尾が に向かってどこまで来ているか」の積で作った 9 状態の DFA から出発して、区別できない状態をまとめよう。
ヒント 2
の個数の余りが でない状態では、受理されるためにはこの先必ず を読まなければならない。 を読むと「末尾の情報」はどうなるか考えよう。
ヒント 3
余り の 3 状態は、 を読むと同じ状態に合流し、 だけでは受理状態に行けないので 1 つにまとめられる。余り の 3 状態が互いに区別できるかを、 と で調べよう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
マイヒル・ネローデの定理により、最小 DFA の状態数は に関する同値関係
の同値類の個数に等しい。
(1) 素朴な積オートマトン. 「」を覚える 3 状態の DFA と、「 で終わるか」を判定する 3 状態の DFA(状態 : でも でも終わらない、: で終わる、: で終わる)の積をとると、状態 (, )の 9 状態の DFA が得られる。遷移は
で、受理状態は のみである。9 状態はすべて到達可能である(例: には の形で、 には の形で、 にはそれに を付けて到達できる。 の場合は , , や空列など)。
(2) のときの同一視. を固定し、 を比べる。
- 記号 を読むと、3 つとも同じ状態 に移る。
- 記号 を読むと、 は変わらず、移り先はそれぞれ で、ふたたびこの 3 つのどれかである。
- この 3 つはどれも受理状態ではない()。
したがって、どの を読んでも、 が を含めば最初の で同じ状態に合流し、 が を含まなければ のまま終わってすべて拒否される。よって は互いに区別できず、1 つにまとめられる。 それぞれで 1 状態ずつになる。
(3) 残りの状態が区別できること. 残る状態は
の 5 つである。
- が異なるもの同士: ()を読むと、受理されるのは のときだけである。 を選べば の異なる 2 状態の一方だけを受理させられるので区別できる。たとえば は からだけ受理、 は からだけ受理される。
- と , : 空列 で だけが受理なので区別できる。
- と : を読むと (受理)、(拒否)なので区別できる。
よって同値類はちょうど 5 個であり、具体的には
- 、 の 2 類
- で、 で終わる/ で終わる/それ以外 の 3 類
である。最小 DFA の状態数は である。
答え:
別解
まず、a の個数を 3 で割った余り と、末尾の状況 を組にした DFA を作る。 は次の 3 通りとする。 は直前の文字が a、 は末尾が ab、 はそれ以外(空列、または末尾が b で、その直前が a でない)である。
遷移は次のとおり。a を読むと 。b を読むと、 なら 、 または なら 。初期状態は 、受理状態は のみ。9 個の状態はすべて到達可能である( は a を 回読んで、 はそのあと b を読んで、 はさらに b を読んで到達できる)。
最小化する。
1. では受理状態がなく、、、 はどれも a で へ、b で または へ進む。この 2 つは では同値なので、3 つの状態は 1 つにまとまる。これを とする。遷移は 、、 となる。
2. では の 3 つが残る。 だけが受理状態。 と は、b を読むと一方は で非受理、他方は で受理となり区別される。
3. 残る 5 状態 が互いに区別できることを示す。
- は唯一の受理状態なので、空列で他と区別される。
- は b で受理するが、 は b で受理しない。
- は ab で受理する()が、 と は ab で受理しない( は に行って にとどまる)。
- は aaab で受理するが、 は aaab で受理しない()。
よって最小 DFA の状態数は 5 である。
検算として、 () は拒否、 は で受理(a が 3 個で ab で終わる)、 は a が 3 個で ab で終わるので受理され、5 状態で正しく動く。