2

私はプロローグで関数を作りました:-

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」と返されます: 分散([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(2 つの引数) を定義し、2 番目の句は を定義しますvariance/3。後者の述語は、処理できない空のリストに到達するまで再帰的に自身を呼び出します。

の適切な基本ケースを定義する必要がありますvariance/3。Prolog では、述語名が同じでアリティ (引数の数) が異なる句は、異なる述語を定義します。

variance/2基本ケースと再帰ケースで定義するため、エラーはテスト コードに表示されません。

于 2011-03-01T17:15:08.483 に答える
4

最初のコードでは、2 つの述語 Variance/2 と Variance/3 を定義しました (1 つは 2 つの引数を持ち、もう 1 つは 3 つの引数を持ちます)。最初の述語のスペルが間違っている可能性があります。それは読むべきです

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