1

リストの平均を計算できるコードがありますが、唯一の問題は、空のリストの場合にエラーが発生することです。リストが空の場合は false を返したい。ヒントはありますか?

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

4 に答える 4

3

Just add a condition that the list is not empty, for example:

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

This will cause the predicate to fail, which is appropriate since the average is undefined.

于 2012-10-06T09:27:19.853 に答える
3

もちろん、ゼロで割ることは通常許されません。(慣例により)0要素の平均が0になる可能性がある場合、可能な修正は次のようになります

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

edit SWI-Prologでテストし、sum/2をsumlist/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.

editfalse空の入力リストに必要なものを見落として申し訳ありません。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.
于 2012-10-06T09:10:45.677 に答える
0

avg( リスト, Avg/1 ):-

sumlist( List, Sum ),

length( List, Length),

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

avg(List, Avg/1) のように、平均を 1 で割る必要があります。上記のコメントで指定されたものをコピーし、avg/2 を追加しました。

于 2016-08-01T07:06:24.713 に答える