4

处理两种不同 Prolog 解释器之间兼容性的最佳方法是什么?我已经阅读了这个问题及其答案,但我正在寻找一种方法来处理不同定义的谓词(即在 SWI 中删除不是变量明智的,而在 YAP 下它是)和新引入的谓词(即 remove_duplicates 不是存在于 SWI 的库(列表)中)。

目前我正在编写一个包含大多数谓词重定义的文件,但当然这会让两个(或两个以上)编译器之一产生重定义警告。

为了简洁起见,您可以假设我感兴趣的 Prolog 实现是 SWI 和 Yap。尽管如此,一个尽可能通用的方法将受到高度赞赏。

4

2 回答 2

2

我认为 ISO Prolog 应该是通用的子集参考。

但是图书馆是一个问题。事实上,我在尝试将 SWI-Prolog 片段移植到 YAP 时遇到了问题。

...
:- use_module(library(assoc)).
:- use_module(library(aggregate)).
...

assoc 库在这些系统中的实现方式不同,我无法让 YAP 版本工作(如果我没记错的话, gen_assoc((R, C), GridC, Char) 有不同的语义)。此外,库(聚合)在 YAP 下也存在问题。

为了有条件地在这两个系统中编译,我尝试了

/*  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).

但当然我对此并不满意。我希望你的问题能给问题带来一些答案。

于 2013-04-05T20:13:39.217 回答
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”。

于 2013-04-06T08:28:18.787 回答