このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/805
#  [1]授業単元:プログラミング 
#  [2]問題文:番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存 
#  全データ一覧 
#  入力した番号の点数のみ表示 
#  新しいデータを入力しリストの最後に追加 
#  番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です 
#  プログラム終了 
#  
#  始めから与えられているデータを入れ忘れました。申し訳ありませんでした 
#  番号  数学  英語 
#  N0003  82  100 
#  N0006  73  91 
#  N0020  69  83 
#  N0011  44  70 
#  N0025  34  62 
#  N0022  32  52 
#  N0015  16  12 
#  N0013  61  100 
#  N0001  70  88 
#  (本当はデータ数が25個程あるのですが、これだけでお願いします) 
#  全データ一覧ではリスト通りの表示でOKです 
# 

成績('N0003',82,100).
成績('N0006',73,91). 
成績('N0020',69,83).
成績('N0011',44,70).
成績('N0025',34,62).
成績('N0022',32,52).
成績('N0015',16,12).
成績('N0013',61,100).
成績('N0001',70,88).

成績管理 :-
        成績管理メニュー表示,
        get_integer(_選択),
        成績管理選択実行(_選択).

成績管理メニュー表示 :-
        write('左側の番号で選択してください\n'),
        write('1..番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存\n'),
        write('2..全データ一覧\n'),
        write('3..入力した番号の点数のみ表示\n'),
        write('4..新しいデータを入力しリストの最後に追加\n'),
        write('5..番号のみを入力してデータ削除\n'),
        write('9..終了\n'),!.

成績管理選択実行(1) :- '番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存'.
成績管理選択実行(2) :- 全テータ一覧.
成績管理選択実行(3) :- 入力した番号の点数のみ表示.
成績管理選択実行(4) :- 新しいデータを入力しリストの最後に追加.
成績管理選択実行(5) :- 番号のみを入力してデータ削除.
成績管理選択実行(9).

'番号、数学点数、英語点数を一組としたデータを線形リスト形式で保存' :-
        findall([_番号,_数学点数,_英語点数],(
                    成績(_番号,_数学点数,_英語点数)),
                LL),
        open('生成保存.pro',write,Outstream),
        writef(Outstream,'%q.\n',[LL]),
        close(Outstream).

全データ一覧 :-
        write('番号  数学  英語\n'),
        成績(_番号,_数学点数,_英語点数),
        writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]),
        fail.
全データ一覧.

入力した番号の点数のみ表示 :-
        入力した番号(_入力した番号),
        write('番号  数学  英語\n'),
        成績(_番号,_数学点数,_英語点数),
        writef('%t %4r %4r\n',[_番号,_数学点数,_英語点数]),
        fail.
入力した番号の点数のみ表示.

入力した番号(_入力した番号) :-
        get_line(_入力した番号),!.

新しいデータを入力しリストの最後に追加 :-
        番号の入力(_番号),
        数学点数の入力(_数学点数),
        英語点数の入力(_英語点数),
        新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数).

新しいデータを入力しリストの最後に追加(_番号,_数学点数,_英語点数) :-
        assertz(成績(_番号,_数学点数,_英語点数)).

番号の入力(_番号) :-
        write('番号を入力してください : '),
        get_line(_番号),!.

数学点数の入力(_数学点数) :-
        write('数学点数(0~100)を入力してください : '),
        get_line(Line),
        点数入力診断(Line,_数学点数),
数学点数の入力(_数学点数) :-
        数学点数の入力(_数学点数).

英語点数の入力(_英語点数) :-
        write('英語点数(0~100)を入力してください : '),
        get_line(Line),
        点数入力診断(Line,_英語点数),!.
英語点数の入力(_英語点数) :-
        英語点数の入力(_英語点数).

点数入力診断(Line,_点数) :-
        atom_to_term(Line,_点数,_),
        integer(_点数),
        _点数 >= 0,
        _点数 =< 100,!.
点数入力診断(Line,_点数) :-
        write('入力された %t から点数として適切な整数を得られません。再入力をお願いします。\n',[Line]),
        fail.

'番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です' :-
        番号のみ入力して(_番号),
        retract(成績(_番号,_,_)),
        fail.
'番号のみを入力してデータ削除 ← 可能ならば、出来てなくても大丈夫です'.

番号のみ入力して(_番号) :-
        get_line(_番号),!.