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

Я хочу написать основную программу на 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-прологу по интерфейсу C, но вижу только, как вызвать модуль C в Prolog или вызвать Prolog в C, я не вижу, как смешивать предикаты, определенные как в C, так и в Prolog. Является ли это возможным? Благодарю.

0

Решение

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

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

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

Например, чтобы упростить построение структурированных значений, рассмотрим эти макросы комментарии, предикат0, предикат1, … и структура1, структура2, … или рассмотреть

#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

0

Другие решения


По вопросам рекламы [email protected]