1

是否有一种解决方法可以使 ensure_loaded/1 在 B-Prolog 中像在许多其他 Prolog 系统中一样工作?目标是有一个序言,以便其余代码可以使用 ensure_loaded/1 而与我使用的 Prolog 系统无关。

  • 似乎它不像许多 Prolog 系统那样解析当前查询文件的相对路径。
  • 似乎它不允许 Prolog 文本,但需要一些字节码,这将迫使我编译东西。

所以我尝试了以下方法:

:- set_prolog_flag(redefine_builtin, on).
ensure_loaded(X) :-
    atom_concat('<base>\\',X,Y),
    consult(Y).
:- set_prolog_flag(redefine_builtin, off).

但是,当咨询带有以下指令的 Prolog 文本时,我将无法工作:

:- ensure_loaded('suite.p').

它仍然没有找到suite.p。

我能做什么?

再见

4

2 回答 2

1

关于路径的扩展,在 B-Prolog I 的 Logtalk 适配器文件中(必须)使用:

% '$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)
    ).

它基本上是一个 hack(可以通过例如尝试首先找到您正在运行的操作系统来改进),因为它缺少 B-Prolog 本身应该提供的功能。

于 2014-06-11T17:14:56.720 回答
0

我只能得出以下分析和解决方法。

set_prolog_flag(redefine_builtin, on) 在 B-Prolog 的 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.. 

再见

于 2014-06-11T21:08:59.453 回答