Я разрабатываю механизм логического вывода, это означает, что в основном у меня есть определенное количество «фактов», которые в основном представляют мир в определенный момент. Вместе с фактами (которых обычно только два, начальное состояние и целевое состояние) у меня есть много правил (буквально сотни для определенных проблем). Цель механизма логического вывода - с учетом начального состояния и набора правил найти кратчайший путь к одному из приемлемых целевых состояний. Это можно сделать с помощью нескольких алгоритмов, таких как DFS, BFS или A *. Основная структура программы:
fact factname
attribute1 = "value";
attribute2 = [ 1, 2, 3];
attribute3 = 4;
attribute4 = 7;
...
endFact
rule ruleOne
equalsto(attribute, "value") or
greaterthan(attribute, 5)
>
remove(attribute);
endRule
rule ruleTwo
isprimeinteger(attribute)
>
add(attribute, 1)
endRule
В правиле LHS (часть перед>) соответствует каждому атрибуту в факте factname
, который равен «значению». В этом случае это только один, но может быть много.
Это означает, что мне нужно разрешить переменные (часто несколько раз для одного и того же факта), и в LHS правила могут быть введены несколько условий и / или с правильным анализом приоритета.
Проблема в том, есть ли способ разрешить переменные такого типа эффективно ? Что я делаю сейчас, так это перебираю каждый атрибут в факте, и в основном я генерирую довольно большое n-арное дерево, которое даже не сбалансировано, и это ОЧЕНЬ медленно, особенно с учетом вышеуказанных условий.
Я бы хотел, чтобы указатели на документы соответствовали этому шаблону