Обходной путь sure_loaded/1 GNU Prolog?

Есть ли обходной путь, чтобы обеспечить, чтобы sure_loaded/1 работал в GNU Prolog, как это работает во многих других системах Prolog? Цель состоит в том, чтобы иметь преамбулу, чтобы остальная часть кода могла использовать sure_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 ответа

Частичное решение:

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 Предикат, а не директива.

Мои нынешние предположения о том, что это невозможно при стандартном выпуске GNU Prolog 1.4.4. Документ гласит:

Компилятор GNU Prolog (раздел 4.4) автоматически вызывает expand_term/2 при каждом считывании Term1. Однако в текущем выпуске компилятором выполняется только преобразование DCG (т. Е. Term_expansion/2 использовать нельзя). Чтобы использовать term_expansion/2, необходимо явно вызвать expand_term/2.

Я также попытался ввести код Prolog для term_expansion/2 через командную строку, но безуспешно. Хотя в цепочке инструментов есть такие параметры, как -O, -L, -A, которые передают параметры другим инструментам. На самом деле не существует опции, которая передает текст Пролога в pl2wam в ходе выполнения консультанта /1, выпущенного внутри верхнего уровня.

По крайней мере, таковы мои результаты.

до свидания

Другие вопросы по тегам