解决方法ensure_loaded / 1 GNU Prolog?

时间:2014-06-11 21:18:02

标签: prolog gnu-prolog

是否有一种解决方法可以使ensure_loaded / 1正常工作 在GNU Prolog,因为它在许多其他Prolog系统中工作? 目标是有一个序言,以便其余部分 代码可以使用ensure_loaded / 1独立于是否 我使用的Prolog系统。

我尝试了以下内容:

:- multifile(term_expansion/2).
term_expansion((:- ensure_loaded(X)),
     (:- atom_concat('<base>\\', X, Y),
     include(Y))).

但以下查询无效:

:- ensure_loaded('suite.p').

路径计算本身不是问题的问题, 但是在GNU Prolog中重新定义了一个指令。有 另一个导致问题的指令:meta_predicate / 1。该 字节代码崩溃如下:

GNU Fatal

再见

2 个答案:

答案 0 :(得分:1)

部分解决方案是:

ensure_loaded(File) :-
    absolute_file_name(File, Path),
    (   predicate_property(_, prolog_file(Path)) ->
        true
    ;   consult(Path)
    ).

它假设文件定义了至少一个谓词,但这是一个明智的假设。但是,似乎没有办法覆盖ensure_loaded/1指令的原生的,非功能性的定义。解决方法是将ensure_loaded/1指令包装在initialization/1指令中。例如:

:- initialization(ensure_loaded('suite.pl')).

因此,这是一个部分解决方案,因为我们确实定义了ensure_loaded/1 谓词,而不是指令

答案 1 :(得分:0)

我目前的猜测是,这是不可能的 GNU Prolog 1.4.4的标准发行版。该 文件说:

  

GNU Prolog编译器(第4.4节)自动调用   每个Term1上的expand_term / 2读入。但是,在当前版本中,   只有DCG转换由编译器完成(即   term_expansion / 2不能使用)。要使用term_expansion / 2,它是   必须明确调用expand_term / 2.

我还尝试为term_expansion / 2注入一些Prolog代码 通过命令行,但没有awail。虽然是工具链 具有-O,-L,-A等选项,可将选项传递给其他工具。 没有一个选项可以将Prolog文本传递给 pl2wam,在执行内部发布的咨询/ 1期间 顶级。

至少这是我迄今为止的结果。

再见