【发布时间】: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