是否有一种解决方法可以使ensure_loaded / 1正常工作 在B-Prolog,因为它在许多其他Prolog系统中工作? 目标是有一个序言,以便其余的代码 可以使用ensure_loaded / 1独立于是否 我使用的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。
我该怎么办?
再见
答案 0 :(得分:0)
关于路径的扩展,在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)
).
它基本上是一个黑客攻击(可以通过例如尝试首先找到你正在运行的操作系统)来改进B-Prolog本身应该提供的缺失功能。
答案 1 :(得分: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..
再见