このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/277
#  [1] 授業単元:配列 
#  [2] 問題文(含コード&リンク):  
#  入力する値は0以上の整数とし、下記の動作するプログラムを作成しなさい。 
#  要素数10の整数型配列を作成し、入力された0以外の数値のうち、これまで入力されていない値だけを追加、記憶させる。 
#  追加登録を行った場合には、現在何個の数値が記憶されているかを表示させる。 
#  0が入力された場合、または10個の値の登録が完了した場合は、記憶している全ての情報を表示して、プログラムを終了させる。 
#  例:5                 例:1 
#    1個登録                1個登録 
#    5                   2 
#    既に登録あり              2個登録 
#    3                   … 
#    2個登録                10 
#    0                   10個登録 
#    [5 3]を登録しました          登録上限に到達 
#                        [1 2 3 4 5 6 7 8 9 10] 
#  

'入力する値は0以上の整数とし、下記の動作するプログラムを作成しなさい。要素数10の整数型配列を作成し、入力された0以外の数値のうち、これまで入力されていない値だけを追加、記憶させる。追加登録を行った場合には、現在何個の数値が記憶されているかを表示させる。0が入力された場合、または10個の値の登録が完了した場合は、記憶している全ての情報を表示して、プログラムを終了させる' :-
        数の記憶([],L,_診断),
        記憶内容の表示(L,_診断).

数の記憶(L1,[],正常終了) :-
        length(L1,10),!.
数の記憶(L1,L,_診断) :-
        get_integer(N),
        数の記憶(N,L1,L,_診断).

数の記憶(0,_,[],途中終了) :- !.
数の記憶(N,L1,L,_診断) :-
        append(_,[N|_],L1),
        write('既に登録あり\n'),
        数の記憶(L1,L,_診断).
数の記憶(N,L1,[N|R],_診断) :-
        \+(append(_,[N|_],L1)),
        length([N|L2],Len),
        writef('%t個登録\n',[Len]),
        数の記憶([N|L1],R,_診断).

記憶内容の表示(L,正常終了) :-
        concat_atom(L,' ',S),
        writef('[%t]\n',[S]),!.
記憶内容の表示(L,途中終了) :-
        concat_atom(L,' ',S),
        writef('[%t]を登録しました\n',[S]).