从列表中删除重复

时间:2015-06-03 21:58:14

标签: list prolog

我正在尝试从列表中删除重复但我得到false,这是我的代码:

remov([],[]):-!.
remov([T|Q],[T|R]):-not(member(T,R)),remov(Q,[T|R]).
remov([T|Q],R):-member(T,R),!,remov(Q,R).

member(E,[]):-!,fail.
member(T,[T|Q]):-!.
member(E,[T|Q]):-member(E,Q).

1 个答案:

答案 0 :(得分:1)

谓词if ($num > 0) { echo $ID_utilisateur; } $reqVerif->free_result; $reqVerif->close(); 的上述实现过度“使用”了元逻辑结构remov/2member/2,这几乎破坏了所有声明性方面 - 迫使我们专注于大量细致的细节。有关详细信息,请参阅

让我们根据iwhen/2(!)/0重新实施not/1,如下所示:

remov/2

这是如何运作的?

  • 内置谓词sort/2根据standard order对Prolog术语列表进行排序,从而消除了过程中的重复项。 请注意,如果输入列表包含变量,则remov(Xs,Ys) :- iwhen(ground(Xs), sort(Xs,Ys)). 可能不会保留

  • sort/2可确保在使用sort/2时进行充分的实例化。

示例查询:

?- remov([1,2,3,1,2],Xs).
Xs = [1,2,3].

?- remov(Xs,Ys).
ERROR: Arguments are not sufficiently instantiated