Слой совместимости для разных реализаций Пролога
Какой лучший способ справиться с совместимостью между двумя разными интерпретаторами Пролога? Я прочитал этот вопрос и ответы на него, но мне нужна методология для работы с по-разному определенными предикатами (т. Е. Удаление в SWI не является переменным, в то время как в YAP это так), а недавно введенные предикаты (т. Е. Remove_duplicates - нет). присутствует в библиотеке (списки) в SWI).
В данный момент я пишу файл, содержащий больше всего переопределений предикатов, но, разумеется, один из двух (или более двух) компиляторов выдает предупреждение о переопределении.
Ради простоты вы можете предположить, что реализация Пролога, в которой я заинтересован, это SWI и Yap. Тем не менее, как можно более общий метод будет высоко оценен.
2 ответа
Я думаю, что ISO Prolog должен быть общим подмножеством.
Но библиотеки - огромная проблема. Действительно, я столкнулся с проблемой при попытке портировать фрагмент SWI-Prolog на YAP.
...
:- use_module(library(assoc)).
:- use_module(library(aggregate)).
...
библиотека Assoc реализована по-разному в этих системах, и я не смог заставить работать версию YAP (если я хорошо помню, у gen_assoc((R, C), GridC, Char) была другая семантика). Также у библиотеки (агрегата) были свои проблемы под YAP.
Чтобы условно скомпилировать эти 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).
но, конечно, я не доволен этим. Я надеюсь, что ваш вопрос принесет какой-то ответ на проблему.
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".