このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/566
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク):  
#  番号と点数を配列に初期化して、それらを 
#  5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 
#  ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 
#  なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 
#  60〜79点をB、80〜100点をAとする。 
#  ただし、受験者の数は、50人以下とする。 
#  番号と点数は、以下の配列を使用すること。 
#  番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; 
#  点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; 
#  

'問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、  60〜79点をB、80〜100点をAとする。 ').

番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};').

点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};').

'ランクならびの生成'(_ランクならび) :-
        '問題文の5段階にランク付け'(_ランク定義文),
         ランクの定義文解析(_ランク定義文,_ランクならび).

番号ならびの生成(_番号ならび) :-
        番号の定義文(_番号の定義文),
        番号の定義文解析(_番号の定義文,_番号ならび).

点数ならびの生成(_点数ならび) :-
        点数の定義文(_点数の定義文),
        点数の定義文解析(_点数の定義文,_点数ならび).

'5段階にランク付けをして、受験番号・ランクを表示する' :-
        ランクならびの生成(_ランクならび),
        番号ならびの生成(_番号ならび),
        点数ならびの生成(_点数ならび),
        '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび).

'5段階にランク付けをして、受験番号・ランクを表示する'([],[],_).
'5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :-
        append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび),
        _点数 >= _点数下限,
        _点数 =< _点数上限,
        writef('受験番号:%t ランク:%t\n',[_番号,_ランク]),
        '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび).

ランクの定義文解析(_ランク定義文,_ランクならび) :-
        全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文),        
        split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L),
        n個組(3,L,_ランクならび).

全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :-
        atom_chars(_ランク定義文,Chars),
        findall(_文字_1,
                    append(_,[_文字|_],Chars),
                    全角数字ならば半角数字に変換(_文字,_文字_1)),
                Chars2),
        atom_chars(_半角数字変換されたランク定義文,Chars2).

全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :-
        全角数字半角数字変換(_全角数字,_半角数字),
        全角数字ならば半角数字に変換(R1,R2).
全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :-
        \+(全角数字半角数字変換(_文字,_)),
        全角数字ならば半角数字に変換(R1,R2).

全角数字半角数字変換(0,0).
全角数字半角数字変換(1,1).
全角数字半角数字変換(2,2).
全角数字半角数字変換(3,3).
全角数字半角数字変換(4,4).
全角数字半角数字変換(5,5).
全角数字半角数字変換(6,6).
全角数字半角数字変換(7,7).
全角数字半角数字変換(8,8).
全角数字半角数字変換(9,9).

番号の定義文解析(_番号の定義文,_番号ならび) :-
        split(_番号の定義文,['=',',',';'],[_|_番号ならび]).

点数の定義文解析(_点数の定義文,_点数ならび) :-
        split(_点数の定義文,['=',',',';'],[_|_点数ならび]).