我正在使用 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)
是一个子目标,则失败并回溯。
是否可以使用元解释器来做到这一点?