このディレクトリの索引
#  
#  極めて単純な filter/2 プログラムを4種示す。
#  

%%%%% 再帰の節で変換(最も一般的) %%%%%%%

filter([],[]).
filter([c,d|R1],[x|R2]) :-
        filter(R1,R2).
filter([c|R1],[y,y|R2]) :-
        filter(R1,R2).
filter([d,e|R1],[z|R2]) :-
        filter(R1,R2).
filter([A|R1],[A|R2]) :-
        filter(R1,R2).

%  置換候補が多くなると可読性が極端に落ちる。

%%%% 差分リストを用いた置換述語 %%%%%%

filter([],[]).
filter(L1,L2) :-
        置換(L1,L2,R1,R2),
        filter(R1,R2).
filter([A|R1],[A|R2]) :-
        filter(R1,R2).

置換([c,d|R1],[x|R2],R1,R2).
置換([c|R1],[y,y|R2],R1,R2).
置換([d,e|R1],[z|R2],R1,R2).

%  置換述語の追加変更がやりやすい。

%%%%%%%% 専らappend/3 で処理 %%%%%%%

filter([],[]).
filter(L1,L2) :-
        置換(EL1,EL2),
        append(EL1,R1,L1),
        append(EL2,R2,L2),
        filter(R1,R2).
filter([A|R1],[A|R2]) :-
        filter(R1,R2).

置換([c,d],[x]).
置換([c],[y,y]).
置換([d,e],[z]).

%%%%%% append/4 を用いた例 %%%%%%%%

filter(L1,L2) :-
        置換(B,D),
        append(A,B,C,L1),
        append(A,D,L3,L2),
        filter(C,L3).
filter(L,L).

置換([c,d],[x]).
置換([c],[y,y]).
置換([d,e],[z]).

append([],L1,L2,L) :-
        append(L1,L2,L).
append([A|R1],L1,L2,[A|R]) :-
        append(R1,L1,L2,R).

%  
%  append/4はPrologで一番重宝な述語だが
%  組込述語という訳にはいかない。
%  Prolog処理系起動直後に定義しておこう。
%