首页 > 解决方案 > 在保留顺序的同时删除重复项,Prolog

问题描述

removeDup([],[]).
removeDup([H|T],T1) :- member(H,T), removeDup(T,T1).
removeDup([H|T],T1) :- not(member(H,T)), removeDup(T,Q), append(T1,[H],Q).

这会删除重复项,但会更改顺序。对于追加,我希望将 H 添加到 T1 的末尾,然后设置为 Q。

我怎样才能保留订单?

预期行为:

?- removeDup([1,2,3,2,4,5],X).
X = [1,2,3,4,5]

标签: prolog

解决方案


rmdup(Xs, Ys) :- rmdup1(Xs, Ys, []).

Zs是列表中非重复元素的累加器。如果X在 中Zs,则忽略它,否则将其推送到列表中。

rmdup1([], Ys, Zs) :- reverse(Ys, Zs).
rmdup1([X|Xs], Ys, Zs) :-
    member(X, Zs) -> rmdup1(Xs, Ys, Zs); 
    rmdup1(Xs, Ys, [X|Zs]).

推荐阅读