在我最后一个问题下方的评论中详细说明讨论:我正在寻找有关构建 SWI-Prolog 代码的技术或最佳实践的建议,以便能够使用和测试算法及其支持模块的替代、可互换实现。
当前情况可以使用以下虚构的小示例来说明:用户提供一些输入数据 (file data.pl) 并加载具有要应用的算法(file ) 的模块graph.pl。算法模块本身使用来自另一个模块(文件path.pl)的辅助谓词,而后者又需要访问用户提供的数据:
文件“ data.pl”(输入数据集):
:- use_module(graph).
edge(a,b).
edge(b,c).
edge(c,d).
Run Code Online (Sandbox Code Playgroud)
文件“ graph.pl”(算法):
:- module(graph, [reachable/2]).
:- use_module(path).
reachable(X,Y) :-
path(X,Y), !.
reachable(X,Y) :-
path(Y,X), !.
Run Code Online (Sandbox Code Playgroud)
文件“ path.pl”(带有辅助谓词的模块,注意它访问 中的数据user):
:- module(path, [path/2]).
path(X,X).
path(X,Y) :-
user:edge(X,Z),
path(Z,Y).
Run Code Online (Sandbox Code Playgroud)
对于将算法应用于单个输入数据集和算法的单个实现的用例,这完全没问题:
?- [data].
true.
?- reachable(a,a).
true.
?- reachable(a,d).
true.
?- reachable(d,a).
true.
Run Code Online (Sandbox Code Playgroud)
现在假设我有大量的数据集,以及graph和path模块的多个替代实现(具有相同的接口,即导出的谓词)。对于(小)举例的目的,让我们假设我们文件中的数据文件data1.pl,data2.pl,帮手谓语模块path1.pl,path2.pl和算法模块 …