如何从序言中的变量列表中删除变量?

How to remove a variable out of a list of variables in prolog?

我想实现DPLL算法。因此,我必须删除其他变量列表中某个变量的所有出现,例如从 [neg(X), pos(X), neg(Y), pos(Y)] 中删除 neg(X) 应该 return [pos(X), neg(Y), pos(Y)]。 我已经尝试了一些内置谓词,如 exclude/3 或 delete/3,但都给我留下了假设 X = Y 和结果 [pos(X), pos(Y)],删除了所有 neg(_),但是我只想删除 neg(X) 而不是 neg(Y)。这有可能吗?

来自 Logtalk 库 list 对象:

delete([], _, []).
delete([Head| Tail], Element, Remaining) :-
    (   Head == Element ->
        delete(Tail, Element, Remaining)
    ;   Remaining = [Head| Tail2],
        delete(Tail, Element, Tail2)
    ).

调用示例:

?- delete([neg(X), pos(X), neg(Y), pos(Y)], neg(X), Rest).
Rest = [pos(X), neg(Y), pos(Y)].

关键是使用标准==/2术语相等谓词而不是标准=/2统一谓词。