2

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

出于某种原因,当我尝试计算方差时,它总是这样回答“假”: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))).

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

4

2 回答 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了基本案例和递归案例。

于 2011-03-01T17:15:08.483 回答
4

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

variance([], _, 0).
于 2011-03-01T17:18:01.417 回答