6

すでに参照されているソース ファイルをプロローグの知識データベースから削除する組み込みの述語または簡単な方法はありますか? リファレンスマニュアルを調べましたが、それができるものは見つかりませんでした。

4

4 に答える 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) ;
...

廃止はファイル名が機能する必要がないことに注意してください。他のソースファイルからロードされた述語を削除できます。

Clausclause_propertyeraseを使用すると、より詳細に制御できるはずですが、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 に答える