このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/545
#  [1] 授業単元: 関数 
#  [2] 問題文: 
#  最大で5名の学生の名前、性別、身長と体重を登録し、BMIも計算して保存し、 
#  それらの結果を表示するプログラムを作成せよ。[BMI=体重(kg)/(身長(m)*身長(m))] 
#   
#  プログラムを起動するとメニュー画面が現れ、 
#   ・[1] 名前,性別,数値登録 
#   ・[2] 登録内容訂正 
#   ・[3] 一覧表示 
#   ・[0] 終了 
#  が行えるようにすること。 ユーザには身長はcmで登録させること。 
#   
#  各機能ごとに関数を分割する。登録と訂正に関わる関数、 
#  一覧表示に関わる関数、main関数の3つに分けて作成せよ。 
#   
#  訂正については、○人目のデータを指定し、内容(名前,性別,数値)を上書きする。 
#   
#  

'プログラムを起動するとメニュー画面が現れ、 ・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにすること。 ユーザには身長はcmで登録させること。 ' :-
        repeat,
        'プログラムを起動するとメニュー画面が現れ',
        '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号),
        実行(_選択番号).

'プログラムを起動するとメニュー画面が現れ' :-
        write('選択してください\n'),
        write('・[1] 名前,性別,数値登録\n'), 
        write('・[2] 登録内容訂正\n'), 
        write('・[3] 一覧表示\n'), 
        write('・[0] 終了\n'). 

'・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :-
        get_line(_選択番号),
        選択番号診断(_選択番号),!.
'・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号) :-
        '・[1] 名前,性別,数値登録 ・[2] 登録内容訂正 ・[3] 一覧表示 ・[0] 終了 が行えるようにする'(_選択番号).

選択番号診断(_選択番号) :-
        member(_選択番号,['0','1,','2','3']),!.

実行('0') :- !.
実行('1') :-
        '名前,性別,数値登録'.
実行('2') :-
        '登録内容訂正'.
実行('3') :-
        '一覧表示'.

'名前,性別,数値登録' :-
        write('名前,性別,身長(cm)をカンマ区切りで入力して下さい\n'),
        readln(L),
        P = .. [身長|L],
        assertz(P),
        fail.

'登録内容訂正' :-
        write('名前を入力して下さい\n'),
        get_line(_名前),
        '登録内容訂正'(_名前),
        fail.

登録内容訂正(_名前) :-
        findall([_名前,_性別,_身長],(
                    身長(_名前,_性別,_身長)),
                LL),
        現在登録されている情報の開示(LL),
        更新情報の入力(_名前,_性別,_身長),
        登録内容の訂正(_名前,_性別,_身長).

更新情報の入力(_名前,_性別,_身長) :-
        write('性別,身長(cm)をカンマ区切りで入力して下さい\n'),
        readln([_更新された性別,_更新された身長]).

現在登録されている情報の開示(L) :-
        append(_,[[_名前,_性別,_身長]|R],L),
        writef('%12r,%t,%t\n',[_名前,_性別,_身長]),
        R = [].

登録内容の訂正(_名前,_性別,_身長) :-
        retract(身長(_名前,_性別,_身長)),
        assertz(身長(_名前,_更新された性別,_更新された身長)).

一覧表示 :-
        findall([_名前,_性別,_身長],(
                    身長(_名前,_性別,_身長)),
                LL),
        append(_,[[_名前,_性別,_身長]|R],LL),
        writef('%12r,%t,%t\n',[_名前,_性別,_身長]),
        R = [].