6

是否有内置谓词或一种简单的方法可以从 prolog 的知识数据库中删除已经查阅过的源文件?我浏览了参考手册并没有找到任何可以做到这一点的东西。

4

4 回答 4

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将检索最后查阅的文件名并将其卸载。

于 2012-06-13T21:43:31.007 回答
1

在查阅了一个文件后,它对 Prolog 变得“无关紧要”。所以我认为一般回答应该是no。但是 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) ;
...

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

条款,条款属性擦除应该给予更多的控制,但我在尝试使用擦除时得到一个我不理解的错误(它没有记录):

?- 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 回答
0

这将起作用。

卸载文件(+文件)

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

于 2021-08-04T00:40:47.927 回答