Есть ли способ использовать модуль /2 в ECLiPSe Prolog?

В SWI-Prolog я использую код, такой как в начале текстового файла модуля:

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

Я не хочу менять свой код. Как я могу использовать ECLiPSe Prolog (*). Есть ли библиотека, которая определяет module/2 директива в эклипсе пролог?

С уважением

(*) http://eclipseclp.org/

4 ответа

Решение

Следующий код определяет макрос, который отображает module/2 в директивы module/3:

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

Скомпилируйте (или импортируйте) это перед компиляцией модуля, написанного для SWI. Обратите внимание, что третий аргумент module/3 должен содержать языковой модуль, соответствующий диалекту, на котором написан ваш модуль. Я использовал swi здесь, другие варианты будут quintus, iso или ECLiPSe родной eclipse_language,

Вы можете скомпилировать модуль Prolog, который использует систему модулей SWI-Prolog, используя Logtalk для использования с ECLiPSe (или любым другим из поддерживаемых компиляторов Prolog, включая те, которые не предоставляют систему модулей).

Нет, есть только module/1 а также module/3,

Вы можете увидеть список всего, что доступно здесь: http://eclipseclp.org/doc/bips/fullindex.html

SWI-Пролог (другие) module/2 директивы могут быть заменены на ECLiPSe module/1 + export/1 директивы, как вы, вероятно, уже узнали. Также 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.
Другие вопросы по тегам