このディレクトリの索引

#  ・以下の実行結果になるようプログラムを作成せよ。
#  
#  実行結果
#  人数 > 5
#  0人目:
#  名前 > Taro
#  電話番号 > 090-111-1111
#  1人目:
#  名前 > Hanako
#  電話番号 > 090-222-2222
#  2人目:
#  名前 > Ichiro
#  電話番号 > 090-333-3333
#  3人目:
#  名前 > Jiro
#  電話番号 > 090-444-4444
#  4人目:
#  名前 > Hanayo
#  電話番号 > 090-555-5555
#  
#  電話帳:
#  Taro, 090-111-1111
#  Hanako, 090-222-2222
#  Ichiro, 090-333-3333
#  Jiro, 090-444-4444
#  Hanayo, 090-555-5555
#  
#  名前 > Hanayo
#  Hanayo, 090-555-5555
#  
#  実行結果
#  人数 > 2
#  0人目:
#  名前 > Taro
#  電話番号 > 090-111-1111
#  1人目:
#  名前 > Taro
#  電話番号 > 090-222-2222
#  
#  電話帳:
#  Taro, 090-111-1111
#  Taro, 090-222-2222
#  
#  名前 > Taro
#  Taro, 090-111-1111
#  Taro, 090-222-2222
#  
#  実行結果
#  人数 > 0
#  
#  電話帳:
#  
#  名前 > Taro
#  該当者なし


'電話番号を登録し、それを表示し、さらに検索する' :-
        電話番号登録,
        電話番号表示,
        電話番号検索.

電話番号登録 :-
        abolish(電話帳/2),
        処理人数を入力する(_人数),
        length(Ln,_人数),
        append(L0,[_|R],Ln),
        length(L0,_人目),
        writef('%t人目:\n',[_人目]),
        名前を入力する(_名前),
        電話番号を入力する(_電話番号),
        assertz(電話帳(_名前,_電話番号)),
        R = [],!.
電話番号登録.

処理人数を入力する(_人数) :-
        write('\n人数 > '),
        get_line(Line),
        処理人数入力診断(Line,_人数),!.
処理人数を入力する(_人数) :-
        処理人数を入力する(_人数).

処理人数入力診断(Line,_人数) :-
        atom_to_term(line,_人数,_),
        integer(_人数),
        _人数 > 0,!.
処理人数入力診断(Line,_人数) :-
        writef('入力された %t から適切な人数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

名前を入力する(_名前) :-
        write('名前 > '),
        get_line(_名前).

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

電話番号入力診断(Line,Line) :-
        split(Line,['(',')','-',' '],L),
        concat_atom(L,S),
        atom_chars(S,Chars),
        全てが数字(Chars),!.
電話番号入力診断(Line,_電話番号) :-
        writef('入力された%tは電話番号として不適切です。再入力をお願いします。\n',[Line]),
        fail.

電話番号表示 :-
        writef('\n電話帳 >\n'),
        電話帳(_名前,_電話番号),
        writef('%t, %t\n',[_名前,_電話番号]),
        fail.
電話番号表示.

電話番号検索 :-
        名前を鍵に電話番号を得る.

名前を鍵に電話番号を得る :-
        名前を入力(_名前),
        電話番号の検索と出力(_名前),!.

電話番号の検索と出力(_名前,_電話番号) :-
        電話帳(_名前,_電話番号),
        名前と電話番号を出力する(_名前,_電話番号),
        fail.
電話番号の検索と出力(_名前,_電話番号) :-
        \+(電話帳(_名前,_電話番号)),
        write('該当者なし\n'),!.
電話番号の検索と出力(_,_).

名前と電話番号を出力する(_名前,_電話番号) :-
        writef('%t, %t\n',[_名前,_電話番号]).

全てが数字([]) :- !.
全てが数字([A|R]) :-
        member(A,['0','1','2','3','5','5','6','7','8','9']),
        全てが数字(R).