2011-03-01 15 views
2

計算方差我已經在序言作了功能: -在序言

mean(L, M) :- 
    sum(L, S), 
    length(L, N), 
    M is S/N. 

sum([],0). 
sum([H|T],Y):- 
    sum(T,X), 
    Y is X + H. 

variance([],0). 
variance([H|T], M, VO):- 
    variance(T,M,Y), 
    VO is(Y + ((H-M)*(H-M))). 

statsList(L, M, V1) :- 
    sum(L, S), 
    length(L, N), 
    M is S/N, 
    variance(L, M, VO), 
    V1 is V0/N. 

由於某種原因,當我試圖計算它總是回答「假」 爲使方差:方差([1,2, 3,2,VO)或statsList([1,2,3],男,VO)

但是,如果我用這只是爲了測試它的工作原理:

variance([],0). 
variance([H|T], VO):- 
    variance(T,Y), 
    VO is(Y + ((H-2)*(H-2))). 

有人能告訴我在哪兒我錯了嗎?

回答

4
variance([],0). 
variance([H|T], M, VO):- 
    variance(T,M,Y), 
    VO is(Y + ((H-M)*(H-M))). 

第一子句定義謂詞variance/2(兩個參數),而第二限定variance/3。後面的謂詞然後遞歸地調用它自己,直到它遇到它無法處理的空列表。

您應該爲variance/3定義適當的基本情況。在Prolog中,具有相同的謂詞名稱但不同的參數(參數數量)的子句定義了不同的謂詞。

錯誤不會顯示在您的測試代碼中,因爲您在此定義了帶基本情況和遞歸情況的variance/2

4

在你的第一個代碼中,你已經定義了兩個謂詞variance/2和variance/3(一個帶有兩個參數,另一個帶有三個參數)。 您可能拼錯了第一個謂詞。它應該是

variance([], _, 0).