このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328276597/151
#  [1] 授業単元:プログラミング演習 
#  [2]複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 
#  人数は最初に質問して入力させること。 
#  実行の結果作成されたファイルは、メモ帳などで開いて内容を確認すること。 
#  BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。 
#  身長と体重は小数点以下まで扱えるものとする。 
#   
#  BMI値=体重(kg)/(身長(m))^2 
#  

'複数の人の名前と体重、身長を質問してBMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存しなさい。 人数は最初に質問して入力させること。'(_保存ファイル名) :-
        人数は質問して入力(_人数),
        '複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび),
        'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび).

人数は質問して入力(_人数) :-
        write('対象人数を入力して下さい : '),
        get_integer(_人数).

'複数の人の名前と体重、身長を質問して'(_人数,_名前_身長_体重ならび) :-
        length(_名前_身長_体重ならび,_人数),
        findall([_名前,_身長,_体重],(
                    '名前・身長・体重を得る'(_名前,_身長,_体重),
                    append(_,[[_名前,_身長,_体重]|_],_名前_身長_体重ならび)),
                _名前_身長_体重ならび).

'名前・身長・体重を得る'(_名前,_身長,_体重) :-
        名前を得る(_名前),
        身長を得る(_身長),
        体重を得る(_体重).

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

身長を得る(_身長) :-
        write('身長を入力して下さい : '),
        get_line(Line),
        身長入力診断(Line,_身長),!.
身長を得る(_身長) :-
        身長を得る(_身長).

身長入力診断(Line,_身長) :-
        atom_to_term(Line,_身長,_),
        number(_身長),
        _身長 > 0,
        _身長 =< 240.0,!.
身長入力診断(Line,_) :-
        writef('入力された %t からは適切な身長が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

体重を得る(_体重) :-
        write('体重を入力して下さい : '),
        get_line(Line),
        体重入力診断(Line,_体重),!.
体重を得る(_体重) :-
        体重を得る(_体重).

体重入力診断(Line,_体重) :-
        atom_to_term(Line,_体重,_),
        number(_体重),
        _体重 > 0,
        _体重 =< 250.0,!.
体重入力診断(Line,_体重) :-
        writef('入力された %t からは適切な体重が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'BMI値を計算して、「名前、体重、身長、BMI値、判定結果(やせている、普通、肥満、等)」をファイルに保存'(_保存ファイル名,_名前_身長_体重ならび) :-
        open(_保存ファイル名,write,Outstream),
        append(_,[[_名前,_身長,_体重]|R],_名前_身長_体重ならび),
        'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定),
        writef(Outstream,'%t,%t,%t,%t,%t\n',[_名前,_身長,_体重,_BMI値,_BMI値判定]),
        R = [],
        close(Outstram).

'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :-
        'BMI値の計算'(_身長,_体重,_BMI値),
        'BMI値の判定'(_BMI値,_BMI値の判定).

'BMI値の計算'(_身長,_体重,_BMI値) :-
        _身長 > 3,
        _BMI値 is _体重 / ((_身長 / 100) ^ 2).
'BMI値の計算'(_身長,_体重,_BMI値) :-
        _身長 =< 3,
        _BMI値 is _体重 / (_身長 ^ 2).

'BMI値の判定'(_BMI値,_BMI値の判定) :-
        'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,_BMI値の判定).

'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やせています) :-
        'BMI値が20未満なら'(_BMI値),!.
'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,普通です) :-
        'BMI値が20〜24未満なら'(_BMI値),!.
'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,やや肥満です) :-
        'BMI値が24〜26.5未満なら'(_BMI値),!.
'BMI値が20未満なら「やせています」、20〜24未満なら「普通です」、24〜26.5未満なら「やや肥満です」、26.5以上なら「肥満です」と判定すること。'(_BMI値,肥満です) :-
        'BMI値が26.5以上なら'(_BMI値),!.

'BMI値が20未満なら'(_BMI値) :-
        _BMI値 < 20.0.

'BMI値が20〜24未満なら'(_BMI値) :-
        _BMI値 >= 20.0,
        _BMI値 < 24.

'BMI値が24〜26.5未満なら'(_BMI値) :-
        _BMI値 >= 24.0,
        _BMI値 < 26.5.

'BMI値が26.5以上なら'(_BMI値) :-
        _BMI値 >= 26.5.