我在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.

由于某些原因,当我尝试计算方差时,它总是会回复“false”
像这样:variance([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))).

有人可以告诉我我要去哪里错吗?

最佳答案

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

关于prolog - 计算序言中的方差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5157537/

10-10 13:55