Maremare behöver inte mer hjälp
Maremare 1044 – Fd. Medlem
Postad: 2 okt 2020 14:24

Prolog övning

Hej,

Jag har precis börjat programmera i Prolog och har tittat på en kod som ska returnera det sista elementet i en lista som ser ut såhär:

my_last(X,[X]).
my_last(X,[_|L]) :- my_last(X,L).

exempel:

?- my_last(X,[a,b,c,d]).
X = d

så jag ska göra motsvarande fast som returnerar första elementet och gjorde såhär:

my_first(X,[X]).
my_first(X,[F|_]) :- my_first(X,F).

tänkte att man bara byter plats på andra raden i regeln men det funkar inte och förstår inte varför

någon som har något tips?

Laguna Online 30719
Postad: 2 okt 2020 16:09

Om du formulerar det logiskt så betyder andra klausulen i my_last

   "X är sista elementet i en lista om X är sista elementet i listan du får om du tar bort första elementet"

Din my_first kan formuleras

   "X är första elementet i en lista om X är första elementet i första elementet i listan"

Det är ju inte alls vad vi vill göra. Ett sådant predikat är inte absurt, men det gör något annat. T.ex. är my_first(1,[[[1],3],4]) sant.

"X är första elementet i en lista" går att uttrycka med en matchning utan något "om". En lista (som inte är tom) kan alltid matchas av [X|Y]. Vilket är då första elementet?

Maremare 1044 – Fd. Medlem
Postad: 3 okt 2020 10:35
Laguna skrev:

Om du formulerar det logiskt så betyder andra klausulen i my_last

   "X är sista elementet i en lista om X är sista elementet i listan du får om du tar bort första elementet"

Din my_first kan formuleras

   "X är första elementet i en lista om X är första elementet i första elementet i listan"

Det är ju inte alls vad vi vill göra. Ett sådant predikat är inte absurt, men det gör något annat. T.ex. är my_first(1,[[[1],3],4]) sant.

"X är första elementet i en lista" går att uttrycka med en matchning utan något "om". En lista (som inte är tom) kan alltid matchas av [X|Y]. Vilket är då första elementet?

aa okej okej jag gjorde bara såhär utan någon rekursion

my_First(Head, [Head|_]).

det verkade funka men det är utan någon regel eller rekursion, det kanske inte behövs för första element?

Har bara lite svårt för hur jag ska tänka när jag ska skriva kod. tex om jag ska ta bort dubbletter ur en lista eller lägga till så varje element får en dubblett etc. ska man rita eller bara kolla på facit och förstå logiken för att sedan pröva den på andra exempel? 

Laguna Online 30719
Postad: 3 okt 2020 11:46

Bra,

   my_First(Head, [Head|_]).

är precis rätt. Det behövs ingen rekursion, för man tittar ju bara på första elementet i listan.

Prolog är knepigt. Alla sätt att lära sig är väl bra.

Svara
Close