为什么参数没有充分实例化?

时间:2016-05-14 13:17:42

标签: prolog instantiation-error

这是我在列表中找到最小值的实现:

min(L, M) :- min(L, M, M).
min([], M, M).
min([Head|Tail], Acc, M) :- NewAcc is min(Acc, Head), min(Tail, NewAcc, M). 

min([1,2,3,4,5,6], 1).
true.

min([1,2,3,4,5,6], 2).
false.

min([1,2,3,4,5,6], X).
 is/2: Arguments are not sufficiently instantiated   

我无法理解为什么会发生此错误。你能解释一下吗?

1 个答案:

答案 0 :(得分:1)

当您查询min([1,2,3,4,5,6], X).时,您很快就会NewAcc is min(Acc, Head) Acc没有值(未实例化)。 is/2要求绑定表达式中的所有变量,以便它可以计算表达式。

问题在于你的谓词条款:

min(L, M) :- min(L, M, M).

M是查询中的变量min([1,2,3,4,5,6], X).,在Acc的第一个子句中变为min/3。这个实现也与你真正需要做的额外参数不匹配,这是为了提供最小的初始候选者。

这样做的一种经典方法是使用列表的第一个元素作为最小候选者:

min([H|T], Min) :-
    min(T, H, Min).

这也意味着min([], _)会失败,这很好,因为空列表没有最小值。