====== InteLib Prolog ======
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 крайне рекомендуется запустить тесты и убедиться, что
все они выполняются успешно. Если возникают какие-либо проблемы, обратитесь к [[people:iley|разработчику]].
===== Пример программы =====
В качестве примера рассмотрим простую программу на Прологе
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
#include
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). В данный момент транслятор реализован на [[http://www.swi-prolog.org/|SWI-Prolog]].
Допустим, необходимо программу в файле hello.pro, это можно сделать командой:
swipl -qs trans.pro -t "translate('hello.pro')"
В случае успешной трансляции будут созданы файлы hello.cpp и hello.hpp. Если исходная программа содержит предикат
''prolog'', то при трансляции будет сгенерирован код функции main и полученную программу на C++ можно будет
скомпилировать в отдельное приложение.
===== Демонстрационная программа =====
[[http://dl.dropbox.com/u/3576101/reversi1.png|{{ http://dl.dropbox.com/u/3576101/reversi1_small.png|Скриншот игрового процесса}}]]
В качестве демонстрации использования InteLib Prolog в приложении на C++, была написана реализация игры
[[http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81%D0%B8|«Реверси»]], также известной как «Отелло»,
с простым искусственным интеллектом.
Исходный код программы находится по адресу 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. Все отчёты об ошибках и пожелания отправляйте [[people:iley]]