Обходной путь sure_loaded/1 B-Пролог?
Есть ли обходной путь, чтобы обеспечитьозаборник sure_loaded/1 в B-Prolog, как это работает во многих других системах Prolog? Цель состоит в том, чтобы иметь преамбулу, чтобы остальная часть кода могла использовать sure_loaded/1 независимо от того, какую систему Prolog я использую.
- Кажется, что он не разрешает относительный путь к текущему файлу, как это делают многие системы Prolog.
- Кажется, что он не допускает текст на Прологе, но ожидает некоторый байт-код, который заставит меня скомпилировать материал.
Поэтому я попробовал следующее:
:- set_prolog_flag(redefine_builtin, on).
ensure_loaded(X) :-
atom_concat('<base>\\',X,Y),
consult(Y).
:- set_prolog_flag(redefine_builtin, off).
Но когда к тексту Пролога со следующей директивой обращаются, я не буду работать:
:- ensure_loaded('suite.p').
Это все еще не находит suite.p.
Что я мог сделать?
до свидания
2 ответа
Что касается расширения путей, в файле адаптера Logtalk для B-Prolog я (должен) использовать:
% '$lgt_expand_path'(+nonvar, -atom)
%
% expands a file path to a full path
'$lgt_expand_path'(Path, ExpandedPath) :-
% first expand any environment variable
expand_environment(Path, ExpandedPath0),
( ( sub_atom(ExpandedPath0, 0, 1, _, '/')
% assume POSIX full path
; sub_atom(ExpandedPath0, 1, 1, _, ':')
% assume Windows full Path starting with a drive letter followed by ":"
) ->
% assume full path
ExpandedPath = ExpandedPath0
; % assume path relative to the current directory
working_directory(Current),
atom_concat(Current, '/', Directory),
atom_concat(Directory, ExpandedPath0, ExpandedPath)
).
По сути, это хак (который можно улучшить, например, попытавшись сначала найти, в какой ОС вы работаете) за отсутствующую функциональность, которая должна предоставляться самим B-Prolog.
Я мог только прийти к следующему анализу и обходному пути.
Set_prolog_flag(redefine_builtin, on) не работает внутри текста Prolog для B-Prolog. Я получил:
B-Prolog Version 8.1
?- consult('<base>\\bprolog.p').
consulting::<base>\bprolog.p
** Error : Trying to redefine built-
in:'<base>\\bprolog.p',18::ensure_loaded/1
*** error(file_not_found,suite.p)
Когда я делаю set_prolog_flag(redefine_builtin, on) на верхнем уровне, все в порядке:
?- set_prolog_flag(redefine_builtin, on).
?- consult('<base>\\bprolog.p').
consulting::<base>\bprolog.p
consulting::<base>\suite.p
Etc..
до свидания