それでも、庭は実る

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

崖を見たあとで

前のふたつのレッスンで、あなたは崖を見ました。「このプログラムは止まるか」を実行せずに言い当てるプログラムは、書けない——むずかしいのではなく、原理的に書けないのでした。

それなら、ひとつ不思議なことがあります。この庭の実験室は、止まらないかもしれないプログラムを、あなたに何度も走らせてきました。なのにこのページは、一度も凍りついていません。

判定できないものを、どうやって走らせてきたのか。じつはあなたは、その答えをこの庭で、もう何度も見ています。

この庭の、種明かし

思い出してください。コース2で while を覚えたあなたの言語に終わらないくりかえしを書かせたとき、「プログラムがいつまでも とまりませんでした。」という返事が出ました。あのとき種明かしされたのが燃料(フューエル)——評価の1歩ごとに燃料を1払わせて、尽きたら打ち切る仕掛けです。

今日の種明かしは、その先です。あの燃料は、あの実験室だけの特注品ではありません。この庭の実験室は、ぜんぶ燃料計を積んでいます。

コース1のにわ語は、10万歩で燃料が尽きます。コース2のminilangも、10万歩です。そしてこのコースのチューリング機械が出してきた「◯歩で打ち切りました。この機械は、止まらないかもしれません。」——あれも、同じ燃料計の声でした。

つまりこの庭の作者は、停止性問題を解いていません。解けないと知ったうえで、あきらめ方を決めたのです。

あきらめ方を、設計する

前のレッスンで確かめたとおり、打ち切りは判定ではありません。「10万歩で止まらなかった」は「永遠に止まらない」の証明ではなく、本当は10万1歩めで止まるプログラムを、冤罪で打ち切ることもありえます。

でも、ここからが今日の前進です。判定はできなくても、「10万歩で打ち切って、止まらなかったとみなす」と決めることはできます。 原理が「できない」と言ったのは前者だけで、後者はただの運用——人間が線を引くだけのことだからです。

「みなす」には間違いが混ざります。間違いをゼロにする道は、原理が閉ざしました。それでも、どんな間違い方をどれだけ許すかは、こちらで選べます——線を10万歩に引くか、1000歩に引くか、それを決めるのは定理ではなくあなたです。

この庭の10万歩は、「教材の小さなプログラムなら、まじめに働いていて10万歩かかることはまずない」という見積もりで引いた線です。完璧な答えがないと知ったうえで、間違い方を自分で選ぶ——これが工学という営みです。

暮らしの中の、同じ知恵

この知恵は、計算機の発明ではありません。あなたの暮らしが、先に使っています。

通信のタイムアウト。 メッセージを送って返事がないとき、相手が「答える気がない」のか「まだ考えている」のか、待つ側には原理的に区別がつきません。だからアプリは何秒かで見切りをつけて、「接続できませんでした」と報告します——あれは判定ではなく、あきらめ方の設計です。

フリーズしたアプリの強制終了。 「応答なし」と出たアプリは、本当はあと1秒で復帰するのかもしれません。それでもあなたは終了ボタンを押します。間違うかもしれないと知りながら、待ち続けない方を選んでいるのです。

料理の「弱火で20分」。 鍋の中がどうなっているかは見えないので、時間で区切ります。ただし、このたとえにはひとつ限界があります——鍋はふたを開ければ中が見えますが、計算は「途中」を開けて見ても、終わりが近いのかどうか分からないことがあるのです。

よりみち:燃料に、本物のお金を払う世界

ブロックチェーンの一種・イーサリアムでは、世界中の参加者が他人の書いたプログラムを実行します。止まらないプログラムを実行させられたら、たまりません。そこで採用されたのが燃料方式——計算の1歩ごとに「ガス」と呼ばれる手数料を本物のお金で払わせて、ガスが尽きたら打ち切るのです。あなたの言語の10万歩と、設計はまったく同じです。停止性問題への工学の答えが、お金の流れる仕組みの土台になっています。

もうひとつの「実は」——暴走できないように、作る

種明かしを、もうひとつ。コース3で正規表現の機械を見たとき、「この庭の機械は後戻りをしないので、原理的に暴走しません」という一文がありました。あれも、あきらめ方の設計です。

ただし流儀がちがいます。燃料は、強い言語に走らせてからブレーキをかける方式でした。正規表現は、そもそも暴走という芸当ができないくらい、言語を小さく作る方式です。

小ささには、代金がありました。コース3の終わりに見たとおり、正規表現は「数えられない」——かっこの対応のような仕事には、原理的に届きません。なんでも計算できる力を差し出して、かならず止まる安全を受け取った。能力と安全の交換です。

演習:止まらない機械を、止める

下にいるのは、左右にゆれ続けるだけで、永遠に「おわり」へたどり着かない機械です。再生すると、100歩で打ち切られます。

この実験室は表が書きかえられます。表を直して(行を書きかえるか、書き足して)、「止まりました」の返事を出してください。前のレッスンまでのあなたは打ち切られる側でしたが、今日は止める側です。

いまの状態みぎ
0 歩目
遷移表(この機械のすべて)
状態読む書く動く次の状態この行を消す
ヒント1(考え方)

この機械が止まらないのは、表のどの行をたどっても「おわり」に行き着かないからです。では、どこか1か所を「おわり」につなぎかえたら?

こたえ

いちばん短い直し方は、「みぎ」の行の次の状態を「ひだり」から「おわり」に書きかえることです。1歩で「止まりました」が出ます。「ひだり」の行を直せば2歩——どちらでも、止まれば正解です。

書き足す流儀もあります。「みぎ」の行の書くを「1」に変えて、「みぎ・1を読む→おわり」という行をたしてみてください。機械は1歩めに足あとを残し、一周まわって自分の足あとを踏んだ3歩めに止まります。

どの直し方も、やったことは同じです——止まらないと分かっている機械なら、止まるように直せばいい。判定できないのは「あらゆるプログラム」を相手にしたときの話で、目の前の1台を読んで直すことは、いつでもあなたにできます。

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

  • この庭の実験室は、ぜんぶ燃料計を積んでいる——にわ語もminilangも10万歩で打ち切り、チューリング機械の「◯歩で打ち切りました」も同じ仕掛け
  • 停止性は判定できない(原理)。でも「ここで打ち切って、止まらなかったとみなす」線は引ける(運用)——間違い方を自分で選ぶのが工学
  • 通信のタイムアウトも、アプリの強制終了も、同じ知恵。暮らしが先に使っていた
  • もうひとつの流儀は、暴走できないくらい言語を小さく作ること——正規表現は数えられない代わりに、かならず止まる。能力と安全の交換