このディレクトリの索引
http://viva2ch.net/tech/976462999.html
#  プロローグについて質問です。 
#  SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 
#  atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という 
#  プログラムを作りたいのですが…できません。 
#  
#  動作は 
#  remdup([a, b, c, a, d, c], X). 
#  は 
#  X=[a, b, c, d] 
#  となるはずです。 
#  
#  本に載っていたのを試したのですが 
#  順番が逆になってしまいます。↓ 
#  
#  remdup(L, M) :- dupacc(L, [], M). 
#  dupacc([], A, A). 
#  dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). 
#  dupacc([H|T], A, L) :- dupacc(T, [H|A], L). 
#  
#  結果: 
#  1 ?- remdup([a, b, c, a, d, c], X). 
#  X = [d, c, b, a] 
#  
#  reverse()を「使わずに」どうにか完成させたいのですが 
#  できますでしょうか? 
#  ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 
#  ですからそれらは使えます。 
#  どうかお助けください。m(__)m

atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2) :-
        remdup(L1,[],L2).

remdup(L1,L2) :-
        dupacc(L1,[],L2). 

dupacc([],_,[]). 
dupacc([H|R1],L2,R3) :-
        member(H,L2),
        dupacc(R1,L2,R3). 
dupacc([H|R1],L2,[H|R3]) :-
        \+(member(H,L2)),
        dupacc(R1,[H|L2],R3).