このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/901
#  ../test/read.cgi/tech/1269438098/900 
#  こんな入力・出力例でいいの? 
#   
#  Input: 
#   
#  2 
#  1,1,murayama 
#  1,2,sugano 
#  3,3,koizumi 
#  3,4,abe 
#  5,5,hatoyama 
#  6,6,ozawa 
#   
#  Output: 
#   
#  #1 
#  Rep. Name: murayama 
#  Rep. Attendance: 1 
#  Group: 001 
#  Group Attendance: 2 
#   
#  #2 
#  Rep. Name: koizumi 
#  Rep. Attendance: 1 
#  Group: 003 
#  Group Attendance: 2 
#   

代表の生徒の名前、代表者の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力する(_代表の生徒の名前,_代表者の出席回数,_グループメンバーの出席回数上位5位,_グループ全体の出席回数上位5位) :-
        findall([_代表の個人ID,_名前],生徒(_代表の個人ID,_代表の個人ID,_名前),_代表の個人ID・名前ならび),
        member([_代表の個人ID,_名前],_代表の個人ID・名前ならび),
        代表者の出席回数(_代表の個人ID,_代表者の出席回数),
        グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび),
        グループメンバーの出席回数上位5位(_グループメンバーの出席回数ならび,グループメンバーの出席回数上位5位),
        グループ全体の出席回数(_代表のID,_グループ全体の出席回数ならび),
        グループ全体の出席回数上位5位(_グループ全体の出席回数ならび,グループ全体の出席回数上位5位).

代表者の出席回数(_代表の個人ID,_代表者の出席回数) :- count(出席者(_代表の個人ID),_代表者の出席回数).

グループメンバーの出席回数(_代表のID,_グループメンバーの出席回数ならび) :-
        findsetof(_個人ID,(生徒(_代表のID,_個人ID,_),\+(_代表のID=_個人のID)),_グループメンバーならび),
        findall([_出席回数,_個人ID],
                   (      member(_個人ID,_グループメンバーならび),
                          count(出席者(_個人ID),_出席回数)),
                  _グループメンバーの出席回数ならび),!.

グループ全体の出席回数(_代表のID,_グループメンバーの出席回数ならび) :-
        findsetof(_個人ID,生徒(_代表のID,_個人ID,_),_グループメンバーならび),
        findall([_出席回数,_個人ID],
                   (      member(_個人ID,_グループメンバーならび),
                          count(出席者(_個人ID),_出席回数)),
                  _グループ全体の出席回数ならび),!.

グループメンバーの出席回数上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位) :-
        大きい順に上位N位(N,_グループメンバーの出席回数ならび,_グループメンバーの出席回数上位5位).

グループ全体の出席回数上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位) :-
        大きい順に上位N位(N,_グループ全体の出席回数ならび,_グループ全体の出席回数上位5位).

大きい順に上位N位(L1,L) :-
        sort(L1,L2),
        reverse(L2,L3),
        length(L,N),
        append(L,_,L3),!.
大きい順に上位N位(L1,L) :-
        sort(L1,L2),
        reverse(L2,L),!.

キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる :-
        キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前),
        assertz(生徒(_代表者のID,_個人のID,_名前)),
        キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる.
キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる.

キーボードから代表者のID,個人のID,名前を入力する(_代表者のID,_個人のID,_名前) :- get_split_line([','],[_代表者のID,_個人のID,_名前]).

出席者の入力 :-
        get_line(Line),
        atom_to_term(Line,_個人ID,_),
        integer(_個人ID),
        assertz(出席者(_個人ID)),
        出席者の入力.
出席者の入力.