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