このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/924
#  [1] 授業単元:C言語 
#  [2] 問題文: 
#  学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 
#  学籍番号:整数型 number 
#  氏名:文字型 name[20] 
#  英語得点:整数型 eigo 
#  国語得点:整数型 kokugo 
#  数学得点:整数型 sugaku 
#  合計得点:整数型 goukei 
#  SCORE型の2つの構造体変数x1,x2を宣言せよ。 
#  そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 
#  <データ例> 
#  変数 番号 氏名 英語得点 国語得点 数学得点 
#  x1  1  nakashima 75  80    75 
#  x2  2  takada  77   82    70 
#  <出力列> 
#  nakashima 230 
#  

'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :-
        'キーボードから番号、氏名、各教科の得点を入力すると',
        '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび),
        '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび).


'キーボードから番号、氏名、各教科の得点を入力すると' :-
        一人分の成績を定義する,
        'キーボードから番号、氏名、各教科の得点を入力すると'.
'キーボードから番号、氏名、各教科の得点を入力すると'.

一人分の成績を定義する :-
        番号を得る(_番号),
        氏名を得る(_氏名),
        各教科の得点を得る(_英語得点,_国語得点,_数学得点),
        成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点).

番号を得る(_番号) :-
        整数を得る(番号,_番号),!,
        \+(_番号==0).

氏名を得る(_氏名) :-
        write('氏名を入力してください : '),
        get_line(_氏名).

各教科の得点を得る(_英語得点,_国語得点,_数学得点) :-
        整数を得る(英語得点,_英語得点),
        整数を得る(国語得点,_国語得点),
        整数を得る(数学得点,_数学得点).

成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :-
        変数xxを得る(_XX),
        成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点).

成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :-
        assertz(成績(_XX,番号,_番号)),
        assertz(成績(_XX,氏名,_氏名)),
        assertz(成績(_XX,英語成績,_英語成績)),
        assertz(成績(_XX,国語成績,_国語成績)),
        assertz(成績(_XX,数学成績,_数学成績)),!.

変数xxを得る(_XX) :-
        N is random(99999999) + 1,
        整数から文字列(8,N,A),
        atomic_list_concat([x,A],_XX),
        \+(成績(_XX,番号,_)),!.
変数xxを得る(_XX) :-
        変数xxを得る(_XX).

'英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :-
        setof(_XX,[_XX,_番号] ^ (
                    成績(_XX,番号,_番号)),_XXならび),
        findall([_合計点,_XX],(
                    member(_XX,_XXならび),
                    合計点を計算する(_XX,_合計点)),_合計点_変数番号ならび).

合計点を計算する(_XX,_合計点) :-
        成績(_XX,英語成績,_英語成績),
        成績(_XX,国語成績,_国語成績),
        成績(_XX,数学成績,_数学成績),
        _合計点 is _英語成績 + _国語成績 + _数学成績.

'合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :-
        sort(_合計点_番号ならび,_整列された合計点_番号ならび),
        reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび),
        _整列された合計点_番号ならび = [[_合計点,_XX]|_],
        成績(_XX,氏名,_氏名),
        writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]).