このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/610
#  [1] 授業単元: プログラミング 
#  [2] 問題文 サッカーの試合結果の記録されたデータファイルを読み取り、 
#  優勝したチーム名を出力するプログラムを作成せよ。 
#  データファイルには、先頭の行にチーム数が出力されており、 
#  2行目からチーム名(チーム数分)、 
#  それ以降の行に試合結果が出力されている。 
#  試合結果の行は以下のフォーマットとなっている。 
#  <ホーム側のチーム名> <ホーム側チームの得点> 
#  <アウェイ側チームの得点> <アウェイ側チーム名> 
#  チーム名は30文字以内とする。 
#  試合に勝ったチームには勝ち点3が与えられ、引き分けたチームには 
#  勝ち点1が与えられる。勝ち点の合計が最も多いチームが優勝となるが、 
#  勝ち点の合計が同じチームが複数ある場合には、それらのうち、 
#  得失点差(得点と失点の差)の合計が大きいチームが優勝となる。 
#  得失点差の合計が同じ場合にはどちらを優勝としてもよい。 
#  4 
#  MANCHESTER_UNITED 
#  ARSENAL 
#  CHELSEA 
#  LIVERPOOL 
#  MANCHESTER_UNITED 3 1 ARSENAL 
#  CHELSEA 3 0 LIVERPOOL 
#  ARSENAL 2 2 CHELSEA 
#  LIVERPOOL 3 0 MANCHESTER_UNITED 
#  ------------------------------------ 
#  

優勝したチーム名を出力するプログラムを作成する(_データファイル) :-
        get_lines(_データファイル,Lines),
        データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび),
        '2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび),
        優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム),
        出力する(_優勝したチーム名).
        
データファイルには先頭の行にチーム数が出力されており、(Lines,_チーム数,_2行目以降ならび) :-
        Lines = [_チーム数文字列|_2行目以降ならび],
        atom_to_term(_チーム数文字列,_チーム数,_),!.

'2行目からチーム名(チーム数分)'(_2行目以降ならび,_チーム数,_チーム名ならび,_試合結果ならび) :-
        length(_チーム名ならび,_チーム数),
        append(_チーム名ならび,_試合結果ならび,_2行目以降ならび),!.

優勝したチーム名を(_チーム名ならび,_試合結果ならび,_優勝したチーム名) :-
        findall([_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],(
                    append(_,[_チーム名|_],_チーム名ならび),
                    all([_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差],0)),
                _チーム成績ならび),
        試合結果をチーム成績ならびに反映させる(_試合結果ならび,_チーム成績ならび,_最終チーム成績ならび),
        優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名).

試合結果をチーム成績ならびに反映させる([],_最終チーム成績ならび,_最終チーム成績ならび) :- !.
試合結果をチーム成績ならびに反映させる([_試合結果行|R],_チーム成績ならび1,_最終チーム成績ならび) :-
        split(_試合結果行,[' '],[_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名]),
        勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,_ホーム側の勝数の加算値,_アウェイ側の勝数の加算値,_ホーム側の敗数の加算値,_アウェイ側の敗数の加算値,_ホーム側の引き分け数の加算値,_アウェイ側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_アウェイ側の勝ち数の加算値),
        チーム成績の更新(_ホーム側のチーム名,_ホーム側の得点,_ホーム側の勝数の加算値,_ホーム側の敗数の加算値,_ホーム側の引き分け数の加算値,_ホーム側の勝ち点の加算値,_チーム成績ならび1,_チーム成績ならび2),
        チーム成績の更新(_アウェイ側のチーム名,_アウェイ側の得点,_アウェイ側の勝数の加算値,_アウェイ側の敗数の加算値,_アウェイ側の引き分け数の加算値,_アウェイ側の勝ち点の加算値,_チーム成績ならび2,_チーム成績ならび3),
        試合結果をチーム成績ならびに反映させる(R,_チーム成績ならび3,_最終チーム成績ならび).

優勝したチームを判定する(_最終チーム成績ならび,_優勝したチーム名) :-
        findmax([_勝ち点,_得失点差],(
                    append(_,[[_チーム名,_勝,_敗,_分,_勝ち点,_得点,_失点,_得失点差]|_],_最終チーム成績ならび)),
                [_勝ち点,_得失点差]),
        append(_,[[_優勝したチーム名,_,_,_,_勝ち点,_,_,_得失点差]|_],_最終チーム成績ならび).

勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,1,0,0,1,0,0,3,0) :-
        _ホーム側の得点 > _アウェイ側の得点,!.        
勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,1,1,0,0,0,0,3) :-
        _ホーム側の得点 < _アウェイ側の得点,!.        
勝負判定(_ホーム側のチーム名,_ホーム側の得点,_アウェイ側の得点,_アウェイ側のチーム名,0,0,0,0,1,1,1,1) :-
        _ホーム側の得点 = _アウェイ側の得点,!.        

出力する(_優勝したチーム名) :-
        write_formatted('優勝したチームは %t です\n',[_優勝したチーム名]).