在Prolog中删除列表中的所有成员而不统一

Wil*_*sem 5 list prolog unification prolog-dif

可能重复:
Prolog delete:不删除与Element统一的所有元素

在Prolog中,如果你这样写:

delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L).
Run Code Online (Sandbox Code Playgroud)

结果将是:

L = [ (1, 2), (3, 4)].
Run Code Online (Sandbox Code Playgroud)

什么是正常的,因为_变量在第一个元素中与1绑定,它搜索(1,1)的其他元素并删除它们.

有没有办法阻止这种统一发生并删除表格的所有成员(1,_).在这种情况下,结果必须是:L = [(3,4)].

sal*_*lva 4

delete_pattern([], _, []).
delete_pattern([H|T], P, O) :-
    (    H \= P
    ->   O = [H|O1],
         delete_pattern(T, P, O1)
    ;    delete_pattern(T, P, O) ).
Run Code Online (Sandbox Code Playgroud)

您可能希望使用其他谓词进行过滤,这会导致语义略有不同,如==/2or =@=/2