InteLib Prolog — это реализация вычислительной модели Пролога в рамках InteLib.
Исходный код доступен по адресу https://github.com/iley/intelib, его можно получить при помощи git:
git clone git://github.com/iley/intelib.git intelib-prolog
Далее нужно скомпилировать InteLib в обычном порядке
cd intelib-prolog make library
Проект успешно компилируется при помощи gcc и clang (проверено на gcc 4.6 и clang 2.9). Общесистемную установку данной экспериментальной версии InteLib производить не рекомендуется.
Примеры использования находятся в поддиректории prolog/samples, тесты — в test/prolog. Перед использованием InteLib Prolog крайне рекомендуется запустить тесты и убедиться, что все они выполняются успешно. Если возникают какие-либо проблемы, обратитесь к разработчику.
В качестве примера рассмотрим простую программу на Прологе
son(X,Y) :- parent(Y,X), man(X). woman(mary). man(bob). man(john). man(jack). parent(bob, mary). parent(bob, john). parent(bob, jack).
Полная реализация на InteLib Prolog этой же программы может выглядеть следующим образом:
#include <stdio.h> #include <prolog/prolog.hpp> int main() { // определения всех атомов и переменных PlgAtom man("man"), woman("woman"), human("human"), son("son"), parent("parent"); PlgAtom bob("bob"), mary("mary"), john("john"), jack("jack"); PlgVariable X("X"), Y("Y"); // добавляем все правила программы в базу данных son(X, Y) <<= parent(Y, X) & man(X); *woman(mary); *man(bob); *man(john); *man(jack); *parent(bob, mary); *parent(bob, john); *parent(bob, jack); // получаем итератор для вычисления запроса PlgContinuation cont = son(X, bob).Query(); // последовательно запрашиваем все решения while (cont->Next()) { // получаем значение X для данного решения PlgReference result = cont->GetValue(X); // выводим полученное значение на экран printf("%s\n", result->TextRepresentation().c_str()); } return 0; }
Как несложно догадаться, программа на C++, так же как и оригинал на Прологе, выведет два имени: «john» и «jack». Если общесистемная установка InteLib не производилась, при компиляции не забудьте указать компилятору путь к директориям с заголовочными файлами и библиотеками. Например:
g++ -I/home/user/intelib-prolog -L/home/user/intelib-prolog/build/intelib -o example example.cpp -lintelib
Для перевода исходного кода в традиционном синтаксисе Пролога в код на C++ предусмотрен транслятор (файл prolog/library/pl/trans.pro). В данный момент транслятор реализован на SWI-Prolog. Допустим, необходимо программу в файле hello.pro, это можно сделать командой:
swipl -qs trans.pro -t "translate('hello.pro')"
В случае успешной трансляции будут созданы файлы hello.cpp и hello.hpp. Если исходная программа содержит предикат
prolog
, то при трансляции будет сгенерирован код функции main и полученную программу на C++ можно будет
скомпилировать в отдельное приложение.
В качестве демонстрации использования InteLib Prolog в приложении на C++, была написана реализация игры «Реверси», также известной как «Отелло», с простым искусственным интеллектом.
Исходный код программы находится по адресу https://github.com/iley/reversi
Для компиляции необходимы InteLib Prolog, SWI-Prolog, а также библиотеки SDL 1.2 и SDL_gfx. В дистрибутивах GNU/Linux,
основанных на debian, данные библиотеки находятся в пакетах libsdl1.2-dev
и libsdl-gfx1.2-dev
. Перед компиляцией
убедитесь, что в Makefile указаны правильные пути.
Основная часть программы написана на C++, а игровой искусственный интеллект — на Прологе. Используется минимаксный алгоритм с альфа-бета отсечением.
P.S. Все отчёты об ошибках и пожелания отправляйте iley