Портирование веб приложения на SWI-Prolog
Портирование веб приложения на SWI-Prolog
Последовательность шагов
1. изменена структра существующего проекта на вижуал прологе
- для каждого файла .pro сделан файл .pre в котором находятся объявление глобальных предикатов, которые экспортируются из соот. .pro
- переписаны места, где в один .pro файл включался другой .pro файл
- удалены неиспользуемые предикаты
- определения предикатов, не являющихся глобальными (не вызываемые из других файлов), перенесены из .pre в .pro
- определения баз данных вынесены в database.pre
2. в каждый .pro файл добавлены директивы препроцессора так, чтобы чтобы из него можно было получить swi-prolog совместимый файл, список глобальных предикатов из .pre перешел в список экспортируемых предикатов для swi пролога
структра .pro файла стала такой:
ifndef iso_prolog --- iso_prolog - макрос, который определяется, если нужно получить код для swi
-- здесь команды для вижуал пролога
include "editor.pre"
include ...
.
predicates
... local predicates definition ..
.
.
clauses
.
elsedef
-- здесь идут определения, для swi пролога - модуль и список экспорта
.
:- module(editor, [
calc/2,
.... список глобальных предикатов....
]).
.
enddef
.
... дальше идет описание предикатов - общее для обох прологов....
3. создан командный файл, который запускает препроцессор для каждого .pro файла и записывает результат в файл с расширением .pl - полученных код может обрабатываться swi прологом
4. созданы библиотеки предикатов на swi прологе для реализации функциональности, которая есть на вижуал прологе, но отсутствует на swi
созданы дополнительные файлы:
vp52_compat.pl - реализация встроенных функций вижуал пролога, которых нет на swi
database.pl - эмуляция работы с базой данных
db.pl - определение баз данных
load.pl - файл, который собирает вместе все модули и определяет стартовый предикат
5. в ходе отладки было внесено много изменений в код на вижуал прологе, из-за таких причин:
- стандарный пролог не допускает пробела между именем предиката и открывающей скобкой.
Пробелы убраны
- swi пролог учитывает регистр переменных, а вижуал пролог - нет. Исправлены места, где имена переменных
были в разных регистрах
- swi пролог переменную которая начинается с подчеркивания считает анонимной - у вижуал пролога анонимная переменная только "_"
Убраны подчеркивания в именах переменных. Также переменные на русском языке названы по другому.
- оператор присваивания в стандартном прологе - "is". Для каждого присваивания в коде с помощью ifdef сделан аналогичный код для swi пролога