計算可能性理論のソースを表示
←
計算可能性理論
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{複数の問題 |参照方法=2017年10月 |出典の明記=2021年3月}} {{重複|dupe=再帰理論|date=2023-12}} '''計算可能性理論'''(けいさんかのうせいりろん、{{lang-en-short|computability theory}})とは、[[チューリングマシン]]などの[[計算模型]]でいかなる計算問題が解けるか、またより抽象的に、計算可能な問題のクラスがいかなる構造をもっているかを調べる、[[計算理論]]や[[数学]]の一分野である。<!-- 計算可能性は[[計算複雑性]]の特殊なものともいえるが、ふつう複雑性理論といえば[[チューリングマシン|計算可能関数]]のうち計算資源を制限して解ける問題を対象とするのに対し、計算可能性理論は、計算可能関数またはより大きな問題クラスを主に扱う。 --><!-- どちらかというと、明確に問題クラスが異なる分野である、という気がしますが…… --> == はじめに == [[理論計算機科学]]の中心的課題の1つとして、コンピュータを使って解ける問題の範囲を理解することでコンピュータの限界に対処する、ということがあった。コンピュータは無限の計算能力を持つと思われがちだし、十分な時間さえ与えられればどんな問題も解けると想像することは易しい。しかし間違っており、そのことは「チューリングマシンの[[停止性問題|停止問題]]」の否定的解決として示された。以下では、そこに至る過程とそこから先の発展を述べる。 計算可能性理論では、次の質問に答えることでコンピュータの能力を明らかにする。すなわち「ある[[形式言語]]と文字列が与えられたとき、その文字列はその形式言語に含まれるか?」である。この質問はやや難解なので、もう少し判り易く例を挙げる。まず、全ての素数を表す数字列の集合を言語として定義する。入力文字列がその形式言語に含まれるかどうかという質問は、この場合、その数が素数であるかを問うのと同じことである。同様に、全ての[[回文]]の集合や、文字 'a' だけからなる全ての文字列の集合などが形式言語の例である。これらの例では、それぞれの問題を解くコンピュータの構築の容易さが言語によって異なることは明白である。 しかし、この観測された明白な違いはどういう意味で正確なのか? ある特定の問題をコンピュータで解く際の困難さの度合いを定式化し定義できるか? その質問に答えるのが計算可能性理論の目標である。 == 計算の形式モデル == 計算可能性理論の中心課題に答えるために、「コンピュータとは何か」を形式的に定義する必要がある。利用可能な[[計算模型|計算モデル]]はいくつか存在する。以下に代表例を挙げる。 ; [[決定性有限オートマトン|決定性有限状態機械]] : 決定性有限オートマトン(DFA)、あるいは単に有限状態機械とも呼ぶ。単純な計算モデルである。現在、実際に使われているコンピュータは、有限状態機械としてモデル化できる。この機械は状態の集合を持ち、入力列によって働く状態遷移の集合を持つ。一部の状態は受容状態と呼ばれる。入力列は一度に1文字ずつ機械に入力され、現在状態から状態遷移先への遷移条件と入力が比較され、マッチングするものがあればその状態が新たな状態となる。入力列が終了したとき機械が受容状態にあれば、全入力列が受容されたということができる。 ; [[プッシュダウン・オートマトン]] : 有限状態機械に似ているが、任意のサイズに成長可能な実行[[スタック]]を利用可能である点が異なる。状態遷移の際に記号をスタックに積むかスタックから記号を除くかを指定できる。 ; [[チューリングマシン]] : これも有限状態機械に似ているが、入力が「テープ」の形式になっていて、読むだけでなく書くこともでき、テープを送ったり巻き戻したりして読み書きの位置を決めることができる。テープのサイズは任意である。チューリングマシンは時間さえかければ、かなり複雑な問題も解くことができる。このモデルは計算機科学では最も重要な計算モデルであり、資源の限界がない計算をシミュレートしたものである。 == 計算モデルの能力 == これらの計算モデルについて、その限界を定めることができる。すなわち、どのクラスの[[形式言語]]をその計算モデルは受容するか、である。 === 有限状態機械の能力 === 有限状態機械が受容する言語のクラスを'''[[正規言語]]'''と呼び、'''[[正規文法]]'''で記述される。有限状態機械が持つことができる状態は有限個であるためであり、正規言語でない言語を扱うには無限の状態数を扱える必要がある。 正規言語でない言語の例として、文字 'a' と 'b' から構成され、各文字列に必ず 'a' と 'b' が同数含まれている言語がある。この言語が有限状態機械で認識できない理由を調べるため、まずこの言語を受容するための有限状態機械 <math>M</math> があるとする。<math>M</math> は <math>n</math> 個の状態を持つとする。ここで、文字列 <math>x</math> が <math>(n+1)</math> 個の 'a' の後に <math>(n+1)</math> 個の 'b' があるような構成であるとする。 <math>M</math> の状態数は <math>n</math> しかないため、<math>x</math> を入力としたときに最初の 'a' が連続する部分の長さが<math>(n+1)</math>であることから、[[鳩の巣原理]]により、何らかの状態を繰り返すことになる。<math>(n+1)</math> 個の 'a' を読み込んだ状態 <math>S</math> が 'a' を <math>d</math> 個読み込んだ時に再度現われるとする(<math>d > 0</math>とする)。つまり、<math>(n+d+1)</math> 個の 'a' を読み込んだときと <math>(n+1)</math> 個の 'a' を読み込んだときの状態が区別されない。従って、<math>M</math> が <math>x</math> を受容するなら、その機械は <math>(n+d+1)</math> 個の 'a' と <math>(n+1)</math> 個の 'b' からなる文字列も受容してしまう。しかしその文字列は 'a' と 'b' が同数でないため、言語の定義からは受容してはいけない文字列なのである。 従って、この言語は有限状態機械では正しく受容できず、正規言語ではないということになる。これを一般化したものを[[正規言語の反復補題]]と呼び、各種言語クラスが有限状態機械で認識できないことを示すのに使われる。 この言語を認識できるプログラムは簡単に書けると思われるかもしれない。そして、現在のコンピュータは有限状態機械でモデル化できると上に書いてある。もちろんプログラムは書けるが、この問題の本質はメモリ容量の限界の見極めにある。非常に長い文字列を与えられた場合、コンピュータのメモリ容量が足りなくなって入力文字数を数えられなくなり、オーバーフローするだろう。その意味で、現代のコンピュータは有限状態機械と同じと言える。したがって、この言語の文字列の大部分は認識できるとしても、必ず認識できない文字列が存在する。 === プッシュダウン・オートマトンの能力 === [[プッシュダウン・オートマトン]]が受容する言語のクラスを'''[[文脈自由言語]]'''と呼び、'''[[文脈自由文法]]'''によって記述される。正規言語でないとされた 'a' と 'b' を同数含む文字列からなる言語はプッシュダウン・オートマトンで判定可能である。また一般に、プッシュダウン・オートマトンを有限状態機械のように動作させることもできるので、正規言語も判定可能である。従ってこの計算モデルは有限状態機械よりも強力である。 しかし、プッシュダウン・オートマトンでも判定できない言語がある。その詳細は(正規言語のときとあまり変わらないので)ここでは述べない。[[文脈自由言語の反復補題]]も存在する。例えば、素数の集合からなる言語がその例である。 === チューリングマシンの能力 === [[チューリングマシン]]は任意の文脈自由言語を判定できるだけでなく、プッシュダウン・オートマトンが判定できない言語(例えば素数の集合からなる言語)も判定可能である。したがってチューリングマシンはさらに強力な計算モデルと言うことができる。 チューリングマシンでは、入力テープに「バックアップ」を置くことができるため、上で説明した計算モデルには不可能な方法で動作可能である。入力に対して停止しないチューリングマシンを構築することもできる。チューリングマシンはあらゆる入力について停止して答え(言語と入力の判定)を返す機械である。このようにチューリングマシンが必ず停止する言語クラスを'''[[帰納言語]]'''と呼ぶ。ある言語に含まれる文字列を与えられたときには停止するが、その言語に含まれない文字列を与えられたときに停止しない可能性があるというチューリングマシンもある。このような言語を'''[[帰納的可算言語]]'''と呼ぶ。 チューリングマシンは非常に強力な計算モデルである。チューリングマシンの定義を修正してより強力なモデルを作ろうとしても失敗する。例えば、1次元だったテープを2次元や3次元に拡張したチューリングマシンや、複数のテープを持つチューリングマシンなどが考えられるが、いずれも1次元の1個のテープを持つチューリングマシンでシミュレート可能であることが判っている。つまり、それらのモデルの能力は通常のチューリングマシンと同じである。実際、[[チャーチ=チューリングのテーゼ]]では、チューリングマシンで判定できない言語を判定可能な計算モデルはないと推定されている。様々な人々がチューリングマシンよりも強力だという計算モデルを提案してきた。しかし、それらは非現実的であるか不合理である([[#不合理な計算モデル|下記]]参照)。 従ってチューリングマシンは計算可能性の限界に関する広範囲な問題を解析する強力な手法である。そこで次の疑問が生まれる。「帰納的可算だが帰納でない言語はあるのか?」である。また、「帰納的可算でもない言語はあるのか?」という疑問も生まれる。 ==== 停止問題 ==== {{Main|チューリングマシンの停止問題}} 停止問題は計算機科学の重要な問題の1つであり、計算可能性理論だけでなく日々のコンピュータの利用にも深い意味を持っている。停止問題を簡単に述べると次のようになる: : チューリングマシンと入力が与えられたとき、その入力を与えられたプログラム(チューリングマシン)は停止(完了)するかどうかを求めよ。停止しない場合、永遠に動作し続ける。 ここでチューリングマシンが判定しようとするのは素数や回文といった単純な問題ではなく、チューリングマシンで他のチューリングマシンに関する質問への答えを得ようとしているのである。詳しくは主項目([[チューリングマシンの停止問題]])を参照してもらうとして、結論としてこの問いに(あらゆる場合に)答えられるチューリングマシンは構築できない。 すなわち、あるプログラムとその入力があったとき、それが停止するかどうかは単にそのプログラムを実行してみるしかないということになる。そして、停止すれば停止することがわかる。停止しない場合は、それがいつか停止するのか、それとも停止せずに永遠に動作するのかは判らない。あらゆるチューリングマシンに関する記述とあらゆる入力の停止する全組合せからなる言語は帰納言語ではない。従って、停止問題は計算不能または[[判定不能]]と呼ばれる。 停止問題を拡張した[[ライスの定理]]では、言語が特定の自明な特性を持つかどうかは(一般に)判定不能であるとされる。 ==== 帰納言語以上の言語 ==== しかし、停止しないチューリングマシンの記述を入力として与えられたとき、それを判定するチューリングマシンが永遠に動作することを許容するなら、停止問題は一応解決する。従って、停止問題判定は帰納的可算言語である。しかし、帰納的可算ですらない言語も存在する。 そのような言語の単純な例は、停止判定の[[補問題]]である。つまり、全てのチューリングマシンとそれらが停止'''しない'''入力の全組合せからなる言語である。この言語が帰納的可算言語でないことを示すため、そのような全チューリングマシンについて停止して答えを返すチューリングマシン <math>M</math> を構築することを考える。このマシンはチューリングマシンとその入力の組合せが停止する場合は永遠に動作し続ける。そして、このマシンの動作をシミュレートするチューリングマシン <math>M'</math> を考える。つまり、入力として<math>M</math>の記述とその入力(別のチューリングマシンの記述とその入力)が与えられる。さらに[[タイムシェアリングシステム|タイムシェアリング]]によって<math>M'</math>は<math>M</math>の入力(あるチューリングマシンとその入力)も並行して実行するものとする。<math>M</math>の入力であるチューリングマシンの記述と入力が停止しない組合せの場合、<math>M</math> は停止し、そのシミュレーションも停止することになる。従って、<math>M'</math>は一方のスレッドが停止し、もう一方が停止しないことから停止問題の判定機能を備えることになる。しかし、既に示したように停止問題は判定不能である。この矛盾により、<math>M</math> が存在するという仮定が誤っていたことがわかる。以上から停止判定言語の補問題は帰納的可算言語ではないことがわかる。 == 不合理な計算モデル == [[チャーチ=チューリングのテーゼ]]では、チューリングマシンよりも強力な計算モデルは存在しないと推測した。ここでは、その推定に反する「不合理」な計算モデルの例をいくつか示す。計算機科学者は様々な「[[ハイパーコンピュータ]]」を想像してきた(ここでいうハイパーコンピュータとは、[[スーパーコンピュータ]]のさらに高性能なものという意味ではない)。 === 無限実行 === 計算の各ステップが前のステップの半分の時間しかかからない機械を考える。第一ステップにかかる時間を 1 に正規化すると、実行にかかる時間は :<math>1 + {1 \over 2} + {1 \over 4} + \cdots</math> となる。この無限数列の総和は 2 に近づいていく。つまり、このチューリングマシンは 2 単位の時間内に無限の処理を実行できる。この機械は、対象となる機械の実行を直接シミュレーションすることで[[チューリングマシンの停止問題|停止問題]]の判定が可能である。 === 神託機械 === [[神託機械]]とは、特定の決定不能な問題への解を「神託」として与える機械である。例えば、チューリングマシンに「停止問題の神託機械」が付属していれば、与えられた入力についてそのチューリングマシンが停止するかどうかは即座に判定できる。このような機械は[[再帰理論]]の中心的話題である。 === ハイパーコンピュータの限界 === これらのマシンにも限界はある。あるチューリングマシンの停止問題を解くことができるとしても、それらの機械自身の停止問題は解くことができない。つまり、神託機械は、ある神託機械が停止するかどうかに答えることはできない。 == 歴史 == [[アロンゾ・チャーチ]]と[[スティーブン・コール・クリーネ]]が開発した[[ラムダ計算]]により、計算可能性理論の定式化に重要な役割を果たした。[[アラン・チューリング]]は現代計算機科学の父とされる人物であり、[[チューリングマシン]]など計算可能性理論にも数々の重要な足跡を残している([http://web.comlab.ox.ac.uk/oucl/research/areas/ieg/e-library/sources/tp2-ie.pdf]、1936年)。 ==参考文献== * {{cite book|author = Michael Sipser | date = 1997年 | title = Introduction to the Theory of Computation | publisher = PWS Publishing | id = ISBN 0-534-94728-X}} Part Two: Computability Theory, chapters 3–6, pp.123–222. * {{cite book|author = Christos Papadimitriou | date = 1993年 | title = Computational Complexity | publisher = Addison Wesley | edition = 1st edition | id = ISBN 0-201-53082-1}} Chapter 3: Computability, pp.57–70. ==関連項目== *[[オートマトン]] *[[計算模型]] *[[計算複雑性理論]] *[[チョムスキー階層]] {{コンピュータ科学}} {{デフォルトソート:けいさんかのうせいりろん}} [[Category:計算可能性理論|*]] [[Category:数理論理学]] [[Category:数学に関する記事]]
このページで使用されているテンプレート:
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Main
(
ソースを閲覧
)
テンプレート:コンピュータ科学
(
ソースを閲覧
)
テンプレート:複数の問題
(
ソースを閲覧
)
テンプレート:重複
(
ソースを閲覧
)
計算可能性理論
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報