我正在尝试从给定列表中删除重复项并返回一个新列表。
例如为:
?-removeDuplicates([a,a,b,c],L).
应该返回L=[a,b,c]
removeDuplicates([],[]).
removeDuplicates([Head|Tail], List) :-
(
member(Head,Tail),
removeDuplicates(Tail, prevList),
append([], prevList, List)
);
(
not(member(Head,Tail)),
removeDuplicates(Tail,prevList),
append(Head, prevList, List)
).
为了做到这一点,我试图实现一个或声明。
如果Head存在于Tail中,那么我调用递归,我的新List与prevList相同。另一方面,如果Tail中不存在Head,那么我调用递归并将Head追加到prevList并将结果放入List中。
出于某种原因,我总是得到错误的回答。
你能帮我理解我做错了吗?答案 0 :(得分:2)
如果使用跟踪器,则在递归结束时(列表为空)发生removeDuplicates([], prevList)
时,程序将失败。我认为你的问题太复杂了。只需几行代码即可轻松解决这个问题:
removeDup([],[]).
removeDup([H|T],[H|T1]):-
\+member(H,T),
removeDup(T,T1).
removeDup([H|T],L):-
member(H,T),
removeDup(T,L).
?- removeDup([1,2,3,4,2,3,5,4,0],L).
L = [1, 2, 3, 5, 4, 0]
false
或者更短,使用if:
removeDup([],[]).
removeDup([H|T],[H1|T1]):-
(
\+member(H,T) ->
H = H1,
removeDup(T,T1);
removeDup(T,[H1|T1])
).