我想從序言中的列表中刪除重複的條目。因此,列表[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]
我刪除代碼,將採取元素和列表,並返回一個列表列表中該元素的出現被刪除。所以我試圖將其納入我的刪除重複的方法,但我不太瞭解序言非常好,所以它不工作。從邏輯上講,我希望在新列表中使用遞歸調用的頭部減去頭部的所有事件。這是代碼在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));
原來這就是我試圖在序言
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).
我缺少什麼?
謝謝SQB,這正是我想要做的邏輯。即使在查看您的代碼時,我似乎也無法找到我犯了錯誤的地方,但他們對我也一樣。然而,你的工作,我的卡在一個無限循環。 – user3043403
嗯,我想我想通了,訂單內: - 是重要的,所以我的線。 remvdub([H | T],[H | Ans]): - remvdub(Ans1,Ans),remv(H,T,Ans1)。應該是remvdub([H | T],[H | Ans]): - remv(H,T,Ans1),remvdub(Ans1,Ans)。 – user3043403