このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/654
#  キーボードにより配列へデータを入力させ, 
#  その配列データの数値の平均を関数 mean() に 
#  より計算させたい. 
#  以下の条件を満たしたプログラムを作成せよ. 
#  ただし,関数 mean() は,引数なし,戻り値なしとする. 
#  void mean(void) 
#  { 
#  } 
#  「ヒント」 
#  1)本プログラムのどこかに、「double data[100];」を宣言しておく。 
#  2)本プログラムのどこかに「double heikin;」と「int kosuu;」を宣言しておく。 
#  3)main 関数内で,配列data[] へ入力したいデータの個数 kosuu をキーボード入力させる. 
#  4)main 関数内で,double型配列 data[]にキーボードで数値を入力させる. 
#  5)関数 mean() の内部で 配列 data[]の値の平均を計算させる. 
#  6)main 関数内で,関数 mean()で計算した結果をprintfで表示させる 
#  */ 
#  #include<stdio.h> 
#  int main(void) 
#  { 
#   int i; 
#   printf("データ個数(100個以下):"); 
#   scanf("%d",&kosuu); 
#   printf("平均値=%d\n",heikin); 
#   return (0); 
#  } 
#  /* 平均値を計算する関数 */ 
#  void mean(void) 
#  { 
#  } 
#  これどうやるの? 
# 
% 
% 先に変数リストの枠(_data)があって、一引数で処理していくことを試みたのだが、
% 後半、変数要素を表示させたくはないため、苦しい展開となった。
% _kosu分入力して、まだ_dataに変数要素の余りがある場合、そこで切り捨てる方がいいのだろう。
% そうすれば、変数が現れたら平均計算を終了するというような、尋常でない条件が必要なくなる。
% ただし、
%         length(L0,_kosu),append(L0,_,_data), で表示には _data0 を使う必要がある。
% _kosuが100を越えていることもありうるからその点に注意して定義しなくてはならない。

data([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]).

'キーボードにより配列へデータを入力させ,その配列データの数値の平均を関数mean()により計算させる' :-
        個数を入力する(_kosu),
        data(_data),
        キーボードにより配列へデータを入力させ'(_kosu,_data),
        'その配列データの数値の平均を関数mean()により計算させる'(_kosu,_data,_平均),
        入力されたデータならびと平均を表示する(_data,_平均).

個数を入力する(_kosu) :-
        write('個数を入力してください : '),
        get_line(Line),
        個数入力診断(Line,_kosu),!.
個数を入力する(_kosu) :-
        個数を入力する(_kosu).

個数入力診断(Line,_kosu) :-
        atom_to_term(Line,_kosu,_),
        integer(_kosu),
        _kosu > 0,
        _kosu =< 100,!.
個数入力診断(Line,_kosu) :-
        write_formatted('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

キーボードにより配列へデータを入力させ(0,_) :- !.
キーボードにより配列へデータを入力させ(_,[]) :- !.
キーボードにより配列へデータを入力させ(_kosu,[_データ要素|R]) :-
        データを入力する(_データ要素),
        _kosu1 is _kosu - 1,
        キーボードにより配列へデータを入力させ(_kosu1,R).

mean(_data,_要素数,_平均) :-
        mean(_data,_要素数,0,_平均).

mean([V|_],_要素数,Sum,_平均) :-
        var(V),
        _平均 is Sum / _要素数,!.
mean([],_要素数,Sum,_平均) :-
        _平均 is Sum / _要素数,!.
mean([V|R],_要素数,Sum1,_平均) :-
        Sum2 is Sum1 + V,
        mean(R,_要素数,Sum2,_平均).

入力されたデータならびと平均を表示する(_data,_平均) :-
        変数要素が現れたら以下のならびを切り捨てる(_data,_data2),
        concat_atom(_data2,' ',_入力データ表示),
        write_formatted('入力された %t の平均は %t です\n',[_入力データ表示,_平均]).

変数要素が現れたら以下のならびを切り捨てる([],[]) :- !.
変数要素が現れたら以下のならびを切り捨てる([V|R1],[]) :- var(V),!.
変数要素が現れたら以下のならびを切り捨てる([A|R1],[A|R2]) :-
        \+(var(A)),
        変数要素が現れたら以下のならびを切り捨てる(R1,R2).