附加总是返回false语句

  • 本文关键字:false 语句 返回 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)
       ).

为了做到这一点,我尝试实现或说明。

如果头部尾巴存在,那么我称之为递归,而我的新列表与vervelist相同。另一方面,如果尾部不存在,则我将递归调用并附加头以脱名单并将结果列入列表。

由于某种原因,我总是会被错误作为答案。

您能帮我了解我做错了什么吗?

如果您使用示踪剂,则在递归末尾发生的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

或更短,使用:

removeDup([],[]).
removeDup([H|T],[H1|T1]):-
    (   
      +member(H,T) ->
      H = H1,
      removeDup(T,T1);
      removeDup(T,[H1|T1])
    ).

最新更新