288
9
章 おもちゃの国のプログラミング
もう1つの問題は、「8.1.4 万能システムは永久にループできる」で見たように、十分に強力な
†
言語
で書かれたプログラムは、結果を返さずに永久に実行を続ける可能性があることです。これはプログ
ラムを実行することで確実に調べることを不可能にします。プログラムが無限に動くことが、事前にわ
からない場合があるためです(「8.3 停止性問題」を参照)。そのため、自動チェッカーでプログラムを
実行しても、答えが返らないというリスクがあります。
そして最後に、たとえ取り得る入力データが事前にそろっていて、理由はともかく永久にループする
ことなく最終的に必ず停止するプログラムであっても、プログラムを実行して何が起こるのか調べるに
は、コストが高くついたり、都合が悪い場合があることです。プログラムが完了するまで非常に長い時
間がかかるかもしれませんし、元に戻せない副作用があるかもしれません。たとえば、メールの送
信、送金、ミサイル発射などは、プログラムを実行してテストするのにふさわしくないでしょう。
そのため、プログラムを実際に実行することなく、プログラムに関する情報を見つけられると便利で
す。そのための1つの方法が、抽象解釈(abstract interpretation)です。抽象解釈とは、プログラムを
単純化したものを実行し、その結果を使って元のプログラムの性質を導出する分析テクニックです。
9.1
抽象解釈
抽象解釈とは、直接取り組むには大きすぎたり、複雑すぎたり、わか