ケータイ小説 計算機科学入門 第2話

定義だけなら
サルでもできる
理論は例と定理が命

有限状態オートマトンの例

入力として
0と1の列を考える


自然数nを2進数で
大きい桁から順に書いた列よ


nが3の倍数かどうか
「計算」するオートマトンを作るわ


状態集合Qは{q_0, q_1, q_2}
つまり状態はq_0, q_1, q_2の3つ


現在の状態がq_iだったら
それまでの入力列が表す自然数nを
3で割った余りはiになる


そうなるように
遷移を定義するの


例えば現在の状態がq_2のとき
それまでのnを3で割った余りは2


そこに入力0が来たら
2進数の下一桁に0を付け加えるのだから
nは2nに変化する


nを3で割った余りが2ならば
2nを3で割った余りは1だから
状態はq_1に変化する


つまり q_2 ---0---> q_1


状態q_2に
入力1が来たら
nは2n+1に変化する


nを3で割った余りが2ならば
2n+1を3で割った余りも2だから
状態はq_2のまま


つまり q_2 ---1---> q_2


同様に考えて
q_0 ---0---> q_0
q_0 ---1---> q_1
q_1 ---0---> q_2
q_1 ---1---> q_0


すべてまとめると
遷移関係T = { (q_0,0,q_0), (q_0,1,q_1), (q_1,0,q_2), (q_1,1,q_0), (q_2,0,q_1), (q_2,1,q_2) }


「3の倍数かどうか」って「計算」だから
入力が終わったときの状態がq_0だったら答えは「yes」
q_1かq_2だったら「no」


試しに2進数で「1001」(10進数で9)を入力してみると
q_0 --1--> q_1 --0--> q_2 --0--> q_1 ---1--> q_0

最後の状態はq_0
だから確かに
答えは「yes」

受理状態、受理言語

「計算」=「情報の処理」だから
入力だけじゃなくて
出力もないと意味がない


一番簡単な計算モデルだから
入力に対する答え(出力)は
「yes」か「no」しかないことにして


入力に対して
「yes」と答える状態が「受理状態」
受理状態じゃなければ答えは「no」


一般に
受理状態は一つじゃなくても良いから
受理状態の集まりを
集合Aで表すわ


状態集合Q
遷移関係T
初期状態q_0
受理状態の集合A


それらからなる一つのオートマトンMが与えられたとき
q_0 --a--> q_i --b--> q_j --c--> q_k --d--> ... --z--> q
のように遷移を繰り返して
qが受理状態になる(Aに属している)


そうなるような入力列abcd...zの集まりを
そのオートマトンMの受理言語と呼ぶわ


たとえばさっきの例に出てきたオートマトン
Q = { q_0, q_1, q_2 }
T = { (q_0,0,q_0), (q_0,1,q_1), (q_1,0,q_2), (q_1,1,q_0), (q_2,0,q_1), (q_2,1,q_2) }
A = { q_0 }
これの受理言語は
「2進数とみなしたら3の倍数になるような、
0と1からなる列」の集合

練習問題

入力として
0と1と2からなる列を受け取って
「012」と連続して現れる部分が「ない」


そういう列(だけ)を受理する
オートマトンを与えてご覧なさい


っていうか
オートマトンだから
初期状態はq_0として
状態集合Q
遷移関係T
受理状態の集合A
この3つを明示してみせなさい


みたいな?

練習問題2

「012」じゃなくて
「0101」だったら?
つまらなかったので削除
みたいな