larsman のヒントに従う場合に注意する価値のある技術的な複雑さがあり、この方法で直接実装します
locdiff([], _, []).
locdiff([A|T], [A|_], R) :-
!, locdiff(T, [A|_], R).
locdiff([H|T], L2, [H|T2]) :-
locdiff(T, L2, T2).
これとともに
?- locdiff([(a,1), (b,2), (b,3), (c,3), (c,4)], [(b,_)], L3).
L3 = [ (a, 1), (b, 3), (c, 3), (c, 4)].
最初のインスタンスが削除され、最後のインスタンスが削除されていることがわかります。これは、最初の一致で無名変数がバインドされ、最後の一致を除いて後続の一致が禁止されるためです。(b,_)
次に、完了した手順は次のようになります
locdiff([], _, []).
locdiff([H|T], [A|_], R) :-
\+ \+ H = A, % double negation allows matching without binding
!, locdiff(T, [A|_], R).
locdiff([H|T], L2, [H|T2]) :-
locdiff(T, L2, T2).
今、結果はあなたが必要としているものです。
または、過度のバインディングを避けて、パターン マッチングをより正確にする必要があります。
locdiff([], _, []).
locdiff([(A,_)|T], [(A,_)|_], R) :-
!, locdiff(T, [(A,_)|_], R).
locdiff([H|T], L2, [H|T2]) :-
locdiff(T, L2, T2).
?- locdiff([(a,1), (b,2), (b,3), (c,3), (c,4)], [(b,_)], L3).
L3 = [ (a, 1), (c, 3), (c, 4)].
SWI-Prolog で /3 を除外するなど、一部のライブラリには特定の機能があることに注意してください。
eq([(E,_)|_], (E,_)).
locdiff(L, E, R) :-
exclude(eq(E), L, R).