このディレクトリの索引

%  deleteをappendで書く。

delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        append(L0,R,DeletedList).

%  とこれまたエレガンスですが、Listの中にElementが複数ある場合は、
%  全部削除してください、となると事情は一変します。

delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        append(L0,R,DeletedList_1),
        delete(DeletedList_1,List,DeletedList).
delete(_,List,List).

%  これだと

delete(_,[],[]).
delete(Element,[Element|R1],R2) :-
        delete(Element,R1,R2).
delete(Element,[A|R1],[A|R2]) :-
        \+(Element=A),
        delete(Element,R1,R2).

%  の方がずっと良い。


delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        append(L0,R,DeletedList).
delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        delete(R,List,DeletedList_1),
        append(L0,DeletedList_1,DeletedList).

%  敢えてappend(L0,[Element|R],List), を二度繰り返します。その代償として
%  memberのようにひとつずつ解決していくもので、大変面白いのですが、
%  これで最終的に全部削除したリストを得たいと思ってもなかなかうまくいきません。

delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        append(L0,R,DeletedList).
delete(Elemnet,List,DeletedList) :-
        append(L0,[Element|R],List),
        delete(R,List,DeletedList_1),
        append(L0,DeletedList_1,DeletedList).
delelte(_,List,List).

%  を加えれば良いのですが、実は、これが最後の削除で解がでたその時点で、
%  さらに解があるかどうかわからない。わからなければバックトラックしてみる
%  だろう。それで第三節でtrueになり「同じ」解がでますが、一つ前にでた
%  解と同じであるか確かめるにはassertしておく以外に方法がありません。

delete(Elemnet,List,DeletedList,R) :-
        append(L0,[Element|R],List),
        append(L0,R,DeletedList).
delete(Elemnet,List,DeletedList,R) :-
        append(L0,[Element|R_1],List),
        delete(R_1,List,DeletedList_1,R),
        append(L0,DeletedList_1,DeletedList).

%  このように解が得られたときに、削除した要素の後のListがRとして得られれば、

?- delete(3,[1,2,3,4,5,3,7],L,R),\+(append(_,[3|_],R)).

%  とすることでLに全部を削除したListとしがLに得られます。