すでに参照されているソース ファイルをプロローグの知識データベースから削除する組み込みの述語または簡単な方法はありますか? リファレンスマニュアルを調べましたが、それができるものは見つかりませんでした。
質問する
2289 次
4 に答える
4
source_file/1
とを使用する次の手順で実行できますsource_file/2
。
unload_last_source:-
findall(Source, source_file(Source), LSource),
reverse(LSource, [Source|_]),
unload_source(Source).
unload_source(Source):-
ground(Source),
source_file(Pred, Source),
functor(Pred, Functor, Arity),
abolish(Functor/Arity),
fail.
unload_source(_).
unload_source/1
入力ソースファイル名によって定義されたすべての述語を廃止します。絶対パスである必要があることに注意してください。
unload_last_source/0
最後に調べたファイル名を取得してアンロードします。
于 2012-06-13T21:43:31.007 に答える
1
ファイルが参照された後、それはPrologとは「無関係」になります。ですから、一般的に答えるのはノーであるべきだと思います。しかし、SWI-Prologには、プロローグラムを制御できる豊富な組み込みセットがあります。例えば
?- [stackoverflow].
?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')).
P = yield(_G297, _G298) ;
P = now _G297 ;
P = x(_G297) ;
...
?- abolish(yield/2).
true.
?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')).
P = now _G297 ;
P = x(_G297) ;
...
廃止はファイル名が機能する必要がないことに注意してください。他のソースファイルからロードされた述語を削除できます。
Claus、clause_property、eraseを使用すると、より詳細に制御できるはずですが、eraseを使用しようとすると、理解できない(文書化されていない)エラーが発生します。
?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y).
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)'
于 2012-06-13T21:51:01.267 に答える
0
述語の名前 (fact/2 など) がわかっている場合は、次を使用できます。
retractall(fact(_,_)).
于 2012-06-13T22:24:13.743 に答える