このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1267796762/13
#  【 課題 】  
#  ○県、市別に男女の人数をクロス集計するプログラムを作成せよ。 
#   
#  千葉県 柏市 男 
#  千葉県 松戸市 男 
#  埼玉県 さいたま市 女 
#  千葉県 柏市 男 
#  埼玉県 越谷市 男 
#  千葉県 松戸市 男 
#  埼玉県 岩槻市 女 
#  千葉県 柏市 女 
#  埼玉県 さいたま市 女 
#   
#  [実行例](男の場合) 
#  ,柏市,松戸市,さいたま市,越谷市,岩槻市 
#  千葉県,2,2,0,0,0 
#  埼玉県,0,0,0,1,0 
#   
#  [実行例](女の場合) 
#  ,柏市,松戸市,さいたま市,越谷市,岩槻市 
#  千葉県,1,0,0,0,0 
#  埼玉県,0,0,2,0,1 
#   
#  【 形態 】1. Javaアプリケーション  
#   
#  【 期限 】3/28まで  
#   
#  【 Ver  】java version "1.5.0_05"  
#   
#   
#  CSVへの出力やファイル入出力といったことはできますが、クロス集計のアルゴリズムに苦戦しています。 
#  よろしくお願い致します。 
# 
# 

'○県、市別に男女の人数をクロス集計する'(_性別) :-
指定された性の県別の都市人口表を表示する(_性別).

指定された性の県別の都市人口表を表示する(_性別) :-
'県ごとの都市人数を表示する(他県の都市では0を表示する)'(_性別).

'県ごとの都市人数を表示する(他県の都市では0を表示する)'(_性別) :-
'県ならびと都市ならびを得る'(_県ならび,_都市ならび),
'都市見出しを表示した後、県ごとの都市人数を表示する(列が他県の都市の場合0を表示する)'(_性別,_県ならび,_都市ならび).

'県ならびと都市ならびを得る'(_県ならび,_都市ならび) :-
setof(_県,[_市,_男女] ^ '県・市・男女'(_県,_市,_男女),_県ならび),
setof(_都市,[_県,_男女] ^ '県・市・男女'(_,_都市,_),_都市ならび).


'都市見出しを表示した後、県ごとの都市人数を表示する(列が他県の都市の場合0を表示する)'(_性別,_県ならび,_都市ならび) :-
都市見出しを表示する(_都市ならび),
'県ごとの都市人数を表示する(列が他県の都市の場合0を表示する)'(_性別,_県ならび,_都市ならび).

都市見出しを表示する(_都市ならび) :-
atomic_list_concat(_都市ならび,',',_都市行表示),
writef(',%w\n',[_都市行表示]).

'県ごとの都市人数を表示する(列が他県の都市の場合0を表示する)'(_性別,_県ならび,_都市ならび) :-
forall(
'県ごとの都市人数を(列が他県の都市の場合0)'(_性別,_都市ならび,_県,_人数ならび),
表示する(_県,_人数ならび)).

'県ごとの都市人数を(列が他県の都市の場合0)'(_性別,_県ならび,_都市ならび,_県,_人数ならび) :-
県ごとの(_県ならび,_県),
'都市人数を(列が他県の都市の場合0)'(_性別,_県,_都市ならび,_人数ならび).

県ごとの(_県ならび,_県) :-
member(_県,_県ならび).

'都市人数を(列が他県の都市の場合0)'(_性別,_県,_都市ならび,_人数ならび) :-
findall(_人数,
都市人数(_性別,_県,_都市ならび,_人数),_人数ならび).

都市人数(_性別,_県,_都市ならび,_人数) :-
member(_都市,_都市ならび),
度数('県・市・男女'(_県,_都市,_性別),_人数).

表示する(_県,_人数ならび) :-
atomic_list_concat([_県|_人数ならび],_行表示),
writef('%w\n',[_行表示]).

度数(P,_度数) :-
findall(1,P,L),
length(L,_度数).