是否有一种解决方法可以使ensure_loaded / 1正常工作 在GNU Prolog,因为它在许多其他Prolog系统中工作? 目标是有一个序言,以便其余部分 代码可以使用ensure_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。该 字节代码崩溃如下:
再见
答案 0 :(得分:1)
部分解决方案是:
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
谓词,而不是指令。
答案 1 :(得分:0)
我目前的猜测是,这是不可能的 GNU Prolog 1.4.4的标准发行版。该 文件说:
GNU Prolog编译器(第4.4节)自动调用 每个Term1上的expand_term / 2读入。但是,在当前版本中, 只有DCG转换由编译器完成(即 term_expansion / 2不能使用)。要使用term_expansion / 2,它是 必须明确调用expand_term / 2.
我还尝试为term_expansion / 2注入一些Prolog代码 通过命令行,但没有awail。虽然是工具链 具有-O,-L,-A等选项,可将选项传递给其他工具。 没有一个选项可以将Prolog文本传递给 pl2wam,在执行内部发布的咨询/ 1期间 顶级。
至少这是我迄今为止的结果。
再见