このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/975
#  [1] 授業単元: プログラミング演習 
#  [2] 問題文(含コード&リンク): 
#   
#  ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10258.txt 
# 
# 表1のように,あるコンテストに関する4人の5点満点のデータがあるとき,「各個人の得点の平均を
# 求める」,「平均点より表2のような評価を行う」,「データや平均点及び評価を表示する」の3つのユーザ定義関数を用いて結果を表示する。
# 
# 表1 http://nojiriko.asia/jpeg/up10430.jpg
# 
# 表2 http://nojiriko.asia/jpeg/up10431.jpg
# 
# 考え方
# データのNoと点数はmain 関数の中で初期化する。そして各人の点数を引数として平均値を求める
# ユーザ定義関数,平均値を引数として評価を求めるユーザ定義関数,データNoと点数と平均値と評価を
# 引数として表示を行うユーザ定義関数を別々に定義し,これらのユーザ定義関数をmain関数の中で呼び
# 出して結果を表示するプログラムとする。

:- op(500,xf,以上).
:- op(500,xf,未満).
:- op(450,xfx,'~').

'5点満点データ'(1,4,3,5,4).
'5点満点データ'(2,5,4,4,5).
'5点満点データ'(3,3,2,2,2).
'5点満点データ'(4,3,4,3,3).

評価判定('A',4.0以上).
評価判定('B',3.0~4.0未満).
評価判定('C',2.0~3.0未満).
評価判定('D',2.0未満).

コンテスト結果の表示 :-
    見出し表示,
    個人データの表示,
    fail.
コンテスト結果の表示.

見出し表示 :-
    write('No 技術力 正確さ 難易度 表現力 平均点 評価\n').

個人データの表示 :-
    '5点満点データ'(No,_技術力,_正確さ,_難易度,_表現力),
    平均値を求める(No,_技術力,_正確さ,_難易度,_表現力,_平均点),
    評価判定を求める(_平均点,_評価),
    データを表示する(No,_技術力,_正確さ,_難易度,_表現力,_平均点,_評価).

平均値を求める(No,_技術力,_正確さ,_難易度,_表現力,_平均点) :-
    sum_list([_技術力,_正確さ,_難易度,_表現力],_技術力_正確さ_難易度_表現力_の合計),
    _平均点 is _技術力_正確さ_難易度_表現力_の合計 / 4.0.

評価判定を求める(_平均点,_評価) :-
    評価判定(_評価,V 以上),
    _平均点 >= V,!.
評価判定を求める(_平均点,_評価) :-
    評価判定(_評価,V1 ~ V2 未満),
    _平均点 >= V1,
    _平均点 < V2,!.
評価判定を求める(_平均点,_評価) :-
    評価判定(_評価,V 未満),
    _平均点 < V,!.

データを表示する(No,_技術力,_正確さ,_難易度,_表現力,_平均点,_評価) :-
    writef('%2r%6r %6r %6r %6r   ',[No,_技術力,_正確さ,_難易度,_表現力]),
    format('~2f  ~w\n',[_平均点,_評価]).