我想了解为什么与swipl
的交互似乎不一致。为什么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).
,并创下输入:
?- max([0, 1, 2], X).
X = 2 ▮
(该▮
表示光标的位置。)
特别注意,解释器的下一个提示还没有出现。
下面是我输入后屏幕的样子;:
?- max([0, 1, 2], X).
X = 2 ;
false.
?- ▮
现在我终于得到了解释器的提示。
相比之下,下面我给我的屏幕看起来像后,我在提示符下键入max([2, 0, 1], X).
什么,并创下输入:
?- max([2, 0, 1], X).
X = 2.
?- ▮
注意,这一次我得到了解释器的提示马上 - 我做不需要输入;。此外,没有false
。我发现许多其他类似的不一致(例如,有时输出true.
显示在屏幕上,但在其他类似的情况下它不会)。
作为一个初来乍到Prolog的,我觉得这种不一致令人不安的(更不用提沮丧,因为他们不断地提醒我真的不知道发生了什么事情的)。
是否有一种简单的方法来合理化这些不一致?
另外,是否有一些Prolog的实现提供比SWI-Prolog更加一致和可预测的交互?
这与Prolog中的“选择点”有关。在第一个例子中,由于它的顺序是找到与输入相关的解决方案,Prolog在提出解决方案'X = 2'后有一个选择,所以它搜索了更多,但没有找到更多的解决方案。在第二种情况下,确定'X = 2'并且没有选择点。 – lurker