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