2011-10-29 5 views
3

私はリスト[1,3]を持っていて、最小のものを入力せずにコード内の平均を計算しようとしています。私はそれが正常に動作するように正しい構文がわからない、最初の行だけ問題を抱えているので、正常に呼び出され、プロローグを実行するときに数値を入力して正常に動作します。プロローグコードのナレッジベース内の既存のリストの平均を計算するにはどうすればよいですか?

average([1,3],X). 


average(List, Result) :- sum1(List, Len), sum(List, Sum), Result is Sum/Len. 

sum([], 0). 

sum([H|T], Sum) :- sum(T, Temp), Sum is Temp + H. 


sum1([],0). 

sum1([_|B],L):-sum1(B,Ln), L is Ln+1. 

答えて

1

まあ、常にリストを入力する必要はありません。つまり、my_list/1のような述語をあなたのプログラムで使用する必要があります。

my_list([1,3]). 

average_easy(List, Avg) :- 
    sum_(List, Sum), 
    length_(List, Length), 
    Avg is Sum/Length. 

sum_([], 0). 
sum_([H|T], Sum) :- 
    sum_(T, Temp), 
    Sum is Temp + H. 

length_([], 0). 
length_([_|B], L):- 
    length_(B, Ln), 
    L is Ln+1. 

main :- 
    my_list(X), 
    average_easy(X, Ans), 
    writeln((X, Ans)). 

だから、私たちが今持っているもの、すでに内蔵のSWI-プロローグにlength/2述語は、そこにある、ところで

?- [your_program_name]. 
% your_program_name compiled 0.00 sec, 64 bytes 
true. 

?- main. 
[1,3],2 
true. 

です。

0

あなたは、リストを歩く2つのアキュムレータ、合計のための1つ、長さのための1つを使用し、歩行が終了したときの平均を計算しなければなりません。

% here the list is not finished 
walk([H|T], AccTT, AccL, Average) :- 
    % here you write the code 
    ..................... 
    % next step 
    walk(T, NewAccTT, NewAccL, Average). 

    % here the list is finished 
walk([], AccTT, AccL, Average) :- 
    % here you compute the average   . 
    Average is .... 
1
avglist(L1,Avg):-sum(L1,0,S),length(L1,0,L),Avg is S/L. 

sum([H|T],A,S):-A1 is A+H,sum(T,A1,S). 
sum([],A,A). 

length([H|T],A,L):-A1 is A+1,length(T,A1,L). 
length([],A,A). 

これはあなたのソリューションについて、もう少し詳細を追加することができ

+2

SWIのプロローグでリストの平均を計算するための簡単な方法ですか? – abarisone

+0

最初に値が0になると、リストにある値が徐々に加算され、リストに値がなくなるとSはAの値を取ります。同様にlength/3はリストの要素数を計算します。A1その値をインクリメントし、それぞれの再帰でAに渡します。最後に要素がなくなると、LはLの値を取ります。平均は単にsum/lemgthです。 –

関連する問題