このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/820
#  【質問テンプレ】 
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):その他の制限:自分の番号と身長と体重を入力し (体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満) 
#  で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する 
#   
#   

'各々自分の番号と身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別し これを終了するまで繰り返す 番号0と打ったら入力を終了し、それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :-
        '各々自分の番号を入力'(_番号),
        '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号),
        'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する'.

'各々自分の番号を入力'(_番号) :-
        整数を得る(自分の番号,_番号).

'身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'('0') :- !.
'身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_番号) :-
        身長と体重を入力し(_身長,_体重),
        '身長・体重・BMIを登録する'(_番号,_身長,_体重,_BMI),
        '各々自分の番号を入力'(_次の番号),
        '身長と体重を入力し、(体重/身長*身長)でBMIをだし4種類(18.5未満の軽体重、25未満の普通体重、30未満の前肥満、それ以上の肥満)で区別することを番号0と入力されるまで繰り返す'(_次の番号).

身長と体重を入力し(_身長,_体重) :-
        身長を入力(身長,(_身長 > 0.0,_身長 =< 2.3),_身長),
        体重を入力(体重,(_体重 > 0.0,_体重 =< 300.0),_体重).

身長を入力(_身長) :-
        数を得る(身長,(_身長 > 0.0,_身長 =< 2.3),_身長).

体重を入力(_体重) :-
        数を得る(体重,(_体重 > 0.0,_体重 =< 300.0),_体重).

'身長・体重・BMIを登録する'(_番号,_身長,_体重) :-
        _BMI is _体重/(_身長*_身長),
        assertz(身長(_番号,_身長)),
        assertz(体重(_番号,_体重)),
        assertz(BMI(_番号,BMI)).

'それぞれ1種類ずつのBMIが一番大きい人の番号体重身長BMIを表示する' :-
        append(_,[_BMI種類|R],[軽体重,普通体重,前肥満,肥満]),
        'BMI種類の表示'(_BMI種類),
        R = [].

'BMI種類の表示'(_BMI種類) :-
        findall([_BMI,_番号,_身長,_体重],(
                   'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI)),
               LL1),
        降順整列(LL1,[[_BMI,_番号,_身長,_体重]|_]),
        writef('%tの人でBMIがもっとも大きい人 : 番号: %t, 身長: %t, 体重: %t, BMI: %t ',[_BMI種類,_番号,_身長,_体重,_BMI]).

'BMI種類に適合する番号'(_BMI種類,_番号,_身長,_体重,_BMI) :-
        'BMI'(_番号,_BMI),
        'BMI診断'(_BMI,_BMI種類),
        身長(_番号,_身長),
        体重(_番号,_体重).

'BMI診断'(_BMI,軽体重) :-
        _BMI < 18.5.
'BMI診断'(_BMI,普通体重) :-
        _BMI >= 18.5,
        _BMI < 25.
'BMI診断'(_BMI,前肥満) :-
        _BMI >= 25.0,
'BMI診断'(_BMI,肥満) :-
        _BMI >= 30.0.

降順整列(L1,L3) :-
        sort(L1,L2),
        reverse(L2,L3).