tar bort dubbletter ur lista (Prolog)
Hej,
jag ska definiera ett predikat som tar två argument där ena är en lista och det andra är resultatet av samma lista fasat utan dubbletter
ex.
remove_duplicates([a,b,c,b,d,a,c,d], L).
ska ge L=[a,b,c,d]
och denna uppgift är för omfattande för mig att lösa direkt då jag precis börjat med Prolog och undrar vilka delproblem jag kan bryta ner denna för att sen sätta samman, kan inte tänka så kreativt att jag kommer på en lösning direkt så vill gärna veta hur man kan bryta ner detta så jag lär mig delproblemen och sen kan sätta ihop den.
tips?
1. Sortera listan.
2. Undersök första elementet i listan.
3. Testa om elementet i listan finns i L,
3.1 om elementet inte finns i L kopiera det till L,
3. 2 om elementet finns i L kopiera inte elementet till L,
3.3 gå vidare till nästa element
4. Gör om steg 3 tills hela listan gåtts igenom.
Aerius skrev:1. Sortera listan.
2. Undersök första elementet i listan.
3. Testa om elementet i listan finns i L,
3.1 om elementet inte finns i L kopiera det till L,
3. 2 om elementet finns i L kopiera inte elementet till L,
3.3 gå vidare till nästa element
4. Gör om steg 3 tills hela listan gåtts igenom.
okej tack för tips!
glömde tillägga att listan ska printas ut i samma ordning som det kom in dvs inte får sorteras.
men man borde väl kunna göra samma sak då väl? dvs utan punkt 1
Spelat det någon roll vilken man behåller i en dublett? Första eller andra?
Laguna skrev:Spelat det någon roll vilken man behåller i en dublett? Första eller andra?
ja för om man tar första element och sen kollar om den finns med i resterande lista å tar bort den om den gör det så kommer ordningen ändras.
jag försöka lägga in ett element från en given lista till en ny lista och sedan lägga in nästa element förutsatt att det inte redan finns i den nya listan men får inte till det
Ordningen ändras ju hur du än gör. Jag undrade om det står något i uppgiftstexten om det.
T.ex. om du har 1 2 3 2 så kommer det en tvåa efter en trea. Tar du bort den andra tvåan så gör det inte det längre.
Laguna skrev:Ordningen ändras ju hur du än gör. Jag undrade om det står något i uppgiftstexten om det.
T.ex. om du har 1 2 3 2 så kommer det en tvåa efter en trea. Tar du bort den andra tvåan så gör det inte det längre.
okej , jag menar att utfallet ska bli följande
in: [1, 2, 3, 4, 1, 2, 2] ska bli [1, 2, 3, 4]
och inte in: [1, 2, 3, 4, 1, 2, 2] ska inte blir [3, 4, 1, 2]
uppgiften lyder "Vi vill definiera ett predikat som givet en lista som
representerar en sekvens skapar en annan lista som innehåller
alla element som förekommer i inlistan i samma ordning, men
om ett element har fōrekommit tidigare i listan skall det
inte vara med i den resulterande listan."
OK, då vet jag vad uppgiften är. Hur ser din kod ut hittills?
Laguna skrev:OK, då vet jag vad uppgiften är. Hur ser din kod ut hittills?
jag har lyckats få bort dubbletter men då ändras ordningen
remove_duplicates([],[]).
remove_duplicates([H|T], List) :-
member(H,T),
remove_duplicates(T, List).
remove_duplicates([H|T], [H|T1]) :-
\+member(H,T),
remove_duplicates(T, T1).
kan ej tänka kretivt för har aldrig kodat innan i Prolog så vet inte hur man ska dela upp problemet i delproblem som jag kan lösa sen sätta ihop allt