代码之家  ›  专栏  ›  技术社区  ›  user6023611

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

  •  0
  • user6023611  · 技术社区  · 10 年前

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

    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 回复  |  直到 10 年前
        1
  •  1
  •   lurker    10 年前

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

    问题在于你的谓语从句:

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

    M 是查询中的变量, 最小值([1,2,3,4,5,6],X)。 这将成为 帐户 min/3 。这个实现也不符合您真正需要使用额外参数来做的事情,即为最小值提供初始候选值。

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

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

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

    推荐文章