Sto cercando di rimuovere le voci duplicate da un elenco in prolog. Quindi una lista [a, b, a, c, b, a] restituirebbe [a, b, c]. Non posso usare nessuna funzione incorporata. Ho cercato qui e ho trovato questo codice.Prolog: rimozione dei duplicati
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).
ma che avrebbe preso la mia lista e ritornare [c, b, a] non [a, b, c]
devo rimuovere il codice che avrà un elemento e una lista e restituire un elenco con occorrenze di quell'elemento nell'elenco rimosso. Così ho cercato di incorporarlo nel mio metodo di rimozione dei duplicati, ma non capisco molto bene il prolog, quindi non funziona. Logicamente voglio prendere una lista contro la testa con la chiamata ricorsiva sulla nuova lista meno tutte le occorrenze della testa. Questo è come apparirebbe il codice in 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));
Quindi questo è quello che ho provato nel prologo
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).
Che cosa mi manca?
Grazie a SQB è esattamente la logica di ciò che stavo cercando di fare. Anche guardando il tuo codice non riesco a trovare dove ho fatto il mio errore, loro hanno letto lo stesso per me. Eppure il tuo funziona e il mio rimane bloccato in un loop infinito. – user3043403
hmm penso di aver capito, ordine entro: - è importante quindi la mia linea. remvdub ([H | T], [H | Ans]): - remvdub (Ans1, Ans), remv (H, T, Ans1). Dovrebbe essere remvdub ([H | T], [H | Ans]): - remv (H, T, Ans1), remvdub (Ans1, Ans). – user3043403