このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/212
#  [1]C言語演習 
#  [2]問題文 
#  次の形式のタブ区切りファイルがある。(行数は最大で1000万行とする) 
#  生徒ID クラス名 国語得点 数学得点 英語得点 
#  生徒IDは8桁の0から9で構成される文字列 
#  クラス名は4桁の0から9で構成される文字列 
#  国語得点、数学得点、英語得点は3桁の0から9で構成される文字列とする。 
#   
#  (2)それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係と 
#  同じ生徒をリストアップせよ 
#  ただしあるクラスの2つの教科の平均点が一致している場合はその2つの教科の得点の 
#  大小関係は不問として出力する。(3つが一致している場合はそのクラスの生徒全員 
#  がリストアップされることになる 
#  [3] OSはLinux,言語はCです。(C++は不可) 
#  [4] 4/30まで 
#  [5] stdlib.h stdio.h string.hをincludeしても良いがそれ以外は不可だそうです 
#  よろしくお願いします。 
# 
# 

それぞれの教科の得点が所属しているクラスの各教科の平均点の大小関係が同じ生徒をリストアップ(_ファイル) :-
        get_split_lines(_ファイル,['\t'],LL),
        findsetof(_クラス,append(_,[[_,_クラス,_,_,_]|_],LL),_クラスならび),
        findall([_クラス,_パターン],(
                    append(_,[_クラス|_],_クラスならび),
                    パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン)),
                _クラス・パターンならび),
        append(_,[[_ID,_クラス,_国語,_数学,_英語]|R],LL),
        パターンが一致したら表示(_ID,_クラス,_クラスパターンならび,_国語,_数学,_英語),
        R = [],!.

パターンが一致したら表示(_ID,_クラス,_クラス・パターンならび,_国語,_数学,_英語) :-
        append(_,[[_クラス,_パターン]|_],_クラス・パターンならび),
        パターン判断(_パターン,_国語,_数学,_英語),
        write_formatted('%t\n',[_クラス,_ID]),!.
パターンが一致したら表示(_,_,_,_,_,_).

パターン(LL,_クラス,_国語平均点,_数学平均点,_英語平均点,_パターン) :-
        findavg(_国語,append(_,[[_,_クラス,_国語,_,_]|_],LL),_国語平均点),
        findavg(_数学,append(_,[[_,_クラス,_数学,_,_]|_],LL),_数学平均点),
        findavg(_英語,append(_,[[_,_クラス,_英語,_,_]|_],LL),_英語平均点),
        パターン(_パターン,_国語平均点,_数学平均点,_英語平均点).

パターン(1,A,B,C) :- A >B,B > C,!.
パターン(2,A,B,C) :- A >C,C > B,!.
パターン(3,A,B,C) :- B >A,A > C,!.
パターン(4,A,B,C) :- B >C,C > A,!.
パターン(5,A,B,C) :- C >A,A > B,!.
パターン(6,A,B,C) :- C >B,B > A,!.
パターン(7,E,E,C) :- \+(E=C),E > C,!.
パターン(8,E,E,C) :- \+(E=C),E < C,!.
パターン(9,E,B,E) :- \+(E=B),E > B,!.
パターン(10,E,B,E) :- \+(E=B),E < B,!.
パターン(11,A,E,E) :- \+(E=C),E < A,!.
パターン(12,A,E,E) :- \+(E=C),E > A,!.
パターン(13,E,E,E).

パターン判断(_パターン,A,B,C) :-
        _パターン < 7,
        パターン(_パターン,A,B,C),!.
パターン判断(7,A,B,C) :- C < A,C < B,!.
パターン判断(8,A,B,C) :- C > A,C > B,!.
パターン判断(9,A,B,C) :- B < A,B < C,!.
パターン判断(10,A,B,C) :- B > A,B > C,!.
パターン判断(11,A,E,E) :- A < B,A < C,!.
パターン判断(12,A,E,E) :- A > B,A > C,!.
パターン判断(13,_,_,_).