【问题标题】:Dealing with complicated prolog loops处理复杂的序言循环
【发布时间】:2015-11-06 15:52:08
【问题描述】:

我正在使用 Prolog 在我的项目中编码一些相当复杂的规则。有很多递归,包括相互递归。部分规则如下所示:

pred1(X) :- ...
pred1(X) :- someguard(X), pred2(X).

pred2(X) :- ...
pred2(X) :- othercondition(X), pred1(X).

pred1pred2 之间存在相当明显的无限循环。不幸的是,这些谓词之间的交互非常复杂且难以隔离。我可以通过传递已传递给pred1 的对象列表来消除此实例中的无限循环,但这非常笨拙!事实上,它在很大程度上违背了在这个应用程序中使用 Prolog 的目的。

如何让 Prolog 避免无限循环?例如,如果在证明pred1(foo) 的过程中,它试图将pred1(foo) 证明为子目标,则失败并回溯。

meta-interpreters 可以做到这一点吗?

【问题讨论】:

    标签: prolog prolog-metainterpreter


    【解决方案1】:

    是的,正如 mat 建议的那样,您可以为此目的使用元解释器。但是对于正常的用例,这远远超出了常规的工作量。

    您可能会考虑使用高阶谓词将循环功能与实际逻辑分开。这是一种非常安全的方法——SWI 甚至会检查所有用途是否都有相应的定义。键入 make.check. 时会调用此检查

    例如,考虑closure0/3path/4,它们都处理“一劳永逸”的循环检查。

    【讨论】:

      【解决方案2】:

      在某些 Prolog 系统中提供的一个可以帮助您解决此类问题的功能称为 tableing。例如,请参阅 related question

      如果表格不可用,那么是的,元解释器肯定可以在这方面提供很多帮助。例如,您可以使用元解释器更改执行策略等。

      在 SWI-Prolog 中,还可以查看 call_with_inference_limit/3 以稳健地限制执行,与 CPU 类型和系统负载无关。

      相关且有用的是终止分析器,例如cTI:它们允许您静态导出终止条件

      【讨论】:

      • 谢谢!制表正是我所需要的。 cTI 看起来也很有用。
      猜你喜欢
      • 2019-03-14
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多