計算モデルと論理とゲーデルの不完全性定理
ゲーデルの不完全性定理は、数学を扱う数学、つまりメタ数学を考えるが、それだと理解が難しい。しかし、証明(数学)=プログラムという悟りを開くと、プログラムを扱うプログラム、つまりメタプログラムを考えればよくなり、それならコンパイラ等でなじみがあるので理解が優しくなる。
話の流れは以下。
1. プログラムとは何か
2. 証明とは何か
3. 証明=プログラム
,
( {、 { ヽ.ー、、
\、__ぃ._ゝ⌒ヾ iヾ)}、_
ン_ー-_二ー-, 〉 {厶 _、ヽ _
ヽ._>'´ / /,ィ/ / ハYヘい ,. -- 〃⌒
r−-、 ィ´ 〃 ,イ/7' ,イイ/ 小ヽ 丶、 ,. ‐ '´ハ i ″`ヽ、
、ヽ、 /幺ィ {从{小込v' jゥ仏厶川リ} YV, 小 Vj. |丶 ヽ
` ー-ミー--'_,辷三彡'´ | V'芯` 芬Yjル/ハ. / V√ヽ._! l\ \ '⌒ヽ
,. -‐ ` ̄ _ファィ! "´ ``ン'´イハy′ l{辷 { い. ト、ヽ._ヽ、 \
y'´ __,,_ ___,,彡'´八ム _'__ 、_幺イ厶/ |'心`VヽヘE、ヽY い、 \
′ / |! r==ァ'゙’_ヘ、 ´_ー,Z.彡-―-〈 ‐- 、 ド¨ {tリj ハ> i`′ ヽ
. / !リ ,.幺-‐=,.イ´'´ ,. / / ヽ \l __ ' `゙ ん}.i_,」 `、
. i`¨¨´ . '´ /ィ<{V/ /,イ i′ ,ハ `、 、ぃヽ「⌒`j 厶イl」 、 ぃ ―――証明と
ヽい l / /レ′/〈.い、___,{.{ , -‐ \ \ーヘ` ` `ヒ´_イy , ム、 、 ヽ. }.}、
` \V /, ,{ { '´_,ム≧ー、-ヘー}-/ ,. -‐-、ヽノ ヽ ハ `バ´^)\`ー-) }ハ. ハ{
,. 、 >'/ { い.ィ/ゥ ̄`ハ}ヽ\.{ / _Vごヽ.._/ }ー}`丶乙ヽ '7ノ^ }/
ヽ'^\ー '´_,,. -‐<ゝ`ー之,_ // }ハヘ{、i ヽ`マTハ_ _/; ヽ、 ハ、}ノ┐
,、-‐¬''" ,イ丁二了 { ___彡' / ノノ ヘ! `∨だ¬ / ∠_` }ヘ ン
〉 -r‐/√ l ハ._乙 -‐'´/´/ ム ヾ^ `i′ \ ` ー1´ヽ
-ー‐¬、Y' |/ /了¨¨´ , ' -‐ ' ,.小、 丶 ! 丶. i
/_,. ,?..._ {イ{ / / |′丶 マi 、_ ト、 ,nyぃ/
/´ / ∠-- .._`丶、 ィ"¨¨ ーヘ 〉| \ ヽ -‐ ヽl `"¨¨´ ̄|il}い} , プログラムは―――
{ ,ィ,イ厂¨\.! `ヽ/ '´ ̄`¨マ´/ | i>、 , - \, '"⌒丶. ハ __,,.. 」リ近'´
∨い、 ` ', _,. -≧ュ、', |エ\ Y |´ ,ゝだンゥー
i ,./'´ヽ ヾ 'r-ヘ l-, -― 、 l. ! ` }} `^`
、_r{ヽ //´ ,.ィ √ }ーヘ -‐'´__,. 、 ヽ |__,,.. _、 、ヽ
ュ?ム′ , ' /。/ // ,'ム斗ヘ / `¨´ l ヽ 丶
ゞイ} ,ム./ ∧/−-/ ァZ/! i._ぃ (._,,.. ヘ下、 i l |ィT_i_、_ \. ',
ケ´|./ 〈 ∧/__ ,<./ / 7/、!´ 「 i.ヘ r‐ 、___`ー--‐―_、i. l i!ヘヘヽ、\ }
°厶イ\/∨¨7`ヽ'´ ; / l i l lヘヾヽ._`¨`ーァー ユ´l=キミ、vヘ_ぃ. Y 「「おなじだよ♪」」
,.ゝヘ2__,イ'‐ / / ′!j_! | !. -i¬ ヘ.く`ヽ`¨´ー'´/ィケ i. l i! l マヘ.ヘ\j
r'´ `¨^タ_ / / i /l_j、|i_,,. l-‐!__Vドヽ`ー‐z_'.イ√丁| i! ト、i_,.Vヘヾ`ヽ、
ヽ.___,.イ_/ `7、,' !´ i j ヘ Y'i,.ィ'"^v,.--}、`^マ´/ _/ 7√¨¨マ丁ンj_,.イ´ マベへ`ヽ、
/ //‐-/、/ヽ| / . V ! 〉¬ーi、_〉、Y´,_}厶_rt__ri.}└1厶ィつ}ヘへ>>>ぅ,
// //..__// ヽj' !、__! { jー-'¨´/ 厂ヽ.__マ^¨¨´ `1 r‐}_ `ーラ^´ r、√
Z/V ヽ,くノ _ 廴_j、ノ j,.、_y' / ム._广^i `¨´ `辷'´厶ノ´
ハスケル・カリー & ウィリアム・ハワード4. プログラムできないこと(停止性問題)
5. 証明できないこと(ゲーデルの不完全性定理)
何はともあれ、定義を見てみよう。
自然数論を含む帰納的に記述できる公理系が、ω無矛盾であれば、証明も反証もできない命題が存在する。
- ゲーデルの不完全性定理
なんのこっちゃだが、今から分かりやすく説明する。
プログラムとは何か
まだコンピュータが登場していない1930年代、「計算とは何か」を考えた人たちがいた。
現代から見れば、計算はコンピュータの仕事だから、「プログラムとは何か」となる。
最も有名な計算モデルが、チューリングのチューリングマシンである。
帰納的関数
帰納的関数とは、プログラムでいえば、IF-THEN-ELSEとループと代入さえあれば何でも計算できるということで、BASICやC言語の考え方に近い。
以下のように計算をする。
ループに"箱"があって、その値を書きかえるのが、C言語の教科書によくある「変数とは箱のようなもの」という話のもとである。
ラムダ計算
ラムダ計算は、Haskellなどの関数型言語の基礎であり、ループの代わりに再帰(入れ子)を使う。
以下のように計算をする。
再帰に"穴"があって、その値を書きかえないのが、Haskellの教科書によくある「変数とは穴(ラベル)のようなもので、Haskellには副作用がない」という話のもとである。
余談だが、チューリングとクリーネは、チャーチの弟子である。
____ /__.))ノヽ .|ミ.l _ ._ i.) (^'ミ/.´・ .〈・ リ .しi r、_) | チューリングとクリーネはわしが育てた | `ニニ' / ノ `ー―i´ アロンゾ・チャーチ
以上の3つの計算モデルは、後になって実は等価であるとわかった。
つまり、チューリングマシンができることは帰納的関数やラムダ計算でもできるし、その逆もできるとわかった。
証明とは何か
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
. | (__人__) 公理からはじめて
| ` ⌒´ノ 論理をつないだものだろ、常識的に考えて…
. | }
. ヽ }
ヽ ノ \
/ く \ \
| \ \ \
| |ヽ、二⌒)、 \
ゲルハルト・ゲンツェンゲンツェンが考えた自然演繹という公理系は、常識的な感覚で証明とは何かを考えたもので、名前からして"自然"とついている。
以下のように証明をする。
証明=プログラム
以上3つの計算モデルと1つの公理系をまとめると以下のようになる。
| 名前 | 作者 | キモ | 具体例 |
|---|---|---|---|
| チューリングマシン | チューリング | 無限に長いテープ | コンピュータ |
| 帰納的関数 | クリーネ | 無限に続くループ | C言語 |
| ラムダ計算 | チャーチ | 無限に続く再帰 | Haskell |
| 自然演繹 | ゲンツェン | 無限に続く数学的帰納法 | 証明 |
無限に続く数学的帰納法というのは、無限にある自然数が続く限り帰納法を繰り返せるということで、つまり、ゲーデルの不完全性定理にあった"自然数論を含む帰納的"である。
証明=プログラムについては、
自然演繹と型付きラムダ計算がぴったり対応しているすげー!というカリー=ハワード対応を筆頭に、
プログラムを数学的に厳密に定義しようというプログラム意味論や、証明の正しさをコンピュータで検証しようという定理証明器の研究がある。
プログラムできないこと(停止性問題)
どうかすると無限ループしてしまうプログラムというのは、バグっていて使い物にならない。
それでは、"プログラムが無限ループするかを判定するプログラム"を書くことはできるだろうか?というのが停止性問題である。
冒頭で述べた、プログラムを扱うプログラム、メタプログラムのおでましである。
もしできるなら、ブラウザクラッシャがポップアップを無限にだすのを未然に防げてさぞ便利だろう。
結論からいえば、停止性問題は解決不能であり、そんなプログラムは不可能である。以下で証明する。

プログラムr(r)は、停止しないか、停止するか、のどちらかである。
場合1「r(r)は停止しない」とき、then loopを通ったはずである。よって、Oracle(r,r)は、「r(r)は停止する」と答えたはずである。矛盾している。
場合2「r(r)は停止する」とき、else stopを通ったはずである。よって、Oracle(r,r)は、「r(r)は停止しない」と答えたはずである。矛盾している。
どちらの場合も矛盾しているので、そもそも、Oracleの存在を仮定したのが誤りだったことになる。
よって、Oracleは存在しない。q.e.d.
メタプログラムにできないことは他にもたくさんあるが、たいていは停止性問題に帰着できる。
証明できないこと(ゲーデルの不完全性定理)
プログラムできないプログラムがあった。
そして、"無限ループを記述できるプログラム"="自然数論を含む帰納的に記述できる公理系"である。
よって、証明できない証明もあるはずだ、というのが、ゲーデルの不完全性定理である。
無矛盾かつ完全な公理系がある
停止性問題は、無限ループが原因で生まれる。よって、IF-THEN-ELSEと代入しかないような、ループを書けないプログラムには、停止性問題はない。ありとあらゆるプログラムが必ず停止する。
同様に、ゲーデルの不完全性定理は、数学的帰納法が原因で生まれる。よって、「もし〜ならば」しかないような、数学的帰納法が書けない公理系には、不完全性定理はない。ありとあらゆる命題の正しさを証明できる。
例えば、命題論理は、無矛盾かつ完全な公理系である。(fuga様のコメントをいただき訂正 2010/2/17 20:50)
無矛盾かつ完全な公理系としては例えば実閉体の理論やPresburger算術の理論がある。
よって、よくある勘違いに「どんな公理系も不完全である」というのがあるが、誤りである。
ただ、無限ループを書けないプログラムや、自然数論を扱えない公理系なんて、つまらなくて考えるに値しないと思って、「どんな公理系も」と言いたくなる気持ちはわからないでもない。
ゲーデル数
メタプログラムなら、プログラムをデータ(テキストファイル)として扱うことを自然に考えられるが、
メタ証明だと、証明を自然数として扱うという、頭の痛くなることを考えるはめになる。それがゲーデル数の考え方である。
ゲーデルはきっと大変だったろう。
ゲーデルの不完全性定理の意義
普通にプログラムを書いていれば、メタプログラムや停止性問題には出会わない。
同様に、普通に証明を書いていれば、メタ数学や不完全性定理には出会わない。
停止性問題で困るプログラマがいないのと同様、不完全性定理で困る数学者もいない。
強いて言えば、停止性問題を知っていると、ブラウザクラッシャを未然に防ぐメタプログラムを開発しろ、と言われたとき、それは無理です、とすぐ断れる。
同様に、不完全性定理を知っていると、数学の無矛盾性を数学で証明しろ、と言われたとき、それは無理です、とすぐ断れる。
実用性はあまりない。
オブジェクト指向
今まで黙っていたが、オブジェクト指向(アクターモデル)も、立派な計算モデルである。

オブジェクト指向は、ヒューイット、アラン・ケイなどが60〜70年代に考え出した。
以下のように計算する。
ラムダ計算とオブジェクト指向は、よく似ている。クロージャとオブジェクトの微妙な関係
プログラムはなぜ動くか
抽象的な計算モデルが、だんだんほぐれて、チューリングマシンに落ちる様子を描いてみた。

いろんな事情があって、Coq(定理証明器) -> OCaml(型付きラムダ計算) -> C言語(帰納的関数) -> コンピュータ(チューリングマシン) という、コンパイラのピラミッドができているのが面白い。
参考文献

Computability and Complexity: From a Programming Perspective (Foundations of Computing)
- 作者: Neil Deaton Jones
- 出版社/メーカー: The MIT Press
- 発売日: 1997/01/23
- メディア: ハードカバー
- クリック: 17回
- この商品を含むブログ (1件) を見る

- 作者: Morten Heine Sørensen M.Sc Ph.D,Pawel Urzyczyn prof. dr hab.
- 出版社/メーカー: Elsevier Science
- 発売日: 2006/09/28
- メディア: ハードカバー
- クリック: 56回
- この商品を含むブログ (5件) を見る
- P.Wadler, Proofs are Programs(PDF)
- d.y.d, Curry-Howard Isomorphism
- クロージャとオブジェクトの微妙な関係
- 不完全性定理について(あるいは証明と計算について)








