Compatibility layer for different Prolog implementation

292 Views Asked by At

Which is the best way to handle the compatibility between two different Prolog interpreters? I've read this question and its answers but what I'm looking for is a methodology for coping with differently defined predicates (ie delete in SWI is not variable wise, while under YAP it is) and newly introduced predicates (ie remove_duplicates is not present in library(lists) in SWI).

At the moment I'm writing a file containing most of all predicates redefinitions but of course this gets one of the two (or more than two) compilers to yield a Warning for redefinition.

For the sake of semplicity you can assume that the Prolog implementation I'm interested in are SWI and Yap. Nevertheless a as general as it can be method would be highly appreciated.

2

There are 2 best solutions below

3
On BEST ANSWER

I think that ISO Prolog should be the common subset reference.

But libraries are a massive problem. Indeed, I experienced an issue attempting to port a SWI-Prolog snippet to YAP.

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

assoc library is implemented differently in these systems, and I was not able to make YAP version to work (If I remember well, gen_assoc((R, C), GridC, Char) had different semantic). Also, library(aggregate) had its problems under YAP.

To conditionally compile among these 2 systems, I attempted

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

but of course I'm not satisfied with this. I hope your question will bring some answer to the problem.

2
On

Logtalk provides a compatibility layer with portable libraries supporting B-Prolog, CxProlog, ECLiPSe, GNU Prolog, Lean Prolog, Qu-Prolog, SICStus Prolog, SWI-Prolog, XSB, and YAP. Documentation on its libraries can be found at:

http://logtalk.org/library/index.html

http://logtalk.org/library/library_diagram.pdf

In the specific case of the "assoc" library mentioned in one of the replies to your question, Logtalk provides a protocol (aka interface) "dictionaryp" and two implementations of this protocol, "bintree" and "rbtree".