リストの平均を計算できるコードがありますが、唯一の問題は、空のリストの場合にエラーが発生することです。リストが空の場合は false を返したい。ヒントはありますか?
avg( List, Avg ):-
sum( List, Sum ),
length( List, Length),
Avg is Sum / Length.
リストの平均を計算できるコードがありますが、唯一の問題は、空のリストの場合にエラーが発生することです。リストが空の場合は false を返したい。ヒントはありますか?
avg( List, Avg ):-
sum( List, Sum ),
length( List, Length),
Avg is Sum / Length.
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.
もちろん、ゼロで割ることは通常許されません。(慣例により)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.
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 を追加しました。