prolog avg of list

时间:2012-10-06 02:06:52

标签: prolog

我有能够计算列表平均值的代码,但唯一的问题是它是空列表时有错误。我想在列表为空时返回false。任何提示?

avg( List, Avg ):- 
    sum( List, Sum ),
    length( List, Length), 
    Avg is Sum / Length.

3 个答案:

答案 0 :(得分:3)

只需添加列表不为空的条件,例如:

average( List, Average ):- 
    sum( List, Sum ),
    length( List, Length ),
    Length > 0, 
    Average is Sum / Length.

这将导致谓词失败,这是合适的,因为平均值是未定义的。

答案 1 :(得分:2)

当然,通常不允许除以零。如果(按照惯例)0个元素的平均值可以是0,则可能的校正将是

avg( List, Avg ):- 
    sum( List, Sum ),
    length( List, Length), 
    (  Length > 0
    -> Avg is Sum / Length
    ;  Avg is 0
    ).

编辑我在SWI-Prolog中测试过,用sumlist / 2替换sum / 2

avg( List, Avg ):-
    sumlist( List, Sum ),
    length( List, Length),
    (  Length > 0
    -> Avg is Sum / Length
    ;  Avg is 0
    ).

试验:

?- avg([1,2,3],X).
X = 2.

?- avg([],X).
X = 0.

编辑对不起,我忽略了空输入列表中需要false。然后测试Length > 0是否合适。谓词将失败。

使用库(聚合)的替代方法:

?- L=[1,2,3,4,5], aggregate((count,sum(N)),member(N,L),(Count,SumN)), Ave is SumN/Count.
L = [1, 2, 3, 4, 5],
Count = 5,
SumN = 15,
Ave = 3.

答案 2 :(得分:0)

avg(List,Avg / 1): -

sumlist( List, Sum ),

length( List, Length),

(  Length > 0
-> Avg is Sum / Length
;  Avg is 0
).  

你应该将平均值除以1。 例如avg(List,Avg / 1)。我刚刚在上面的评论中复制了它并添加了avg / 2.