まちがいには、種類がある
走れば分かる、は本当か
コース1の最初に、エラーは「世界一誠実な読み手からの返事」だと学びました。このコースは、その返事にひとつ、文句をつけるところから始まります。返事は、実行してみないと来ないのです。
実行しないと来ない——それの何が困るのか。コース2で作ったminilangに、まちがいをひとつ隠したプログラムを用意しました。まず、そのまま動かしてください。
値は 0。エラーは出ません。でもこのプログラムには、まちがいが埋まっています。最後の行を f(10) に変えてみてください。
通った道しか、調べられない
f(10) にしたとたん、「ここには数が要りますが、true/falseが来ました。」と返ってきました。1 + (1 == 2) ——数に真偽を足そうとした行です。このまちがいは最初からそこにあったのに、f(1) ではそこを通らなかったので、返事が来ませんでした。
実行というのは、プログラムの中の一本の道を歩くことです。ifで道が分かれるたび、歩かなかった側は調べられていません。道の分かれ目が10個あれば、道は最大で1,024通り——コース4で見た、あの爆発するかたちです。テストで全部の道を踏むのは、すぐに現実的でなくなります。
あなたは、実行せずに見抜いた
ところで、白状してください。1 + (1 == 2) という式を見た瞬間、実行する前から「これはおかしい」と思いませんでしたか。
1 == 2 は、問いの答えだから真偽。それを数の 1 に足す——種類のつじつまが合っていません。あなたはプログラムを読んだだけで、どの道を通るかに関係なく、このまちがいを見つけました。実行が「一本の道」しか調べられないのに対して、読む検査はすべての道をいっぺんに調べられるのです。
このコースの計画は、こうです。あなたがいまやった「読む検査」を、機械にやらせる。 その機械を型検査器と呼びます——が、名前の前にまず、あなたが何を手がかりに見抜いたのかを、はっきりさせる必要があります。
⟡ よりみち:「実行せずに分かる」の崖と丘
コース5を歩いた人は、眉に唾をつけているはずです——「実行せずに止まるかを判定する機械は、作れないはずでは」。そのとおり。でも「1 と 真偽 は足せない」のような種類のつじつまは、その場の式を見るだけで決められます。実行前の検査には、原理的に登れない崖(停止性)と、ちゃんと登れる丘がある——このコースは、丘の話です。
✎ 演習:隠れたまちがいを、読みで見つける
実行する前に、次のプログラムを読んで、まちがいの場所を指さしてください。それから実験室に打ちこんで、どの入力なら無事に動いてしまうかも確かめてください。
fn hanbun(x) { if x < 100 { x / 2 } else { (x > 50) + 1 } }hanbun(10)ヒント1(考え方)
それぞれのかたまりの「種類」を考えます。x > 50 は、何で答えが返る式でしょう。
こたえ
(x > 50) + 1 がまちがいです。x > 50 の答えは真偽なのに、数の 1 を足そうとしています。そして hanbun(10) は else の道を通らないので、無事に動いてしまいます——hanbun(100) 以上で初めて転びます。読みなら、入力を選ばずに見つけられました。
このレッスンで分かったこと
- エラーという返事は、実行してみないと来ない
- 実行は一本の道しか調べない。通らなかった道のまちがいは黙っている
- 「動いた」と「正しい」はちがう
- 人間は読むだけで種類のつじつまを見抜ける——それを機械にやらせるのがこのコース