Download - 正規言語について
正規言語について
有限オートマトン
入力 =SUM(B3,B4)
= S U M
(
大文字アルファベット1文字
数字
,
)
有限オートマトン
入力 =SAM(B3,B4)
= S U M
(
大文字アルファベット1文字
数字
,
)
不受理! Error!
正規言語?
定義: 決定性有限オートマトンによって受理可能な文字列
Excel の式の例では、=SUM(B8,C2, A9)
などは、先程のオートマトンで受理されるので、正規言語になる
応用例: コンパイラ
コンパイラ (プログラミング言語を、0と1で書かれた機械語に変換するプログラム)
Dim str = “abcde” as String
なんてのを、ちゃんと文法通りに文字列が並んでいるかチェックし、受理されない場合はコンパイルエラーを出す
応用例: 正規表現
送信者が a*@u-tokyo.ac.jp のメールを、「情報教育」フォルダに振り分けると設定[email protected]
…
a で始まり @u-tokyo.ac.jp で終わるアドレスの全てが「情報教育」フォルダに入る
※1 本当はこれは正規表現ではなくワイルドカードなのですが、一番わかり易いので、その辺りはご容赦
反復補題 (Pumping Lemma)
反復補題の厳密な定義
L が正規言語ならば、ある定数 n が存在して、L に属する長さが n 又はそれ以上の全ての語 W
に対して、次のような語 X, Y, Z が存在するW = XYZ
(XY の文字列の長さ) <= n
(Y の文字列の長さ) >= 1
k = 1,2,3,... に対して、XYkZ はL に属するここで、Yk は語 Y が k 個繰り返される事を意味する以上、教科書よりコピペ
もう少しましな反復補題の説明
正規言語の集合を考え、これをLとする。この集合に含まれる適当な文字列を用意する。
aaabbbbccccc
定数 n を決める。但し、上の文字列の文字数より小さい値である必要がある。
ここでは n = 8 とする。この文字列を三つに分割してみる。
…但し以下の条件をみたすように真ん中の文字列が1文字以上
もう少しましな反復補題の説明
aaa | bbbb | ccccc
一文字以上
n文字(ここでは8文字)以下
真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは8文字) 以下
もう少しましな反復補題の説明
aaa | bbbb | cccccaaa | bbbb bbbb | cccccaaa | bbbb bbbb bbbb | ccccc
aaa | bbbb bbbb bbbb bbbb | cccccaaa | bbbb bbbb bbbb bbbb bbbb | ccccc
真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは8文字) 以下真ん中をどれだけ増やしても、これらは全部正規言語になる!
もう少しましな反復補題の説明
このような条件が、aaabbbbccccc だけでなく、全ての正規言語に対して当てはまる、という補題
反復補題 (Pumping Lemma)
全ての正規言語には、真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは8文字) 以下真ん中をどれだけ増やしても、これらは全部正規言語になる!
という三つの条件を全て満たすような定数 n がそれぞれ存在する。
で?
反復補題の用途
与えられた言語が正規言語でないことの証明に用いる
回文が正規言語でない証明
ある条件を満たす文字列の集合 L を考え 今回は L: 回文の集合とする。
Lを正規言語である 集合 と仮定し、その矛盾を導くこの集合に含まれる適当な文字列を用意する。
akasaka
定数 n を決める。但し、上の文字列の文字数より小さい値である必要がある。
ここでは n = 6 とする。この文字列を三つに分割してみる。
n=6 で akasaka は条件に合致する?
akas | ak | a
1文字以上
n文字(ここでは6文字)以下
真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは6文字) 以下
n=6 で akasaka は条件に合致する?
akas | ak | aakas | ak ak | aakas | ak ak ak | aakas | ak ak ak ak | aakas | ak ak ak ak ak | a
真ん中をどれだけ増やしても、これらは全部…正規言語で回文になるはずだが ならない!?
じゃあ n=4 で!
n=4 で akasaka は条件に合致する?
aka | s | aka
1文字以上
n文字(ここでは4文字)以下
真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは6文字) 以下
n=4 で akasaka は条件に合致する?
aka | s | akaaka | s s | akaaka | s s s | akaaka | s s s s | akaaka | s s s s s | aka
真ん中をどれだけ増やしても、これらは全部…正規言語で回文に なった! (`・ω ’・ b
n=4 で akasaka は条件に合致する?
n=4 の時、akasaka を反復させてaka s s s s … aka
としても、回文であり続ける
よって、反復補題より、他の全ての回文も正規言 語であるはず → n=4 の時に同じ反復が可能な
はず!
No Melon No Lemon でやってみよう!
“nomelonnolemon”
n=4 として反復を行う
nomelonnolemon は回文なので、正規言語に成るはず!
No Melon No Lemon でやってみよう!
nom | e | lonnolemon
1文字以上
n文字(ここでは4文字)以下
真ん中の文字列が1文字以上最初と真ん中の文字列の合計がn 文字 (ここでは6文字) 以下
No Melon No Lemon でやってみよう!
no | m | elonnolemonno | m m | elonnolemon
no | m m m | elonnolemonno | m m m m | elonnolemonno | m m m m m | elonnolemon
真ん中をどれだけ増やしても、これらは全部… …正規言語で回文にな らない orz
回文が正規言語でない証明 (結論)
akasaka は n=4 において、反復補題を満たすので、正規言語である。
aka s s s s … aka
反復補題より、他の回文も n=4 において正規言語であるはずであるので、nomelonnolemon もn=4 で反復補題を満たすはず。しかし、nom e e e e …lonnolemon
だからそれで?
回文は正規言語でない。だから?
あるテキストが回文か否か、ということを、正規表現を使って判断することができない。あるテキストから、なにかしらの回文を抽出する、ということができない。
…
など、回文で構成されたメールアドレスからの
参考資料
Wikipedia 日本語版「正規言語の反復補題」
「オートマトン・言語理論」 富田悦次・横森貴 共著 森北出版 1992年
p20「2・2 有限オートマトン」