Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File Swi Prolog,卸载源文件_File_Prolog_Swi Prolog - Fatal编程技术网

File Swi Prolog,卸载源文件

File Swi Prolog,卸载源文件,file,prolog,swi-prolog,File,Prolog,Swi Prolog,是否有一个内置的谓词或一种简单的方法可以从prolog的知识数据库中删除已经查阅过的源文件?我已经阅读了参考手册,但没有找到任何可以做到这一点的方法。您可以通过使用源文件/1和源文件/2的以下步骤来完成: unload_last_source:- findall(Source, source_file(Source), LSource), reverse(LSource, [Source|_]), unload_source(Source). unload_source(Sourc

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

您可以通过使用
源文件/1
源文件/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\u last\u source/0
将检索上次查阅的文件名并将其卸载。

查阅文件后,该文件与Prolog变得“无关”。所以我认为一般来说,答案应该是否定的。但是SWI Prolog有一组丰富的内置程序,允许您控制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)'
?-子句(strip_空格(_G297,_G298),X,Y),erase(Y)。
错误:erase/1:不允许子句erase`(0x29acc30)'

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

retractall(fact(_,_)).

仅适用于动态谓词,即使用
assert
设置的谓词,对吗?事实上,它只适用于动态谓词,但它们不必在运行时断言,也可以在源文件中声明。Prolog有几种实现。OP没有提到他正在使用的Prolog系统。此解决方案适用于SWI Prolog。它在大多数其他Prolog编译器中不起作用,这些编译器不提供源文件/1-2内置谓词和/或允许取消静态谓词。依赖于特定Prolog实现的解决方案最好明确地标记为这样。@Paulo Moura:OP将问题标记为特定于SWI Prolog。相反,答案是没有注意到废除在不考虑源文件的情况下是有效的。。。