このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/148
#  [1] 授業単元: ゼミ演習でのプログラミング 
#  [2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10566.zip 
#  
# [1] ヒストグラム
# 0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力するプログラムを書きなさい#
#

'0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力する' :-
      0〜9の範囲内の整数を20個入力し(1,_サンプルならび),
      ヒストグラム(_サンプルならび).

ヒストグラム(_サンプルならび) :-
      最初に縦棒の限界数を決めよう(_サンプルならび,_限界数),
      '次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび),
      転置(_度数表示ならび,_転置した度数表示ならび),
      ヒストグラム表示(_転置した度数表示ならび).

最初に縦棒の限界数を決めよう(_サンプルならび,_限界数) :-
      findmax(U,count(member(U,_サンプルならび)),_限界数).

'次に度数表示を*のならびで表現して、0-9のならびを取る'(_サンプルならび,_限界数,_度数表示ならび) :-
      findall(_度数表示,
                  (for(0,N,9),count(member(N,_サンプルならび),_度数),
                              '空白が先に来るように反転した*ならびの生成'(_度数,1,_限界数,[],_度数表示)),
              _度数表示ならび).

'空白が先に来るように反転した*ならびの生成'(_,N,_限界数,X,X) :- N > _限界数,!.
'空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :-
      N > _度数,
      N2 is N + 1,
      '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,[' '|Y],X).
'空白が先に来るように反転した*ならびの生成'(_度数,N,_限界数,Y,X) :-
      N =< _度数,
      N2 is N + 1,
      '空白が先に来るように反転した*ならびの生成'(_度数,N2,_限界数,['*'|Y],X).

ヒストグラム表示([]) :- !.
ヒストグラム表示([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),ヒストグラム表示(R).

0〜9の範囲内の整数を20個入力し(M,[]) :- M > 20,!.
0〜9の範囲内の整数を20個入力し(M,[N|R]) :-
      write_formatted('%t個目 : ',[M]),
      get_integer(N),
      N >= 0,
      N =< 9,
      M2 is M + 1,
      0〜9の範囲内の整数を20個入力し(M2,R),!.
0〜9の範囲内の整数を20個入力し(M,L) :-
      write('0〜9の範囲内の整数を入力してください\n'),
      0〜9の範囲内の整数を20個入力し(M,L).