0

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

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   

我不明白为什么会发生这个错误。你能给我解释一下吗?

4

1 回答 1

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([], _)将失败,这很好,因为空列表没有最小值。

于 2016-05-14T13:45:58.120 回答