このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/84
#  [1] 授業単元:C言語  
#  [2] 問題文:10個の要素が格納できる配列を2つ宣言し、それぞれ任意の整数で初期化せよ。 
#  その後、この2つの配列の中身を入れ替えよ。  
#  

'10個の要素が格納できるならびを2つ宣言し、それぞれ任意の整数で初期化する'(L1,L2) :-
        '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2),
        'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2).

'10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2) :-
        '10個の要素が格納できるならびを宣言する'(_宣言名1),
        '10個の要素が格納できるならびを宣言する'(_宣言名2),!.

'10個の要素が格納できるならびを宣言する'(_宣言名) :-
        length(L1,10),
        P =.. [_宣言名,L1],
        assertz(P).

'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2) :-
        任意の整数で初期化する(_宣言名1),
        任意の整数で初期化する(_宣言名2).

任意の整数で初期化する(_宣言名) :-
        P =.. [_宣言名,L],
        retract(P),
        変数ならびを任意の整数で初期化する(L),
        assertz(P),!.

変数ならびを任意の整数で初期化する([]) :- !.
変数ならびを任意の整数で初期化する([N|R]) :-
        get_integer(N),
        変数ならびを任意の整数で初期化する(R).

get_integer(N) :-
        get_line(Line),
        整数入力診断(Line,N),!.
get_integer(N) :-
        get_integer(N).

整数入力診断(Line,N) :-
        atom_to_term(Line,N,_),
        integer(N),!.
整数入力診断(Line,N) :-
        writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'その後、この2つのならびの中身を入れ替える'(_宣言名1,_宣言名2) :-
        'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2),
        入れ替える(_宣言名1,_宣言名2,L1,L2),!.

'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2) :-
        P1 =.. [_宣言名1,L1),
        P2 =.. [_宣言名2,L2),
        retract(P1),
        retract(P2),!.

入れ替える(_宣言名1,_宣言名2,L1,L2) :-
        P1_2 =.. [_宣言名1,L2],
        P2_2 =.. [_宣言名2,L1],
        assertz(P1_2),
        assertz(P2_2),!.

%  Prologにとって難題。
%  
%  実は「入れ替える」ということが普通にはできない。
%  
%  宣言するという事を述語としてassertすることとして捉えてみた。
%  'この2つの中味を'述語のretractのタイミングが相当に怪しい。
%