有没有办法在ECLiPSe Prolog中使用module / 2?

时间:2014-03-23 15:21:19

标签: prolog eclipse-clp

在SWI-Prolog中,我正在使用诸如开头的代码 模块文本文件:

:- module(foo, [bar/2]).
:- use_module(library(jack)).

我不想更改我的代码。我怎样才能使用它 ECLiPSe Prolog(*)。是否有一些库定义了一个 ECLiPSe Prolog中的module/2指令?

最好的问候

(*) http://eclipseclp.org/

4 个答案:

答案 0 :(得分:2)

您可以使用Logtalk编译使用SWI-Prolog模块系统的Prolog模块,用于ECLiPSe(或任何其他受支持的Prolog编译器,包括那些不提供模块系统的编译器)。

答案 1 :(得分:2)

以下代码定义了一个将module / 2映射到module / 3指令的宏:

:- export macro((:-)/1, translate_directive/2, [top_only]).
translate_directive(
    (:- module(Module, Exports)),
    (:- module(Module, Exports, [swi]))
).

在编译为SWI编写的模块之前编译(或导入)此项。请注意,module / 3的第3个参数必须包含语言模块,对应于您的模块所使用的方言。我在这里使用了swi,其他选项将是{{1} },quintus或ECLiPSe的原生iso

答案 2 :(得分:1)

不,只有module/1module/3

您可以在此处查看所有可用内容的列表:http://eclipseclp.org/doc/bips/fullindex.html

答案 3 :(得分:1)

SWI-Prolog(其他)module/2指令可以通过module/1 + export/1指令在ECLiPSe上替换,如您可能已经发现的那样。 SWI-Prolog和ECLiPSe也支持条件编译指令和dialect标志。这应该为您提供另一种替代方案(未经测试),以便在两个系统中使用相同的Prolog文件:

:- if(current_prolog_flag(dialect, swi)).

    :- module(foo, [p/1]).

:- elif(current_prolog_flag(dialect, eclipse)).

    :- module(foo).
    :- export(p/1).

:- else.

    ...

:- endif.