【问题标题】:Prolog - Avoid Infinite LoopProlog - 避免无限循环
【发布时间】:2015-04-29 09:01:12
【问题描述】:

我目前正在学习逻辑编程,并为此学习Prolog

我们可以有一个Knowledge Base,它可以引导我们到一些results,而Prolog 将进入无限循环,因为它扩展谓词的方式。

假设我们有以下logic program

p(X):- p(X).
p(X):- q(X).
q(X).

查询p(john) 将进入无限循环,因为Prolog 默认扩展第一个统一的谓词。但是,如果我们开始扩展第二个谓词,我们可以得出结论p(john) 为真。

那么,为什么Prolog 不扩展所有匹配的谓词(如带有时间片的线程/进程模型那样实现),以便在KB 可以得出结论的情况下得出结论?

例如,在我们的例子中,可以创建两个进程,一个用 p(X) 扩展,另一个用 q(X) 扩展。所以当我们稍后展开 q(X) 时,我们的程序将结束 q(john)

【问题讨论】:

  • 规则,p(X) :- p(X). 是一个明显的无限递归,它不添加任何逻辑值。它应该被删除。

标签: prolog infinite-loop


【解决方案1】:

因为 Prolog 匹配谓词的搜索算法是depth-first。因此,在您的示例中,一旦匹配第一条规则,它将再次匹配第一条规则,并且永远不会探索其他规则。

如果算法是breadth-firstiterative-deepening,则不会发生这种情况。

通常由您对 KB 重新排序,这样这些情况就不会发生。

但是,可以使用更改搜索顺序的 元解释器 在 Prolog 中对 breadth-first/iterative-deepening 搜索进行编码。这是一种非常强大的技术,在 Prolog 世界之外并不为人所知。 'The Art of Prolog' 详细描述了这种技术。

您可以找到一些元解释器 hereherehere 的示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多