Nada

Övningar i Prolog

Fredrik Olsson

Del 1: Bekanta dig med Prolog: enkla databaser

    1. Skriv in följande program:
          minimum(X, Y, X):-
              X =< Y.
          minimum(X, Y, Y):-
              X >= Y.
      
    2. Läs in programmet i Prolog. Ställ sedan följande frågor:
          |?- minimum(5, 17, X).
          |?- minimum(12, 12, X).
          |?- minimum(51, 7, X).
          |?- minimum(abc, abd, X).
      
    3. Ändra programmet såa tt det använder @=< och @>= för att jämföra termer. Konsultera filen och prova frågorna i b igen.
    4. Begär flera svar (lösningar) för frågorna i b genom att ge semikolon (;) efter svaren. Varför ger Prolog fler svar för en del frågor?
    5. Man kan använda det inbyggda predikatet trace för att se Prologs arbetssätt steg för steg. Skriv frågan:
          |?- trace, minimum(6, 2, Z).
      
      och undersök hur Prolog försöker verifiera den.

    1. Beskriv din familj med hjälp av faktasatser för
          far(X, Y).    % X är far till Y
          mor(X, Y).    % X är mor till Y
          man(X).       % X är man
          kvinna(X).    % X är kvinna
      
    2. Fortsätt beskrivningen genom att ge regler för
          farfar(X, Y).    % X är farfar till Y
          morfar(X, Y).    % X är morfar till Y
          moster(X, Y).    % X är moster till Y
          farbror(X, Y).   % X är farbror till Y
          förälder(X, Y).  % X är förälder till Y
      
    3. Testa om databasen är korrekt genom att ställa frågor om din familj. Om något svar inte stämmer ska du rätta programmet. Du kan eventuellt behöva definiera nya predikat.
    4. Ställ frågor igen om din familj och spåra frågorna med trace.

    1. Lägg till fler personer till databasen från föregående uppgift så att du kan prova program för kusin och syssling (tremänning).
    2. Skriv in följande programsatser:
          % syskon(X, Y)
          % X och Y är syskon om X och Y har samma förälder.
          syskon(X, Y):-
              förälder(Z, X),
      	förälder(Z, Y).
      
          % kusin(X, Y)
          % X och Y är kusiner om X och Ys föräldrar är syskon.
          kusin(X, Y):-
              förälder(Z, X),
      	förälder(W, Y),
      	syskon(Z, W).
      
          % syssling(X, Y)
          % X och Y är sysslingar om X och Ys föräldrar är kusiner.
          syssling(X, Y):-
              förälder(Z, X),
              förälder(W, Y),
              kusin(Z, W).
      
    3. Testkör programmet och använd trace för att följa utvärderingen steg för steg.

  1. Givet en släktdatabas över din släkt. Använd predikatet setof/3 för att samla namnen på
    1. alla söner
    2. alla döttrar
    3. alla morbröder

Del 2: Listor

  1. Skriv ett program som delar upp en lista i två listor så att de två första elementen kommer i en lista och resten av listan i den andra. Exempel: listan [25, 42, 13, 7, 10] skall delas upp i listorna [25, 42] och [13, 7, 10].

  2. Skriv ett program som lyckas om båda orden tycka och om finns med i en lista med ord. Om inte båda orden finns med skall frågan lyckas.

  3. Skriv ett program för mindre_än_alla(Element, Lista) som gäller när Element är mindre än alla element i listan Lista. Anta att Lista innehåller heltal. Exempel:
        |?- mindre_än_alla(3, [7, 6, 11, 4]).
        yes
    

  4. Skriv ett rekursivt program som tar fram det n:te elementet i en lista; tag_fram_nte(N, Lista, Element) Exempel:
        |?- tag_fram_nte(5, [12, 3, 4, 6, 2, 1, 9, 17], X).
        X=2
        yes
    

  5. Skriv ett program som tar fram det element som ligger efter elementet X när X ges som indata; tag_fram_efterföljare(X, Lista, EfterX). Exempel:
        |?- tag_fram_efterföljare(2, [12, 3, 4, 6, 2, 9, 1, 17], Y).
        Y=9
        yes
    

  6. Definiera antal_visst_element(Lista, Element, Antal)., dvs. en relation mellan en lista och antal förekomster av elementet Element i listan Lista. Exempel:
        |?- antal_visst_element([12, 3, 4, 6, 2, 4, 9, 1, 4, 17], 4, X).
        X=3
        yes
    

  7. Skriv programmet ta_bort_alla(Element, Lista, Nylista), dvs. ett program som tar bort alla förekomster av Element så att Nylista bildas. Exempel:
        |?- ta_bort_alla(4, [12, 3, 4, 6, 2, 4, 9, 1, 4, 17], X).
        X=[12, 3, 6, 2, 9, 1, 17]
        yes
    

  8. Skriv programmet ta_bort_nte(N, Lista, Nylista), dvs. ett program som tar bort n:te elementet i Lista. Resultatet är Nylista. Exempel:
        |?- tag_bort_nte(4, [12, 3, 4, 6, 2, 9, 1, 17], X).
        X=[12, 3, 4, 2, 9, 1, 17]
        yes
    

  9. Skriv ett program som räknar antalet positiva tal, negativa tal och antalet nollor i en lista av heltal. Exempel:
        ?|- räkna([5, -4, -3, 2, 5, 0, 0, -3], Postal, Negtal, Nollor).
         Postal=3
         Negtal=3
         Nollor=2
         yes
    

  10. Skriv ett program som beräknar medeltalet av talen i en lista.

Del 3: En lite större uppgift: tänk på ett ord

Skriv ett program som ger datorn ett ord att "tänka på" och låter användaren försöka gissa ordet. Om användaren matar in samma ord så skall han/hon gratuleras och erbjudas en ny omgång. Om ordet inte är rätt så skall programmet ange de bokstäver som är rätt placerade i förhållande till de båda orden. Även bokstäver som finns i det hemliga ordet men på fel plats ska anges, som i spelet MasterMind.

T.ex.orden "sommar" och "vinter" har en bokstav placerad på överensstämmande plats, dvs. bokstaven "r" på plats 6. Orden "sommar" och "solsken" har 2 bokstäver placerade på överensstämmande plats, dvs. "s" och "o" på plats 1 och 2. Exempel: antag att ordet är "sommar"

    Ge ett ord: vinter.
    [*, *, *, *, *, r]
    Ge ett ord: solsken
    [s, o, *, *, *, *]
    Ge ett ord: rymlig
    [*, *, m, *, *, *] ingår r

^ Upp till kursplanen.


Sidansvarig: Fredrik <fredriko@sics.se>
Senast ändrad 2 november 1998
Tekniskt stöd: <webmaster@nada.kth.se>