为什么参数没有充分实例化?
Why Arguments are not sufficiently instantiated?
这是我在列表中查找最小值的实现:
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
我不明白为什么会出现这个错误。你能给我解释一下吗?
当您查询时,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).
在 min/3
的第一个子句中变为 Acc
。此实现也不符合您真正需要使用额外参数执行的操作,即为最小值提供初始候选。
这样做的一个经典方法是使用列表的第一个元素作为最小候选者:
min([H|T], Min) :-
min(T, H, Min).
这也意味着 min([], _)
会失败,这很好,因为空列表没有最小值。
这是我在列表中查找最小值的实现:
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
我不明白为什么会出现这个错误。你能给我解释一下吗?
当您查询时,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).
在 min/3
的第一个子句中变为 Acc
。此实现也不符合您真正需要使用额外参数执行的操作,即为最小值提供初始候选。
这样做的一个经典方法是使用列表的第一个元素作为最小候选者:
min([H|T], Min) :-
min(T, H, Min).
这也意味着 min([], _)
会失败,这很好,因为空列表没有最小值。