5

私のプロジェクトでは、かなり複雑なルールをエンコードするために 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)

メタインタープリターでこれを行うことは可能ですか?

4

2 に答える 2