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