Обходной путь 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.. 

до свидания

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