Prologの手続きをコンパイルすると、システムはその手続きのための最適化コードを生成します。(ただし、最適化が抑制されている場合はこれに該当しません。レファレンスマニュアルのifsemの章を参照して下さい。) たとえば選言';'、カット'!'、'asserta'、'retract'を含んでいたとしても、基本的にすべてのPrologの手続きがコンパイルできます。手続きはコンパイル後もそれ以前と全く同様に機能します。
コンパイルされた述語は変更できません(C述語と同様です)。すなわち、それらの定義は、asserta, retract, consult, reconsult, loadなどによって変更できません。従って定義が動的に変わる述語(すなわち、大域的なデータとして使用するもの)は、コンパイルできません。
コンパイルされた述語の修正モードをmodify_mode/4により変更しても無駄です。コンパイルされた述語の定義を変更する唯一の方法は、モジュ−ルをアボリッシュ(abolish)するか、アンロ−ド(unload)し、データベースに述語の新しい定義を挿入することです (consult, assert, loadによって行ないます。)。ただし、モジュールをアンロ−ドすると、このモジュール(すなわちファイル)で定義されたすべての述語は消えてしまいます!
最適化をせずにコンパイルした述語は、インタプリトされる述語と同様修正可能なままです。しかし、コンパイルされた述語の修正モードのデフォルトはoffなので、節レベルの修正をするときにはあらかじめmodify_mode/4を使用して修正モードの変更をしなければなりません。(レファレンスマニュアルのmodify_modeを参照して下さい。)
最適化されたコンパイル済み述語は、listing, trace, debugなどの述語を使って定義を見ることはできません。これらの機能に必要な情報が速度を上げるために捨てられてしまうからです。従ってインタプリタとデバッガを使用しながらソフトウェアを開発するときには、コンパイルはしない方が良いでしょう。正常に作動することがわかってから、コンパイルすることを薦めます。
| 冒頭へ |
|