我正在尝试从prolog列表中删除重复条目。因此,一个列表[a,b,a,c,b,a]将返回[a,b,c]。我不能使用任何内置函数。在这里搜索后,我找到了以下代码。
member(X,[X|_]) :- !.
member(X,[_|T]) :- member(X,T).
set([],[]).
set([H|T],[H|Out]) :- not(member(H,T)), set(T,Out).
set([H|T],Out) :- member(H,T), set(T,Out).
但是这会将我的列表转换成[c,b,a]而不是[a,b,c]
我已经删除了一个代码,它将取一个元素和一个列表,并返回一个在列表中该元素出现次数已被删除的列表。因此,我试图将其合并到我的去重方法中,但我并不真正了解Prolog,所以它没有起作用。从逻辑上讲,我想取一个列表,用新列表减去所有头部出现次数的递归调用来连接头部。这就是SML中代码的样子。
fun remv(_,nil) = nil
| remv(a,x::xs) = if x=a then remv(a,xs) else x::remv(a,xs);
fun remvdub (nil) = nil
| remvdub(x::xs) = x::remvdub(remv(x,xs));
这是我在Prolog中尝试的内容。
remv(_,[],[]).
remv(X,[X|T],Ans) :- remv(X,T,Ans).
remv(X,[H|T],[H|K]) :- remv(X,T,K).
remvdub([],[]).
remvdub([H|T],[H|Ans]) :- remvdub(Ans1,Ans), remv(H,T,Ans1).
我错过了什么?