Если вы примете подход «занесения в таблицу» предыдущих выводов и рассуждений по ним в прямой цепочке для вывода новых выводов, рекурсивная «глубина» не потребуется.
Имейте в виду, что Datalog требует некоторых ограничений на правила и переменные, которые гарантируют конечное завершение и, следовательно, конечное число выводов. Например, переменные должны иметь конечный диапазон возможных значений.
Предположим, ваш пример относится к константам, а не к переменным:
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
Одна проблема заключается в том, что вы хотите, чтобы A/1
была реализована как расширенная хранимая процедура или внешний код. Для этого я бы предложил свести в таблицу все результаты вызова A
по всем возможным аргументам (конечное количество). В конце концов, это одни из выводов (доказуемых утверждений) вашей системы.
Как только это будет сделано, вывод прямой цепочки будет выполняться итеративно, а не рекурсивно. На каждом шаге рассматривайте каждое правило, применяя его с посылками (правыми частями), являющимися ранее полученными (табличными) выводами, если оно приводит к новому заключению. Если ни одно правило не приводит к новому заключению на текущем шаге, остановитесь. Процедура доказательства завершена.
В вашем примере доказательства останавливаются после того, как будут приведены все A
факта, потому что нет достаточных выводов, чтобы применить какое-либо правило для получения новых выводов.
person
hardmath
schedule
05.07.2011