はじめに
を参照しつつ計算理論を学んでいきます。
0. 序章
0.1 オートマトン、計算可能性および複雑性
本書は「オートマトン、計算可能性および複雑性」を扱う。これらは以下の問いに結びついている:
コンピュータの根本的な可能性と限界とは何か?
オートマトン、計算可能性および複雑性の各領域において、この質問はそれぞれ異なる解釈がなされる。
領域 |
内容 |
||
---|---|---|---|
(1) | オートマトン | 計算の数理モデルが持つ定義や性質を扱う。 | |
(2) | 計算可能性 | 計算問題が解決可能か否かを類別する。 | |
(3) | 複雑性 | 計算が困難であるまたは容易であるかを決定づけるものは何かを議論する。 |
0.2 数学的用法
以降、基礎的な数学的用法を扱う(以降、ここでは一般的な高校・大学数学で扱う範囲の議論は省略し、一般的な数学における用語と言い回しが異なったり、新しい概念、以降のために確認した方が良いもののみ扱う。)。
0.2.1 タプル
オブジェクトの数列はある順序で並んだオブジェクトのリストである。以降では数列を
と括弧「"()"」で囲うことで表現することにする。数列では順番に意味があるため、とは異なるものとして扱う*1。
数列は無限の場合と有限の場合がある。有限の場合を特にタプルということがある。
を2つの集合とするとき、との積*2はその第一成分がに、その第二成分がに属するような順序を持ったすべての組み合わせをいう。
0.2.2 述語
関数の中でもその値域がのいずれかしか取り得ないものを述語()という*3。たとえば入力した自然数が偶数ならば真、そうでなければ偽と返す関数は述語である。
その定義域が次タプルであるような述語を関係(relation)*4、特に項関係という。
関数として書く代わりに述語と集合をまとめて表記する方がより便利な場合がある。述語はと書かれることがある。ここでである。
特別な二項関係として同値関係(equivalence relation)がある。これは2つのオブジェクトが何らかの特徴の観点で同等である(equal)ことを捉える概念である。二項関係が同値関係であるとはが以下の性質を持つことをいう:
- は反射律を満たす:
- は対称律を満たす:
- は推移律を満たす:
0.2.3 グラフ
無向グラフ*5はその一部*6が線で連結した点の集合である。グラフ理論では点はノード(node)や頂点(vertex)と呼ばれ、線はエッジ(枝・辺)と呼ばれる。
ある特定のノードが持つエッジの数を次数(degree)という。任意の2つのノード間には1つの辺までしか許されない。状況によってはループと呼ばれる、自分へのノードを許す場合もある。
ノードを含むグラフにおいて組み合わせはを連結する枝を表す。無向グラフではの順序は重要ではなく、そのためとは同じ枝を表す。順序の無い組み合わせを集合の記法で無向の枝を表す場合がある。もしがのノードの集合、が枝の集合だとするならば、と書く。グラフは図またはより形式的に特定のにより表現することができる。
グラフは時にデータを表現するのに用いられる。ノードが都市、辺がそれらをつなぐ高速道路を、もしくはノードが人、辺がその間の友好関係を表すことがある。利便性のためにグラフのノードおよび/または辺は、このときラベル付けされたグラフと呼ばれることもある。
グラフのノードがのノードの部分集合で、の辺が対応するノードのの辺であるとき、はのサブグラフであるという。
グラフにおけるパス(経路)は枝により結ばれたノードの列である。単純パスはどのノードも2度経由しないパスを表す。もし任意の2つのノードにそれらをつなぐ経路があるならばグラフは連結している(connected)という。パスが同じノードで始まって終えられるならばそのパスを循環(cycle)という。少なくとも3つのノードを持ち最初のノードと最終のノードのみが繰り返すような循環を単純循環という。グラフが木(tree)であるとは、連結しているが単純循環を持たないようなグラフである。
有向グラフは線の代わりに矢印で表す。ある特定のノードから出て行く矢印の数をそのノードの出次数(outdegree)といい、ある特定のノードに入る矢印の数を入次数(indegree)という。有向グラフにおいてノードからへのエッジを組み合わせで表す。有向グラフは形式的にはで書く。ここではノードの集合で、は辺の集合である。すべての矢印が同じ方向を向いて進んでいるようなパスを有向パスという。有向パスがすべての2つのノードをつないでいるならば有向グラフは強く連結されているという。有向グラフは二項関係を用いるのが簡単な表現方法である。もしが定義域をとするような二項関係であるならば、ラベル付けされたグラフはを表す。このときである。
0.3 文字列(string)と言語
文字列(strings of characters)はコンピュータ科学において基本的な構成要素である。ここではアルファベットを任意の空でない有限集合だとし、アルファベットの元はアルファベットを表す記号である。通常、アルファベットおよびアルファベットに属する記号を表現するための字体を表すのにそれぞれを用いる。以下がアルファベットの例である:
あるアルファベットからの文字列(string over an alphabet)はそのアルファベットからの記号からなる有限の数列を指し、普通はお互いに隣り合わせで書き、コンマで区切らない。たとえばアルファベットに対してはアルファベットからの文字列である。がからの文字列であるとき、の長さ(length)はと書き、その文字列が含む記号の数を言う。長さがであるような文字列は空記号といい、で表す。文字列が長さとしてを持つ場合、をと書くことができる。アルファベットの逆元をと書くことにすれば、である。またアルファベットに含まれるアルファベットを部分文字列(substring)という。たとえばはの部分文字列である。
アルファベットに対してとの連接をで定義される。同じ文字列を何度も連結する場合はでそれを表すこととする。
文字列の辞書式順序は辞書における順序と同じものである。
0.4 ブール代数
ブール代数はの2値のみから構築された数学的体系である。当初は純粋数学として受容されてきたものの、今やこの体系はデジタル家電やコンピュータデザインにおける基礎と見なされている。ブール代数においてはブール値といい、で表現されることがある。ブール値は2つの可能性がある状況、たとえば高電圧と低電圧が起こり得る導体や真か偽を取り得る命題、かで答え得る質問に用いる。
ブール値はブール演算子を用いて計算できる。
否定() | ||
論理積() | ||
論理和() |
ブール演算子は、より複雑な算術結果を表すのに和や積を用いるように、単純な命題をより複雑なブール表現に結合するのに用いる。たとえば命題および命題に対してはかつを意味する。の値をその演算の被演算子()という。
他のブール演算子が度々現れることもある。排他的論理和は、どちらか一方のみがであるときにとなるような演算子で、で表される。また等価()は両被演算子が同じ値であるときにを返す演算子で、と書く。最後に実質含意()はで表され、最初の被演算子がで2つ目がであるときのみにを返す演算子である。
排他的論理和 | 等価 | 実質含意 | |
---|---|---|---|
これらの演算子を用いると様々な関係を構築できる。以下の各行は同値である。
⇔ | ||
⇔ | ||
⇔ | ||
⇔ |
およびの分配則はブール表現を操作するのに便利である。