哪个是处理两个不同Prolog解释器之间兼容性的最佳方法? 我已经阅读了这个question and its answers,但我正在寻找的是一种处理不同定义的谓词的方法(即SWI中的删除不是变量明智的,而在YAP下是删除的)和新引入的谓词(即remove_duplicates是不存在于SWI中的库(列表)中。
目前我正在编写一个包含大部分谓词 redefinitions 的文件,但当然这会得到两个(或两个以上)编译器中的一个,以产生重新定义的警告。
为了简单起见,您可以假设我感兴趣的Prolog实现是SWI和Yap。尽管如此,我们仍然非常赞赏这种方法。
答案 0 :(得分:2)
我认为ISO Prolog应该是常见的子集参考。
但是库是大量的问题。实际上,我在尝试将SWI-Prolog片段移植到YAP时遇到了一个问题。
...
:- use_module(library(assoc)).
:- use_module(library(aggregate)).
...
在这些系统中,assoc库的实现方式不同,我无法使YAP版本工作(如果我记得很清楚,gen_assoc((R,C),GridC,Char)有不同的语义)。此外,图书馆(聚合)在YAP下也存在问题。
对于这两个系统中的conditionally compile,我尝试了
/* File: prolog_impl.pl
Author: Carlo,,,
Created: Jan 26 2013
Purpose: handle SWI/YAP portability issue
*/
:- module(prolog_impl, [swi/0, yap/0, prolog_impl/1]).
swi :- prolog_impl(swi).
yap :- prolog_impl(yap).
prolog_impl(K) :-
F =.. [K,_,_,_,_],
current_prolog_flag(version_data, F).
但当然我对此并不满意。我希望你的问题能为这个问题带来一些答案。
答案 1 :(得分:2)
Logtalk提供了兼容层,其中包含支持B-Prolog,CxProlog,ECLiPSe,GNU Prolog,Lean Prolog,Qu-Prolog,SICStus Prolog,SWI-Prolog,XSB和YAP的可移植库。有关其库的文档可在以下网址找到:
http://logtalk.org/library/index.html
http://logtalk.org/library/library_diagram.pdf
在你的问题的一个回复中提到的“assoc”库的特定情况下,Logtalk提供了一个协议(又名接口)“dictionaryp”和该协议的两个实现,“bintree”和“rbtree”。 / p>