このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/634
#  [1] 授業単元:プログラム演習  
#  [2] 問題文(含コード&リンク):  
#  任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary、総和を求める関数 sum_ary、配列からある要素を探す関数 search_ary、配列を表示する関数 printf_ary を実装しなさい。 
#  その際、要素数もキーボードから入力するように設計し、配列はちょうどその要素分だけを作成するようにしなさい。 
#  各関数では添字演算子([])を用いずに、ポインタ操作で実装しなさい。 
#  返り値と引数をどのようにしたら良いか考えて実装すること。  
#  以下のmain関数を参考にする。  
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10672.txt  
#  また、実行例は以下のようにすること。  
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10670.txt  
#  

% Prolog に配列は存在しないから、この種の問題は解けない。ここでは配列をできる
% リストに置き換えて、できる限り仕様に近く作ってみよう。
% 配列として与えられた課題をリストに置き換える時の参考にしてください。

'任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび) :-
        make_ary(_ならび).

make_ary(L) :-
        催促付き整数入力('要素数を決めてください:',N),
        length(L,N),
        for(1,M,N),
        M1 is M - 1,
        write_formatted('ary[%t]を入力してください :',[M1]),
        get_integer(J),
        list_nth(M,L,J),
        M = N.

'配列の総和を求める関数 sum_ary'(L) :-
        sum_ary(L,_総和),
        write_formatted('配列の総和は %t です。\n',[_総和]).

sum_ary([],0) :- !.
sum_ary([N|R],X) :- sum_ary(R,Y),X is N + Y.

'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L) :-
        search_ary(L,M),
        write_formatted('%t は配列の%t番目にあります。\n',[N,M]).

search_ary(L,M) :-
        催促付き整数入力('検索する数値を入力してください:',N),
        list_nth(M,L,N).

配列の表示(L) :- print_ary(L).

print_ary(L) :- print_ary(0,L).

print_ary(_,[]) :- !.
print_ary(M,[N|R]) :-
        write_formatted('ary[%t]:%t\n',[M,N]),
        M2 is M + 1,
        print_ary(M2,R).

配列処理操作 :-
        '任意の要素数のint型の配列を作成し、その配列の中にキーボードから数値を入力する関数 make_ary'(_ならび),
        配列操作(_ならび),!.

配列処理操作(L) :-
        write('**** 配列処理操作一覧 ****\n     1:総和計算\n     2:検索\n     3:配列の表示\n\n     9:End\n'),
        催促付き整数入力('Select a number ? ',N),
        機能選択(N,L),!.
配列処理操作(L) :- 配列処理操作(L).

機能選択(1,L) :-
        '配列の総和を求める関数 sum_ary'(L),
        fail.
機能選択(2,L) :-
        'キーボードから数値を入力して配列からある要素を探す関数 search_ary'(L),
        fail.
機能選択(3,L) :- 配列の表示(L),fail.
機能選択(9,L) :- !.