Uppsala universitet
Institutionen för lingvistik
Logikprogrammering I, vt 2002
Leif-Jöran Olsson

Laboration 5: Programmeringsmetodik och datastrukturer

Innehåll

  1. Syfte
  2. Genomförande
  3. Uppgifter
  4. Redovisning

1 Syfte

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.

2 Genomförande

Tänk på att anteckna frågor och annat som dyker upp inför genomgången. Jobba gärna två och två.


3 Övningar

  1. Konsultera /local/kurs/lpI02/informera.pro. Ställ frågan, starta_informera. Följ instruktionen.

  2. 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å).
         
  3. 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
        
  4. 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
        
  5. 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.

  6. 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.

  7. 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.

  8. Vad ger frågorna förälder(lotta, per) =.. Lista och film =.. Lista för svar?

  9. 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å.

  10. 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).
        
  11. 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.


4 Redovisning

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:


Lycka till! Och kom ihåg - prolog älskar er alla jättemycket!


Senast ändrad av Leif-Jöran Olsson 2002-05-15 10:59