Обходной путь 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. Байт-код падает следующим образом:
до свидания
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, выпущенного внутри верхнего уровня.
По крайней мере, таковы мои результаты.
до свидания