Prolog 总是返回错误语句的追加

Prolog 总是返回错误语句的追加,prolog,Prolog,我试图从给定列表中删除重复项并返回一个新列表 e、 g.: ?-removeDuplicates([a,a,b,c],L)。应返回L=[a,b,c] removeDuplicates([],[]). removeDuplicates([Head|Tail], List) :- ( member(Head,Tail), removeDuplicates(Tail, prevList), append([],

我试图从给定列表中删除重复项并返回一个新列表

e、 g.:
?-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)
       ).
为了做到这一点,我尝试实现or语句

如果Head存在于Tail中,那么我调用递归,我的新列表与prevList相同。另一方面,如果Head在Tail中不存在,那么我调用递归并将Head附加到prevList,然后将结果放入List

由于某种原因,我总是得到错误的答案


你能帮我理解我做错了什么吗

如果您使用跟踪器,当发生这种情况时,您的程序会失败。
removedupplicates([],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])
    ).

prevList
是一个原子,不能更改原子。所有变量都以大写字母开头。很好!我不知道我是怎么错过的。。谢谢!另外,当我附加:D时,Head应该转换成一个列表,这是我的另一个问题!另外,
语句,
最好与如下条件语句结合使用:
((if)->then;else)
,正如
()
只说“这是一个单独的分组术语”,它们不会在运行时自动触发求值。例如,您可以说
H=(somecall(Result)、processResult(Result)、其他一些东西,其中对H的第二个调用是实际评估您之前分配给它的内容的调用。这是为了允许您动态生成调用,这是您稍后进入“Prolog泛型”时将遇到的更高级的东西因为没有更好的术语。