私のプロジェクトでは、かなり複雑なルールをエンコードするために 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)
メタインタープリターでこれを行うことは可能ですか?