Search code examples
prologcompatibilityswi-prologyap

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.


Solution

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