计算prolog中的方差

时间:2011-03-01 16:46:53

标签: prolog variance

我在Prolog中做了一个功能: -

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],M,VO)

但是,如果我使用它来测试它的工作原理:

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

有人可以告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分: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中,具有相同谓词名称但不同arity(参数数量)的子句定义不同的谓词。

由于您使用基本案例和递归案例定义variance/2,因此您的测试代码中不会显示错误。

答案 1 :(得分:4)

在你的第一个代码中,你定义了两个谓词variance / 2和variance / 3(一个有2个参数,另一个有3个参数)。 你可能拼错了第一个谓词。它应该读

variance([], _, 0).