数学の「まちがい」とプログラミングの「まちがい」は違う
数学の「まちがい」は1+1=3や 10 mod 4 = 3 のような、本来の定義とは異なる値を求めてしまうことを指す。
プログラミングにおける「まちがい」はそれよりも少しだけ構造が複雑だ。人間が定義とは異なることをしてしまうのは数学の「まちがい」の場合と共通だが、コンピュータが定義通りの事をいつも・どこでも・必ず遂行する、という点が決定的に違う。*1
コンピュータが下支えをしている訳である。
なので面白いことが起こる。人間が間違えて、例えばWarshall-Floydを実装しようとしてfor文をk, i, jの順ではなくi, j, kの順に回してしまうと、それはWarshall-Floydのアルゴリズムの定義からは異なってしまうが、実行される処理自体は物理現象として「正しい」。再現性は100%なので決定的で、決して気まぐれなところはない。いつまでも物理現象としては正しいことをしていて、求めている概念としては間違えた処理をしていてくれる。
おそらくそれというのは学習にとっては最高の環境なんじゃないのかなあと最近は思い始めた。学習というのはつまりは仮説の修正だと言える。あのパン屋は日曜休日だと食べログに書いてあったから開いてないかと思ったとか(実際には店主がきまぐれに開けることがある)、このオートマトンは数万個のテストケースを通ったからまあ正しいと仮説を立ててもなんら心配しないですむでしょうとか、世の中で知識とされていることは単に可能性の高い仮説に過ぎない(ただひとつ、数学の「証明」を除いて)。
仮説を修正する上で、自分の理解が間違っていて、相手(コンピュータ)の理解が正しいことが確実に仮定できるというのは非常に有利だ。探索空間がものすごく狭まる。自分が書いたプログラム(=仮説)だけを読めばいい状況というのは、相手の動作が正しいかを逐一確認しなければならない状況と比べると格段に修正が早い*2
紙に書いた数式ではそれができない。
紙に書いた数式を、例えば採点者や教授に見せたとして、その相手がまちがえない確率はヒューマンエラーの起きる確率を割らない。前提さえ満たせば誤答率0%であるコンピュータというのは、計算において強力な思考補助手段にほかならない。