Встраивание логического движка Prolog в Linux g++ в C++

У меня есть некоторая логика в программе на C++, которая не только безумно сложна, но и требует множества решений, для которых Prolog идеален. Это похоже на сценарий конфигурации брандмауэра, проверяющий ввод для действий, но иногда требуется более одного действия.

Я хочу что-то вроде этого:

class PrologEngine
{
    LoadLogic(const char* filename) throw PrologException; // Load a file of prolog rules, predicates facts etc in textual format. Must be callable multiple times to load AND COMPILE (for speed) prolog rule files.

    std::vector<std::string> Evaluate(const char* predicate_in_string_form = "execute(input, Result)") throw PrologException; Returns a vector of matching predicates in text form.

};

Ему не нужна возможность обратного вызова в C++.

AMI Prolog, кажется, понимает это, но он недоступен в Linux. Я пытаюсь использовать SWI-Prolog и могу найти только 2 примера и невероятно византийский API (мое мнение)

Может ли кто-нибудь указать мне пример, который близок к тому, что я ищу?


person Walt Howard    schedule 15.02.2012    source источник
comment
В этом сообщении блога есть небольшой пример того, что вы хотите сделать с swi-prolog: electricbacon.wordpress.com/2010/09/08/   -  person HaskellElephant    schedule 15.02.2012
comment
Почему бы не использовать CLIPS вместо пролога? clipsrules.sourceforge.net/WhatIsCLIPS.html   -  person devil    schedule 03.12.2012


Ответы (2)


Существует интерфейс C++ для SWI-Prolog, это высокий уровень.

Я борюсь с этим, вот пример перехода к OpenGL:

PREDICATE(glEvalCoord1d, 1) {
 double u = A1;
 glEvalCoord1d( u );
 return TRUE;
}

Этот чистый код скрывает много «византийства», используя неявное преобразование типов и некоторые макросы. Интерфейс хорошо продуман и двунаправлен: для вызова Prolog из C++ есть PlCall («выполнить» запрос, аналогичный Evaluate, который вы предоставляете в ответе) или более структурированный PlQuery для нескольких результатов...

Если вам не нужна ссылка на openGl или вы можете подождать, чтобы услышать ответ, который, надеюсь, я получу из списка рассылки SWI-Prolog, вы должны оценить его.

person CapelliC    schedule 15.02.2012

Если вы не против переписать код пролога для использования в собственной библиотеке заголовков C++, я бы посмотрел на библиотеку castor: http://www.mpprogramming.com/cpp/

person shuttle87    schedule 15.02.2012
comment
Кастор, это интересно. Вы пробовали это? Я боюсь, что это может быть довольно неэффективно. - person CapelliC; 15.02.2012
comment
Я понял. Это очень приятно, когда вы это понимаете. Написать предикат на C++ тоже несложно. Вот в чем суть. - person Walt Howard; 28.02.2012