Код - это Данные, а Данные - это Код. У вас есть рабочий код - вам просто нужно представить его на C ++ таким образом, чтобы он мог компилироваться, затем вы можете реализовать минимальный интерпретатор для его оценки.
Одна из возможностей - взять ваши правила Пролога и перевести их самым прямым способом в структуру данных. Может быть, вы могли бы разработать простой стол, как:
struct {
State coming_from;
Event event;
void (*func)(some, args);
State going_to;
} rules[] = {
{ WANDERING_AROUND, HEAR_SOUND, look_around, ENEMY_SEEN },
{ ENEMY_SEEN, GUN_LOADED, fire_gun, SNEEK_AWAY },
{ next, rule, goes, here },
etc...
}
Аналогичным образом, вызовы функций могут заполнять структуры данных таким образом, чтобы он выглядел аналогично вашему исходному Прологу:
void init_rules () {
rule("Parent", "Bill", "John");
rule("Parent", "Paul", "Bill");
// 99 more rules go here...
}
Затем вы реализуете простой интерпретатор для обхода этой структуры данных и поиска ответов, которые вам нужны. При менее чем 1000 правилах подход с использованием грубой силы при поиске, вероятно, будет достаточно быстрым, но вы всегда можете стать умнее позже и попытаться сделать то же, что и в реальной среде Prolog, когда придет время.