rano
rano

Reputation: 5666

Compatibility layer for different Prolog implementation

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.

Upvotes: 4

Views: 290

Answers (2)

Paulo Moura
Paulo Moura

Reputation: 18663

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".

Upvotes: 2

CapelliC
CapelliC

Reputation: 60024

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.

Upvotes: 2

Related Questions