代码之家  ›  专栏  ›  技术社区  ›  rano

不同Prolog实现的兼容性层

  •  4
  • rano  · 技术社区  · 13 年前

    处理两个不同Prolog解释器之间兼容性的最佳方法是什么? 我读过这个 question and its answers 但我正在寻找一种方法来处理不同定义的谓词(即,SWI中的delete不是可变的,而在YAP中是可变的)和新引入的谓词(例如,SWI的库(列表)中不存在remove_duplicates)。

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

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   CapelliC    13 年前

    我认为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).
    

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

        2
  •  2
  •   Paulo Moura    13 年前

    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”。