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