remove_duplicates/2 — elimină duplicatele
Definiți un predicat remove_duplicates/2 care șterge toate duplicatele din lista dată ca prim argument și întoarce rezultatul în al doilea argument.
?- remove_duplicates([a, b, a, c, d, d], List).
List = [b, a, c, d]
Observație: varianta din breviar păstrează fiecare element la ultima lui apariție în lista originală (de aceea
aapare dupăbîn rezultat). Alte versiuni ar păstra prima apariție — comportament diferit.
Hint: două clauze — dacă
Hnu mai apare în coadă, îl păstrezi; altfel îl arunci și continui pe coadă. Foloseștenot(member(H, T))pentru test.
Te-ai blocat?
editor
soluție
remove_duplicates([], []) :- !.
remove_duplicates([H | T], [H | TR]) :-
not(member(H, T)),
remove_duplicates(T, TR), !.
remove_duplicates([_ | T], TR) :-
remove_duplicates(T, TR).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (3 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
remove_duplicates([a, b, a, c, d, d], List).
așteptat: List = [b,a,c,d]
?
remove_duplicates([], List).
așteptat: List = []
?
remove_duplicates([x, x, x], List).
așteptat: List = [x]