【问题标题】:How to export dynamically created predicate?如何导出动态创建的谓词?
【发布时间】:2014-04-27 05:20:31
【问题描述】:

考虑以下代码:

:- module(my_export, [create/2]).

create(Predicate, Id) :-
    assertz(Predicate),
    export(Id).

假设谓词和标识符匹配,我希望新断言的谓词在模块外可用。但是,我得到了这个输出:

?- create(c(A,B) :- A > B, c/2).
true.

?- c(1,2).
Correct to: "my_export:c(1,2)"? 

为什么没有导出谓词?这样做的正确方法是什么?

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    您必须使用use_module/1 导入模块。

    例如,如果这是sample_module.pl

    :- module(my_export, [create/2]).
    
    create(Predicate, Id) :-
        assertz(Predicate),
        export(Id).
    

    那么这个输入输出为真(仔细观察是怎么回事):

    ?- create(tmp(A,B) :- A > B, tmp/2).
    ERROR: toplevel: Undefined procedure: create/2 (DWIM could not correct goal)
    
    ?- consult('c:\\Prolog\\pl\\bin\\sample_module.pl').
    % c:\Prolog\pl\bin\sample_module.pl compiled into my_export 0.00 sec, 2 clauses
    true.
    
    ?- create(tmp(A,B) :- A > B, tmp/2).
    true.
    
    ?- tmp(1,2).
    Correct to: "my_export:tmp(1,2)"? yes
    false.
    
    ?- use_module('c:\\Prolog\\pl\\bin\\sample_module.pl').
    true.
    
    ?- tmp(1,2).
    false.
    
    ?- tmp(5,4).
    true.
    

    现在,当您在 SWI-Prolog 中“编译缓冲区”时,真正发生的是 consult/1。您需要手动导入模块。

    【讨论】:

      【解决方案2】:

      正如 Grzegorz 解释的那样,只要模块最初是导入的,您的代码就可以按原样工作。例如:

      ?- [user].
      :- module(my_export, [create/2]).
      |: 
      |: create(Predicate, Id) :-
      |:     assertz(Predicate),
      |:     export(Id).
      |: % user://1 compiled into my_export 0.00 sec, 2 clauses
      true.
      
      ?- module_property(my_export, P).
      P = class(user) ;
      P = file('user://1') ;
      P = line_count(10) ;
      P = exports([create/2]) ;
      false.
      
      ?- my_export:create(c(A,B) :- A > B, c/2).
      true.
      
      ?- module_property(my_export, P).
      P = class(user) ;
      P = file('user://1') ;
      P = line_count(10) ;
      P = exports([c/2, create/2]) ;
      false.
      
      ?- create(tmp(A,B) :- A > B, tmp/2).
      true.
      
      ?- module_property(my_export, P).
      P = class(user) ;
      P = file('user://1') ;
      P = line_count(10) ;
      P = exports([tmp/2, c/2, create/2]) ;
      false.
      

      但是请注意,export/1 通常是指令,而不是谓词。支持模块系统的其他 Prolog 方言可能存在可移植性问题。

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多