1. 正規言語
計算理論はまず「コンピュータとは何か」という問いから始まる。手許にあるノートPCなどのパソコンはコンピュータとしてはあまりに複雑すぎるため、理論的には計算モデル()という理想的なコンピュータを用いる。科学で用いるモデルと同様に計算モデルはある面では正確である一方で、別の面では不正確である。したがって注目したい特徴に応じて異なる複数の計算モデルを扱うことにする。
1.1 有限オートマトン
有限オートマトン()は極度に限られたメモリしか持たないコンピュータに良いモデルである。現実における自動ドアのような単純な動作をモデル化するのに利用可能である。
1.1.3 有限オートマトンの設計
オートマトンに関することであっても芸術に関することであっても、デザインは創造的な過程である。そのためオートマトンのデザインを単純なレシピや公式に帰着させることはできない。しかし様々な種類のオートマトンを設計するときに便利な特定のアプローチがあり得る。すなわちデザインしようとしているコンピュータに自らを入れ込み、その後そのコンピュータのタスクがどのように実行し得るかを知ることである。
上で述べた「オートマトンとしての読者」メソッドを用いて有限オートマトンをデザインしよう。ある言語が与えられそれを認識するような有限オートマトンをデザインしたいと仮定する。オートマトンを装うのに、入力文字を受け取り、その文字がオートマトンが認識すると想定している言語の集団に含まれるかを決定しなければならない。文字列内の文字1つ1つを把握することになる。各文字の後、以上で把握したその文字列が言語の中に存在するかを決定しなければならない。その理由は、機械のように、読者が文字列の終端が来たのかを知らないからで、常に答えを用意しなければならない。
まずこうした決定を行なうためには、文字列を読み込んでいるときにその文字列について何を記録する必要があるかを理解しなければならない。単純に認識したものをすべて記録してはどうだろうか。覚えておくべきなのは、有限オートマトンを装うをしていることおよびこの種のコンピュータはわずか有限の数の状態、すなわち有限のメモリしか持っていないことである。入力が極端に長い―たとえばここから月まで―場合を考えてみれば、恐らくそのすべてを記憶することはできないだろう。限られたストレージ容量しかもたない―たとえば1枚の紙相当—ような有限のメモリしか持っていない。幸いにも、多くの言語においてすべての入力を記録する必要はない。特定の重要な情報のみ記録すればよい。まさにどの情報が重要なのかは想定している特定の言語次第である。
たとえばアルファベットがで言語が奇数個のを持つすべての文字列だとする。そしてこの言語を認識する有限オートマトンを構築したいとする。オートマトンのふりをすべく、からなる入力文字列を1文字ずつ取得する。の個数が奇数であるか否かを決定するために全文字列を記録する必要はあるか。もちろん、そんなことはない。単純にそれまでのの個数が偶数か奇数かを記録し、そして新しい文字を読み込んだ際にこの情報を残しておけばよい。もしを読み込めば答えを返しせばよい。しかしもしを読み込めば、答えはそのままにしておけばよい。
しかしのデザインにこれがどのように役立つのか。ひとたび読み込まれるがままに文字列を覚えるように必要な情報を決定していれば、この情報は確率の有限なリストとして表示される。この例では、確率はとりあえず偶数もしくはとりあえず奇数となる。すると各確率にある状態を割り当てることになる。これらがここで示すの状態である。
2つの状態と
次に、記号を読み込むことである確率が別の確率に移る方法を見ることで遷移を配置する。したがって、もし状態が偶数である確率を表し状態が奇数である確率を表すならば、状態を変える遷移をで、状態を維持する遷移をで表すことになる。
確率の配置された遷移図
そして、文字(空文字列)を読み込んだことに関連した確率に対応する状態である開始状態を設定する。この事例では、は偶数だから開始状態はである。最後に、入力した文字列を強したい確率に対応する許容状態を設定する。ここではの奇数番号を認識したときに許容したとしたいから、[tex:q_{\mathrm{odd}}を許容状態とする。
開始状態と許容状態を追加した遷移図
1.1.4 正規言語における演算
有限オートマトンおよび正則言語の性質を調べていく。そうすることで特定の言語を認識するためのオートマトンをデザインするための技術を開発できる。
算数において基本的な対象は数であり、道具は数を操作するためのやといった演算子である。計算理論では対象が言語であり、道具はそれらを操作するために特別にデザインされた演算子である。ここで正規演算()と呼ばれる、言語に対する3つの演算子を定義し、これらを正規言語の性質を調べるために用いる。
定義1.4 正規演算 を言語とする。正規演算として和()、連結()およびスター()を以下で定義する。
- 和():
- 連結():
- スター():
連結演算は、新しい言語の文字列を得るべく想定できるあらゆる方法でに含まれる文字の前にに含まれる文字を充てる。
スター演算は、2つの異なる言語というよりは1つの言語に適用されるという点で他2つとは少し異なる演算である。すなわちスター演算は1項演算である。スター演算は新たな言語を得るべく、に含まれる任意の数の文字列を結合する。任意の数とはを含み、空文字列はが何であれ常にに含まれる。
定理1.5 正規言語のクラス 正規言語のクラスは和演算に関して閉じている。すなわちが正規言語であるならば、もまた正規言語である。
- はに共通とする。
- 遷移関数を以下のように定義する。 に対してとおく。
- とする。
- はその一方がの許容状態であるような状態の組の集合とする。
これはの和集合を認識する有限オートマトンの構築方法に他ならない。 )
これと同様に連結でも演算は閉じていることを示すことができる。
定理1.6 正規言語のクラス 正規言語のクラスは連結演算に関して閉じている。すなわちが正規言語であるならば、もまた正規言語である。