このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1296387672/351
#  [1] 授業単元:課題  
#  [2] 問題文:単方向リスト  
#  typedef struct list 
#  { 
#       char name[20];   // 名前 
#       char tel[20];    // 電話番号 
#       struct list *next;   // 次のデータを指す構造体ポインタ 
#  } 
#  
#  グローバル変数とダミーノードを使わない。追加、削除、全体表示の動作を行う
#  ことができる住所録のプログラムをよろしくお長いします

住所録追加(_名前,_電話番号) :-
        assertz(住所録(_名前,_電話番号)).

住所録削除(_名前,_電話番号) :-
        retract(住所録(_名前,_電話番号)),
        fail.
住所録削除(_,_).

住所録全体表示 :-
        名前の最大長(_名前の最大長),
        電話番号の最大長(_電話番号の最大長),
        concat_atom(['%',_名前の最大長,'s | ','%',_電話番号の最大長,s],_表示形式),
        write_formatted(_表示形式,[名前,電話番号]),
        clause(住所録(_名前,_電話番号),_),
        write_formatted(_表示形式,[_名前,_電話番号]),
        fail.
住所録全体表示.

住所録の保存 :-
        tell('住所録#2.pro'),
        listing(住所録/2),
        told.

住所録の準備 :-
        retract('住所録#2.pro').

名前の最大長(_名前の最大長) :-
        findmax(_名前の長さ,(
                    clause(住所録(_名前,_),
                    sub_atom(_名前,0,_長さ,0,_名前)),
                _名前の最大長).

電話番号の最大長(_電話番号の最大長) :-
        findmax(_電話番号の長さ,(
                    clause(住所録(_,_電話番号),
                    sub_atom(_電話番号,0,_長さ,0,_電話番号)),
                _電話番号の最大長).