追加始终返回虚假陈述

时间:2018-03-28 21:36:14

标签: prolog

我正在尝试从给定列表中删除重复项并返回一个新列表。

例如为:
 ?-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中。

出于某种原因,我总是得到错误的回答。

你能帮我理解我做错了吗?

1 个答案:

答案 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])
    ).