【发布时间】:2017-03-01 01:26:01
【问题描述】:
我想了解为什么与swipl 的交互似乎不一致。
这是一个典型的例子。假设我查阅了包含以下定义的知识库:
acc_max([H|T], A, Max) :- H > A, acc_max(T, H, Max).
acc_max([H|T], A, Max) :- H =< A, acc_max(T, A, Max).
acc_max([], A, A).
max([H|T], Max) :- acc_max(T, H, Max).
下面是我在提示符下键入max([0, 1, 2], X). 并按Enter 后屏幕的样子:
?- max([0, 1, 2], X).
X = 2 ▮
(▮表示光标的位置。)
特别注意,解释器的下一个提示还没有出现。
这是我输入 ; 后屏幕的样子:
?- max([0, 1, 2], X).
X = 2 ;
false.
?- ▮
现在我终于得到了解释器的提示。
相比之下,下面显示了我在提示符下键入max([2, 0, 1], X). 并按Enter 后屏幕的样子:
?- max([2, 0, 1], X).
X = 2.
?- ▮
请注意,这一次我立即得到了解释器的提示 - 我不需要键入 ;。另外,没有false。
我发现了许多其他类似的不一致(例如,有时输出 true. 会显示在屏幕上,但在其他类似情况下却不会)。
作为 Prolog 的新手,我发现这种不一致令人不安(更不用说令人沮丧了,因为它们不断提醒我,我真的不知道发生了什么 )。
有没有一种简单的方法来合理化这些不一致?
或者,是否有一些 Prolog 实现比 SWI-Prolog 提供更一致和可预测的交互?
【问题讨论】:
-
这与 Prolog 中的“选择点”有关。在您的第一个示例中,由于它找到与您的输入相关的解决方案的顺序,Prolog 在呈现解决方案
X = 2后有一个选择点可供探索,因此它搜索了更多但没有找到更多的查询解决方案。在您的第二种情况下,X = 2已确定并且没有选择点。
标签: prolog swi-prolog prolog-toplevel