Table of Contents

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 крайне рекомендуется запустить тесты и убедиться, что все они выполняются успешно. Если возникают какие-либо проблемы, обратитесь к разработчику.

Пример программы

В качестве примера рассмотрим простую программу на Прологе

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