Интегрировать Пролог в C программу

0

Я хочу написать основную программу в C++, и программа будет динамически генерировать факты для создания базы знаний, тогда программа может вызывать правила, определенные в некоторых файлах .pl и получать результаты. Например, main.c

int main()
{
   //generate facts like 
    // blue(car), red(bike), etc
    // do queries
    PL_call( "consult( 'pred.pl' )" );
    ...
    PL_call(goal_term, NULL);
}

pred.pl

whatisblue(X) :- blue(X).
whatisred(X) :- red(X).

Как мне это сделать?

Я прочитал руководство swi-proog на интерфейсе C, но вижу только, как вызвать модуль C в Prolog или вызвать Prolog в C, я не вижу, как смешивать предикаты, определенные как в C, так и в Prolog. Является ли это возможным? Благодарю.

  • 0
    Что вы подразумеваете под «микс»? Какой основной язык? С ++ как я понимаю. Так что просто вызовите предикаты, которые строят вашу базу данных ( assertz и company), а затем вызовите свою логику.
  • 0
    Основной язык - C ++. Некоторые предикаты (факты) будут созданы в C ++, но правила запросов определены в файле Prolog. И я хочу сделать запрос (вызов пролога) в C ++, основываясь на фактах, созданных в C ++. Вы имеете в виду, когда я создаю факты, я называю встроенный assertz и т. Д.? Поддерживает ли это создание большой базы знаний со многими фактами? Благодарю.
Показать ещё 3 комментария
Теги:
prolog
swi-prolog
ffi

1 ответ

0

Подробный ответ из моих возможностей сейчас, но в целом, ответ на ваш вопрос "да".

Просто в C++ используйте интерфейс C++. Это намного проще, чем C. Так что используйте PlCall, PlTermv и т.д....

Проблема заключается в том, чтобы правильно связать переменные, до и после PlCall (ы), так что вы можете обмениваться значениями с Прологом.

Чтобы облегчить построение структурированных значений, например, взгляните на эти комментарии макросов, predicate0, predicate1,... и structure1, structure2,... или рассмотрите

#define unary(X) PlTerm X; PlCompound X ## _t(#X, X);

что позволяет вводить код

attrs2format_t::const_iterator p = attrs2format.find(k);
if (p == attrs2format.end()) {
    // attributes documented here:
    // http://www.swi-prolog.org/pldoc/doc_for?object=prolog_colour:syntax_colour/2

    unary(colour)
    unary(background)
    unary(bold)
    unary(underline)

    // use unification to match list' elements
    PlTail attrs(attr_list);
    PlTerm attr;
...

Вы можете найти здесь общее замечание об интерфейсе SWI-Prolog

Ещё вопросы

Сообщество Overcoder
Наверх
Меню