このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/890
#  [1] 授業単元:プログラミングB 
#  [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1384922.txt.html 
#  
#  問.構造体を使ったアドレス帳プログラムを以下の条件で作成せよ。
#  ・名前(全角10文字以内)読み(半角アルファベット・ローマ字・半角30文字以内)
#  メールアドレス(半角30文字以内)電話番号(半角13文字以内)
#  ・10人以上の登録が可能
#  ・データの一覧表示が可能
#  
#  (本当に初心者で申し訳ありませんがどうぞよろしくお願いいたしますorz)

アドレス帳(登録) :-
        名前を得る(_名前),
        読みを得る(_名前,_読み),
        メールアドレスを得る(_メールアドレス),
        電話番号を得る(_電話番号),
        assertz(アドレス帳(_名前,_読み,_アドレス,_電話番号)).

アドレス帳(一覧表示) :-
        write('%30sアドレス一覧表\n'),
        write_formatted('%20s %30s %30s %13s\n',[名前,読み,メールアドレス,電話番号]),
        アドレス帳(_名前,_読み,_アドレス),
        write_formatted('%20s %30s %30s %13s\n',[_名前,_読み,_メールアドレス,_電話番号]),
        fail.
アドレス帳(一覧表示).

名前を得る(_名前) :-
        write('名前を 全角10文字以内 で入力してください : '),
        get_line(Line),
        名前を得る診断(Line,_名前),!.
名前を得る(_名前) :- 名前を得る(_名前).

名前を得る診断(_名前,_名前) :-
        atom_length(_名前,_文字列の長さ),
        _文字列の長さ =< 10,!.
名前を得る診断(Line,_) :-
        write_formatted('%t は文字数が大きすぎます。再入力をお願いします。\n',[Line]),
        fail.

読みを得る(_読み) :-
        write('読みを 半角アルファベット・ローマ字・半角30文字以内 で入力してください : '),
        get_line(Line),
        読みを得る診断(Line,_読み),!.
読みを得る(_読み) :- 読みを得る(_読み).

読みを得る診断(Line,_読み) :-
        すべてが半角アルファベット・ローマ字・半角文字(Line),
        文字列の長さがn文字以内(Line,30),!.

すべてが半角アルファベット・ローマ字・半角文字(Line) :-
        atom_chars(Line,Codes),
        すべてのコードが127以下(Codes).
すべてが半角アルファベット・ローマ字・半角文字(Line) :-
        write_formatted('入力された %t には半角文字以外の文字があります\n',[Line]),
        fail.

すべてのコードが127以下([]) :- !.
すべてのコードが127以下([Code|R]) :-
        Code >= 32,
        Code =< 127,
        すべてのコードが127以下(R).

文字列の長さがn文字以内(Line,_n) :-
        atom_length(Line,_長さ),
        _長さ =< _n,!.
文字列の長さがn文字以内(Line) :-
        write_formatted('入力された %t は文字数が%tを越えています\n',[Line,_n]),
        fail.

メールアドレスを得る(_読み) :-
        write('メールアドレスを 半角アルファベット・ローマ字・30文字以内 で入力してください : '),
        get_line(Line),
        メールアドレス診断(Line,_読み),!.
メールアドレスを得る(_読み) :- メールアドレスを得る(_読み).

メールアドレス診断(Line,_読み) :-
        すべてが半角アルファベット・ローマ字・半角文字(Line),
        文字列の長さがn文字以内(Line,30),!.

電話番号を得る(_読み) :-
        write('電話番号を 半角13文字以内 で入力してください : '),
        get_line(Line),
        電話番号診断(Line,_読み),!.
電話番号を得る(_読み) :- 電話番号を得る(_読み).

電話番号診断(Line,_読み) :-
        すべてが半角数字かハイフン(Line),
        文字列の長さがn文字以内(Line,13),!.

すべてが半角数字かハイフン(Line) :-
        atom_chars(Line,Chars),
        半角数字・ハイフン(Chars),!.
すべてが半角数字かハイフン(Line) :-
        write_formatted('%t に半角数字とハイフン以外の文字が混入しています\n',[Line]),
        fail.

半角数字・ハイフン([]) :- !.
半角数字・ハイフン(['-'|R]) :-
        半角数字・ハイフン(R),!.
半角数字・ハイフン([A|R]) :-
        A @>= '0',
        A @=< '9',
        半角数字・ハイフン(R),!.