2012-10-06 91 views
1

我有能夠計算列表的平均值的代碼,但唯一的問題是它是空列表時出錯。當列表爲空時,我想返回false。任何提示?列表的序列號平均值

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

回答

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/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. 
+0

可能是sum/2是undefined?或者你的Prolog沒有實現 - >/2?。看到我的編輯... – CapelliC

+0

哦,對不起,最近做了很多Lisp,並且閱讀了';'作爲評論。 – starblue

2

只需添加一個條件列表不爲空,如:

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

這將導致斷言失敗,這是因爲平均數是不確定的。

0

AVG(列表,平均/ 1): -

sumlist(List, Sum), 

length(List, Length), 

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

你應該1. 如AVG(列表,平均/ 1)除以平均值。我只是複製了它在上面的評論,並添加avg/2。