【问题标题】:Swi Prolog, unloading source filesSwi Prolog,卸载源文件
【发布时间】:2012-06-13 20:59:50
【问题描述】:

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

【问题讨论】:

    标签: file prolog swi-prolog


    【解决方案1】:

    您可以使用这些使用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 将检索最后查询的文件名并卸载它。

    【讨论】:

    • Prolog 有几种实现。 OP 没有提到他正在使用的 Prolog 系统。该解决方案适用于 SWI-Prolog。它不适用于大多数其他 Prolog 编译器,它们不提供 source_file/1-2 内置谓词和/或允许废除静态谓词。依赖于特定 Prolog 实现的解决方案最好明确标记。
    • @Paulo Moura:OP 将问题标记为特定于 SWI-Prolog。相反,答案没有注意到在不考虑源文件的情况下取消工作......
    【解决方案2】:

    在查阅了一个文件后,它对 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、clause_property 和 erase 应该给予更多控制,但在尝试使用擦除时出现我不理解的错误(未记录):

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

    【讨论】:

      【解决方案3】:

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

      retractall(fact(_,_)).
      

      【讨论】:

      • 只适用于动态谓词,即用assert 设置的谓词,对吧?
      • 确实它只适用于动态谓词,但它们不必在运行时被断言,也可以在源文件中声明。
      【解决方案4】:

      这会起作用。

      unload_file(+File)

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

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 2016-01-16
        • 2018-02-27
        • 2013-04-27
        相关资源
        最近更新 更多