まちがいには、種類がある

よみもの+手を動かす時間:およそ20分

走れば分かる、は本当か

コース1の最初に、エラーは「世界一誠実な読み手からの返事」だと学びました。このコースは、その返事にひとつ、文句をつけるところから始まります。返事は、実行してみないと来ないのです。

実行しないと来ない——それの何が困るのか。コース2で作ったminilangに、まちがいをひとつ隠したプログラムを用意しました。まず、そのまま動かしてください。

③ 評価された値
0

値は 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) 以上で初めて転びます。読みなら、入力を選ばずに見つけられました。

このレッスンで分かったこと

  • エラーという返事は、実行してみないと来ない
  • 実行は一本の道しか調べない。通らなかった道のまちがいは黙っている
  • 「動いた」と「正しい」はちがう
  • 人間は読むだけで種類のつじつまを見抜ける——それを機械にやらせるのがこのコース