Ed *_*Man 5 prolog prolog-metainterpreter
我正在使用 Prolog 在我的一个项目中编码一些相当复杂的规则。有很多递归,包括相互递归。部分规则如下所示:
pred1(X) :- ...
pred1(X) :- someguard(X), pred2(X).
pred2(X) :- ...
pred2(X) :- othercondition(X), pred1(X).
Run Code Online (Sandbox Code Playgroud)
pred1和之间有一个相当明显的无限循环pred2。不幸的是,这些谓词之间的交互非常复杂且难以隔离。我能够通过传递已传递给 的对象列表来消除此实例中的无限循环pred1,但这非常笨拙!事实上,它在很大程度上违背了在这个应用程序中使用 Prolog 的目的。
如何让 Prolog 避免无限循环?例如,如果在证明过程中pred1(foo)尝试将证明pred1(foo)作为子目标,则失败并回溯。
是否可以使用元解释器来做到这一点?
某些 Prolog 系统中提供的一项功能可以帮助您解决此类问题,称为制表。例如,请参阅相关问题和prolog-tabling。
如果表格不可用,那么是的,元解释器绝对可以在这方面提供很大帮助。例如,您可以使用元解释器更改执行策略等。
在 SWI-Prolog 中,还应检查call_with_inference_limit/3以稳健地限制执行,而与 CPU 类型和系统负载无关。
相关且同样有用的是cTI等终止分析器:它们允许您静态导出终止条件。
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |