Я использую Prolog для кодирования некоторых довольно сложных правил в моем проекте. Существует много рекурсии, включая взаимную рекурсию. Часть правил выглядеть примерно так:Работа со сложными пролопными циклами
pred1(X) :- ...
pred1(X) :- someguard(X), pred2(X).
pred2(X) :- ...
pred2(X) :- othercondition(X), pred1(X).
Там довольно очевидно, бесконечный цикл между pred1
и pred2
. К сожалению, взаимодействие между этими предикатами очень сложно и сложно выделить. Я смог исключить бесконечный цикл в этом экземпляре, передав список объектов, которые были переданы в pred1
, но это очень громоздко! Фактически, это в значительной степени побеждает цель использования Prolog в этом приложении.
Как заставить Prolog избежать бесконечных циклов? Например, если в ходе проверки pred1(foo)
он пытается доказать pred1(foo)
в качестве подцеля, ошибки и возврата.
Можно ли это сделать с помощью meta-interpreters?
Спасибо! Тренировка - именно то, что мне нужно. cTI выглядит тоже полезно. –