====== 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]]