Prologda bir listeden yinelenen girdileri kaldırmaya çalışıyorum. Yani bir liste [a, b, a, c, b, a] [a, b, c] döndürecekti. Yerleşik işlevleri kullanamam. Bu kodu araştırdım ve bu kodu buldum.Prolog: Yinelenenleri Kaldırma
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).
Ama bu [c, b, a] değil listemi alıp dönecekti [a, b, c] Ben bir element ve bir liste alıp bir listesini döndürür kodu kaldırmak zorunda
Listedeki o öğe oluşumları kaldırıldı. Bu yüzden onu kaldırmayı yinelemeli yöntemime dahil etmeye çalıştım, ancak prolog'u çok iyi anlamadım, bu yüzden çalışmıyor. Mantıksal olarak bir liste almak isterim ki, kafanın tüm oluşumları hariç olmak üzere, yeni liste üzerindeki özyinelemeli bir çağrıyla başa çıkmak. Kodun sml'de nasıl görüneceği budur.
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));
Yani bu ben Prologun
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).
yılında ben eksik çalıştı nedir?
Teşekkürler SQB, tam olarak ne yapmaya çalıştığımın mantığı. Kodunuzu incelerken bile, hata yaptığım yeri bulamıyorum, aynı şeyi bana okuyorlar. Yine de seninkilerin ve benimki infinte döngüsünde sıkışıp kalıyor. – user3043403
hmm Bunu düşündüm sanırım, sipariş verin: - benim hattım çok önemli. remvdub ([H | T], [H | Ans]): - remvdub (Ans1, Ans), remv (H, T, Ans1). Remvdub ([H | T], [H | Ans]) olmalıdır: - remv (H, T, Ans1), remvdub (Ans1, Ans). – user3043403