我在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))).
有人可以告诉我哪里出错了吗?
答案 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).