Swi Prolog,卸载源文件

时间:2012-06-13 20:59:51

标签: file prolog swi-prolog

是否有内置的谓词或简单的方法从prolog的知识库中删除已经被查阅过的源文件?我已经阅读了参考手册,但没有找到任何可以做到的事情。

4 个答案:

答案 0 :(得分:4)

您可以使用这些使用source_file/1source_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将检索上次查阅的文件名并将其卸载。

答案 1 :(得分: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) ;
...

请注意,废除不需要文件名工作,您可以删除从其他源文件加载的谓词。

clauseclause_propertyerase应该提供更多控制权,但在尝试使用擦除时,我得到一个我不理解的错误(它没有记录):

?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y).
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)'

答案 2 :(得分:0)

如果您知道谓词的名称,例如fact / 2,则可以使用:

retractall(fact(_,_)).

答案 3 :(得分:0)

这会奏效。

<块引用>

unload_file(+File)

<块引用>

删除从文件加载的所有子句。如果 File 加载了一个模块,清除 模块的导出列表并将其与文件解除关联。文件是一个 规范文件名或对 load_files/2 有效的文件指示符。 应谨慎使用此谓词。多线程的本质 SWI-Prolog 使删除静态代码不安全。尝试这样做 应保留用于开发或应用程序的情况 可以保证与 File 关联的任何子句都不会处于活动状态。