2012-06-13 80 views

回答

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

有几种Prolog的实现。 OP没有提到他正在使用的Prolog系统。该解决方案适用于SWI-Prolog。它不适用于大多数其他Prolog编译器,它们不提供source_file/1-2内置谓词和/或允许取消静态谓词。依赖于特定Prolog实现的解决方案最好明确地标记为这样。 –

+0

@Paulo Moura:OP将问题标记为SWI-Prolog特定的问题。答案却没有注意到废除作品时没有记录源文件... – CapelliC

1

在查阅了一个文件后,它与Prolog变得“无关紧要”。所以我认为一般回答应该是没有。但是SWI-Prolog有一套丰富的内置函数,可以让你控制你的prolgram。例如

?- [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)' 
0

,例如fact/2,你可以使用:

retractall(fact(_,_)). 
+0

仅适用于动态谓词,即使用'assert'设置的动作谓词,对吗? –

+0

事实上,它只适用于动态谓词,但它们不必在运行时断言,也可以在源文件中声明。 – Ihmahr