2

私はプロローグにかなり慣れていません。SICStus を使用して、既に調べたファイルに変更を加えると、SICStus は変更を認識しません。唯一の方法は、ウィンドウを閉じて再度開始することです。しかし、ファイルに変更を加えるたびにウィンドウを閉じるのは煩わしいだけでなく、時間を浪費するため、明らかにこれは実用的ではありません。WindowsバージョンのSicstus 4.2.1を使用しています。これまでのところ、consult(file)、reconsult(file)、compile(file) のコマンドを試しましたが、違いはありませんでした。ウィンドウを閉じて開くまで、SICStus は行った変更を単に無視します。

たとえば、述語 test/2 があるとします。次に、それを削除してファイルを保存しました。次に reconsult(file) と入力します。私の期待は、SICStus が行われた変更を認識し、述語が存在しないと言うことでした。しかし、それはあたかも存在するかのように続きます。ウィンドウを閉じて最初からやり直した後でのみ、述語が存在しないと正しく文句を言うでしょう。

奇妙なことに、 reconsult(file) で新しく追加された述語は認識しますが、変更または削除された場合は認識しません。

4

1 に答える 1

2

consult/1reconsult/1、および'.'/2— はすべて、1970 年代に最初に定義された従来のビルトインです1。今日、それらは迅速で汚いコンパイルのためだけです。これらのコンストラクトのセマンティクスは (そして実際には今も) 実装固有であるため、標準化の準備が整ったクリーンなセマンティクスに同意することは不可能でした。そして、あなたはそれらの弱点の1つを指摘しました。はい、一度定義すると、述語を暗黙的に未定義にすることはできません。SICStus の実装固有abolish/2を使用して、述語を削除します。

一般に、ensure_loaded/1代わりに使用してください。これにより、ファイルの変更日が変更されたかどうかがチェックされます。これを使用するより一般的な方法は、次を発行することですmake.。ただし、特定の変更が適切に考慮されていないことに注意してください。私はまだmake.変更されたファイルをリロードするために使用しています。

最もクリーンな方法はモジュールを使用することですが、ここでもインターフェイスの変更が適切に考慮されず、代わりに警告が発行されます。

| ?- use_module(modulefile).
% compiling /home/ulrich/SO/modulefile.pl...
* predicate test/2 imported by user from modulefile is private
* Approximate lines: 1-2, file: '/home/ulrich/SO/modulefile.pl'
%  module modulefile imported into user
% compiled /home/ulrich/SO/modulefile.pl in module modulefile, 0 msec 2768 bytes
yes

1 私が知っている最も古い文書は、1978-09 年の DECsystem-10 Prolog のユーザーズ ガイドです。1978-10 のエラッタ付きバージョンはこちら.

于 2016-11-05T16:47:02.883 に答える