Uppsala universitet
Institutionen för lingvistik
Logikprogrammering I, vt 2002
Leif-Jöran Olsson
Syftet med denna laboration är att få en grundläggande erfarenhet av generalisering och förenkling av problem och formulering av olika datastrukturer i ett Prologsystem.
Tänk på att anteckna frågor och annat som dyker upp inför genomgången. Jobba gärna två och två.
- Konsultera /local/kurs/lpI02/informera.pro. Ställ frågan, starta_informera. Följ instruktionen.
- Skriv in exemplet, dag/2, från föreläsningen om strukturerade data. Gör predikat för månad och år också. Ställ sedan frågor med de tre predikaten, som sedan listas i labbrapporten.
Exempelfrågor:| ?- år(datum(A,B,C), År). | ?- månad(datum(2001,05,19), Vadnudå).- Skriv ett predikat, ta_fram_sista/1, som skriver ut sista elementet i en lista. Ställ dessutom några frågor, som sedan listas i labbrapporten.
| ?- ta_fram_sista([a,b,c,d]). sista elementet är: d yes- Skriv ett predikat, ta_bort_dubbletter/2, som tar bort dubbletter i en lista.
| ?- ta_bort_dubbletter([a,a,b,c,a,d,d], Lista_utan_dubbletter). Lista_utan_dubbletter = [a,b,c,d] ? yes- Ofta vill man gå från strängar till bokstavslistor eller tvärt om. Ställ några frågor med predikatet atom_codes/2, till exempel, atom_codes(filmen, Bokstavslista), atom_codes(Sträng, [49,50,51]) och atom_codes(123, Bokstavslista), som sedan listas i labbrapporten.
- Ställ några frågor med predikatet number_codes/2, till exempel, number_codes(Nummer, [49,50,51]), number_codes(123, Sifferlista), och number_codes(filmen, Bokstavslista), som sedan listas i labbrapporten.
De båda ovanstående predikaten ersätter name/2, som inte längre ska användas.
- Dokumentera kort predikaten ta_fram_sista/1, ta_bort_dubbletter/2 ovan, samt medlem/2 och slå_ihop/3. Ange då också hur de kan användas med ?, + och - för argumenten.
- Vad ger frågorna förälder(lotta, per) =.. Lista och film =.. Lista för svar?
- Använd predikatet =.. på alla de sätt som ?Term =.. +Lista och +Term =.. ?Lista säger att de kan användas på. Ange även de sätt det inte kan/bör användas på.
- Gör en kopia av /local/kurs/lpI01/informera.pro. Ändra starta_informera och informera, så att informera/0 blir informera/1, används enligt informera(-Tal), och en ny regel informera2(+Tal) som subtraherar 1 från det tal som informera ger. Flytta också över lämpliga delar från informera till informera2, nu när det är sista frågan i programmet.
starta_informera :- informera(Taltal), informera2(Taltal).- Testa setof/3, bagof/3 och findall/3, (dessa inbyggda predikat gås igenom vid nästa föreläsning), med predikatet:
mönster('', 'sib'). mönster('', 'sig'). mönster('et', 'sdb'). mönster('ets', 'sdg'). mönster('', 'pib'). mönster('', 'pig'). mönster('en', 'pdb'). mönster('ens', 'pdg').Exempelfrågor:| ?- setof(Koddel2, mönster(Ändelse, Koddel2), Lista). | ?- bagof(Koddel2, mönster('', Koddel2), Lista). | ?- findall(Ändelse, mönster(Ändelse, Koddel2), Lista).Alla frågor och svar listas tillsammans i labbrapporten.
Redovisning lämnas i form av skriftlig rapport till Leif-Jöran Olsson (i postfacket eller via e-post i postscriptformat eller vanlig text) senast klockan tio den tjugotredje maj.
Rapporten ska innehålla/behandla det som tas upp i uppgiftsbeskrivningen ovan.
Rapporten kommer att ges betyget godkänd, väl godkänd eller underkänd enligt följande:
- För godkänt krävs rimliga svar på uppgift ett till åtta.
- För väl godkänt krävs därutöver rimliga svar på uppgifterna nio till elva och att man för ett resonemang i anslutning till alla uppgifterna. (Alltså inte bara ja- och nej-svar eller inklistring.)
Lycka till! Och kom ihåg - prolog älskar er alla jättemycket!