このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/771
#  [1] C言語演習 
#  [2] n科目の点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は 
#  1,60以下は0) 
#  

科目(1,'prolog初級').
科目(2,'自然言語の論理学').
科目(3,'関数型言語').
科目(4,'C#講習').

科目のグレード・ポイント(1,4.0).
科目のグレード・ポイント(2,4.0).
科目のグレード・ポイント(3,2.0).
科目のグレード・ポイント(4,1.0).

点数評価値(_点数,4) :- _点数 >= 90,_点数 =< 100,!.
点数評価値(_点数,3) :- _点数 >= 80,_点数 < 90,!.
点数評価値(_点数,2) :- _点数 >= 70,_点数 < 80,!.
点数評価値(_点数,1) :- _点数 >= 60,_点数 < 70,!.
点数評価値(_点数,0) :- _点数 < 60,!.

'点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は1,60以下は0)'(GPA) :-
        write('科目番号をリストで入力しなさい : ),
        read(_科目番号ならび),
        点数を入力する(_科目番号ならび,_点数ならび),
        'GPAの計算'(_点数ならび,GPA).

点数を入力する([],[]) :- !.
点数を入力する([_科目番号|R1],[[_科目番号,_点数]|R2]) :-
        科目(_科目番号,_科目),
        write_formatted('%tの点数を入力してください : '),
        get_integer(_点数),
        点数を入力する(R1,R2).


'GPAの計算'(_点数ならび,GPA) :-
        findsum(_科目のグレード・ポイント,科目のグレード・ポイント(_,_科目のグレード・ポイント),_科目のグレード・ポイントの合計),
        'GPAの計算'(_点数ならび,0.0,X),
        GPA is X / _科目のグレード・ポイントの合計.

'GPAの計算'([],X,X) :- !.
'GPAの計算'([[_科目番号,_点数]|R1],S1,S2) :-
        点数評価値(_点数,_点数評価値),
        科目のグレード・ポイント(_科目番号,_科目のGP値),
        S2 is S1 + _点数評価値 * _科目のGP値,
        'GPAの計算'([[_科目番号,_点数]|R1],S1,S2).