2013-04-05 3 views
4

Каков наилучший способ справиться с совместимостью между двумя различными интерпретаторами Prolog? Я читал об этом question and its answers, но то, что я ищу, - это методология для решения с разными определенными предикатами (т. Е. Удаление в SWI не является переменным, а под YAP оно есть) и вновь введенными предикатами (т.е. remove_duplicates нет в библиотека (списки) в SWI).Уровень совместимости для различной реализации Prolog

На данный момент я пишу файл, содержащий большинство предикатов redefinitions, но, конечно, это получает один из двух (или более двух) компиляторов, чтобы дать предупреждение для переопределения.

Для удобства использования вы можете предположить, что реализация Prolog, в которой меня интересуют, это SWI и Yap. Тем не менее, как общий, как он может быть, метод будет высоко оценен.

+0

Вы видели это? http://www.swi-prolog.org/pldoc/doc_for?object=section(1,'C',swi('/doc/Manual/dialect.html ')) – 2013-04-05 19:32:22

+0

yep, но он кажется совместимым слоем для * другие * только для SWI. Знаете ли вы, что он сам переносится? – rano

+0

Для меня это выглядит как минимальная структура, которая поддерживает условную компиляцию для SWI и YAP (см. Также «dialect.pl» в документации SWI). В конце концов, мне кажется, что единственным жизнеспособным решением было бы кодирование различий, когда это абсолютно необходимо, и придерживаться «ванильного» Пролога в противном случае. – 2013-04-05 20:17:43

ответ

2

Я думаю, что ISO Prolog должен быть общей ссылкой на подмножество.

Но библиотеки массивный проблема. В самом деле, у меня возникла проблема с отправкой фрагмента SWI-Prolog в YAP.

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

библиотека ассоциативный реализуется по-разному в этих системах, и я не был в состоянии сделать ПЕА версия для работы (если я хорошо помню, gen_assoc ((R, C), GridC, Char) имели различную семантическую). Кроме того, библиотека (совокупность) имела свои проблемы в рамках YAP.

Для conditionally compile среди этих 2-х систем, я попытался

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

но, конечно, я не доволен этим. Надеюсь, ваш вопрос даст некоторый ответ на эту проблему.

+0

Спасибо за обмен. Поддерживается ли условная компиляция и в других интерпретаторах? Кстати, я тоже нашел много различий в библиотеке (ассоциированном) под YAP, и снова решение заключалось в том, чтобы переписать некоторый предикат собой. – rano

+0

GnuProlog поддерживает его. Любая система, имеющая term_expansion, могла бы также работать, я думаю ... – CapelliC

+1

Условная компиляция поддерживается растущим числом компиляторов Prolog, включая ECLiPSe, GNU Prolog, SICStus Prolog, SWI-Prolog, YAP и XSB.Logtalk также поддерживает стандартные директивы условной компиляции. –

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

В конкретном случае «ДООС библиотека» упоминается в одном из ответов на ваш вопрос, Logtalk предоставляет протокол (так называемый интерфейс) «dictionaryp» и две реализации этого протокола: «bintree» и «rbtree».

+1

+1: Я думаю, что Logtalk станет моим следующим языком программирования, но я хочу сначала продолжить/завершить мое текущее участие SWI-Prolog. – CapelliC

+0

Обратите внимание, что здесь нет ни одного. Вы не можете (в настоящее время) запустить Logtalk без бэкэнд-компилятора Prolog; Logtalk + SWI-Prolog делает мощную комбинацию. –

+0

Думаю, я тоже скоро попытаюсь изучить logtalk:) – rano

Смежные вопросы