このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/436
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク):  
#  今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。  
#  実装するのは、入力、削除、表示、終了、load、saveです 
#  1.入力は、名前、電話番号を入力する。(可能ならばソートを行う)  
#  2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)  
#  3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする  
#  4.ヒント(mallocの意味を調べること)  
# 

単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :-
        '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳).
単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :-
        'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳).
単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :-
        'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳).

'入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :-
        名前を入力する(_名前),
        電話番号を入力する(_電話番号),
        ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳).

名前を入力する(_名前) :-
        get_line(_名前).

電話番号を入力する(_電話番号) :-
        get_line(Line),
        電話番号入力診断(Line,_電話番号),!.
電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号).

電話番号入力診断(Line,_電話番号) :-
        構成文字は数字かハイフンだけ(Line),!.
電話番号入力診断(Line,_電話番号) :-
        数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび),
        writef('入力された %t には電話番号としてふさわしくない文字 %t が含まれています。再入力をお願いします。\n',[Line,_電話番号に相応しくない文字ならび]).

数字かハイフン以外の構成文字を選別する(Line,_電話番号にふさわしくない文字ならび) :-
        atom_chars(Line,Chars),
        数字かハイフン以外の構成文字を選別する(Chars,[],_電話番号にふさわしくない文字ならび).

数字かハイフン以外の構成文字を選別する([],L,L) :- !.
数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :-
        \+(数字かハイフン(_文字)),
        \+(append(_,[_文字|_],L1)),
        数字かハイフン以外の構成文字を選別する(R1,[_文字|L1],_電話番号にふさわしくない文字ならび).
数字かハイフン以外の構成文字を選別する([_文字|R1],L1,_電話番号にふさわしくない文字ならび) :-
        (数字かハイフン(_文字);append(_,[_文字|_],L1)),
        数字かハイフン以外の構成文字を選別する(R1,L1,_電話番号にふさわしくない文字ならび).

数字かハイフン('-') :- !.
数字かハイフン(_文字) :-
        append(_,[_文字|_],['0','1','2','3','4','5','6','7','8','9']),!.

ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !.
ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :-
        _名前 @=< _名前1,!.
ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :-
        _名前 @> _名前1,
        ソートされた状態を保って入力する(_名前,_電話番号,R1,R2).

'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :-
        tell(_ファイル名),
        writef('%q.\n',[_電話帳]),
        told.

'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :-
        see(_ファイル名),
        read(_電話帳),
        seen.