Prolog 总是返回错误语句的追加
我试图从给定列表中删除重复项并返回一个新列表 e、 g.: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([],
?-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应该转换成一个列表,这是我的另一个问题!另外,或
语句,正如您正确识别的,code>最好与如下条件语句结合使用:((if)->then;else)
,正如()
只说“这是一个单独的分组术语”,它们不会在运行时自动触发求值。例如,您可以说H=(somecall(Result)、processResult(Result)、其他一些东西,其中对H的第二个调用是实际评估您之前分配给它的内容的调用。这是为了允许您动态生成调用,这是您稍后进入“Prolog泛型”时将遇到的更高级的东西因为没有更好的术语。