2011-03-01 52 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).