0

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

4

1 回答 1

0

从 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 统一谓词。

于 2020-01-31T16:31:28.043 回答