Prologi ülesanded

  1. (2. sept., tähtaeg 9. sept., pikendatud 16. sept.) Olgu lausearvutuse valemites kasutusel järgmised sümbolid:
    • lausemuutujad: a, b, c , d ...
    • tehted: not, and, or, ->, <->
    • sulud: (, )
    Kirjeldage Prologis predikaat knk/2, mis teisendab lausearvutuse valemi konjunktiivsele normaalkujule, kasutades implikatsiooni-, ekvivalentsi-, eituse- ja distributiivsuseseadusi. Näiteks
         ?-knk(a->b,X).
         X=not a or b
         ?-knk(a->b->c,X).
         
  2. (13. sept., tähtaeg 23. sept.) Konstrueerige predikaadid kehtestatav/1, kummutatav/1 ja tautoloogia/1, mis kontrollivad lauseloogika valemi vastavaid omadusi. Näiteks
         ?-kehtestatav(A->B).
         A=false ;
         B=true ;
         no
         ?-kummutatav(A->B).
         A=true,
         B=false
         ?-tautoloogia(A->(B->A)).
         yes
         
  3. (23. sept., tähtaeg 30. sept., pikendatud 4. okt.) Kirjeldage Prologis predikaat tautoloogia/1, mis kontrollib lauseloogika valemi samaselt tõesust, loendades tõeväärtustabeli ridasid, milles valem on tõene. Näiteks valem
    (A ∧ (B ∨ C))↔((A ∧ B) ∨ (A ∧ C))
    on tõene kaheksas tõeväärtustabeli reas.
         ?-tautoloogia((A and (B or C))<->((A and B) or (A and C))).
         yes
         
    Vihje: Moodustage predikaadiga term_variables/2 valemi lausemuutujate list. Genereerige kõik selle listi väärtustused ja arvutage nendel valemi tõeväärtus. Valem, milles on n lausemuutujat, on tautoloogia parajasti siis, kui tal on 2n kehtestavat väärtustust.

  4. (4. okt., tähtaeg 11. okt.) Konstrueerige konstantidest a, b, 0, 1 ja tehetest +, -, *, //, sum, max, min aritmeetiline term, mis arvutab etteantud tabeli esimese kahe veeru väärtuste põhjal tabeli kolmanda veeru väärtuse. Näiteks
         tabel2(6,8,8).
         tabel2(6,4,6).
         tabel2(6,-,6).
         
         ?-leia_valem(tabel2(a,b,c),Term).
         Term = (max(a,b)=c)
         
         tabel(6,8,8).
         tabel(6,4,4).
         tabel(6,-,6).
         tabel(-,6,6).
         tabel(-,-,-).
         
         ?-leia_valem(tabel(a,b,c),Term).
         
    Vihje: Kasutage termi konstrueerimiseks süsteemseid predikaate functor/3 ja arg/3.

  5. (14. okt., tähtaeg 25. okt., pikendatud 28. okt.) Koostage predikaat energia/9, mis leiab mingi vahemiku läbimisele kulunud energia hulga etteantud ühikutes. Liikuda saab jalgsi, joostes, rattaga, ujudes, autoga. Mõõtühikuna lubatakse km, kg, min, h, kcal, kj, kwh.
    Predikaat energia(A,B,C,D,E,F,G,H,I) on tõene parajasti siis, kui
    A on liikuja kaal ühikutes B,
    C on vahemiku pikkus ühikutes D,
    E on liikumisviis,
    F on aeg ühikutes G,
    H on kulunud energia hulk ühikutes I.
    Näiteks
         ?-energia(70,kg,10,km,jalgsi,X,min,Y,kcal).
         X = 150, Y = 750
         ?-energia(70,kg,X,km,joostes,60,min,Y,kcal).
         X = 12, Y = 1000
         ?-energia(100,kg,10,km,X,Y,Z,W,kcal).
         X = jalgsi, Y = 150, Z = min, W = 1065 ;
         X = joostes, Y = 50, Z = min, W = 1420 ;
         
    Programm oskab leida kulunud energia järgi ka vajaliku tegevuse.
         ?-energia(70,kg,X,km,Y,_,_,1000,kcal).
         X = 13, Y = jalgsi ;
         X = 12, Y = joostes ;
         
    Allikas:
    http://www.treenitargalt.ee/kuidas-olla-lihtsalt-vormis/

    Vihje: Auto kulutab umbes 6 liitrit bensiini 100 km läbimiseks. Ühe liitri bensiini kütteväärtus on umbes 10 kwh.

  6. (1. nov., tähtaeg 11. nov.) Koostage kalorikalkulaator Prologi determineeritud plokkidest, kasutades induktiivset loogilist programmeerimist (ILP). Määrake iga ploki sisend- (in) ja väljundparameetrid (out) ning ühendage järjestikuste plokkide sisendid ja väljundid omavahel. Näiteks järgmised plokid teisendavad kilokalorid kilod¸aulideks ja kilod¸aulid kilovatt-tundideks:
         plokk1(X,kcal,Y,kj):-Y is f(X).
         plokk2(X,kj,Y,kwh):-Y is g(X).
         
    Predikaadi energia/9 sisuks on koostada olemasolevate plokkide kasutuskirjeldustest (sisend- ja väljundparameetrite loetelu) Prologi programm P ning see käivitada:
         energia(A,B,C,D,E,F,G,H,I):
           tee_programm(A,B,C,D,E,F,G,H,I,P),
           call(P).
         
    Programmi P võib salvestada käsuga assert/1 dünaamilisse mällu. Näiteks päringu
         ?-energia(70,kg,10,km,jalgsi,150,min,X,kwh).
         
    jaoks tehakse programm
         programm(A,B,C,D,E,F,G,H,I):-
           plokk0(A,B,C,D,E,X,kcal),
           plokk1(X,kcal,Y,kj),
           plokk2(Y,kj,H,I).
         
    ja päringu
         ?-energia(70,kg,10,km,jalgsi,X,min,750,kcal).
         
    jaoks tehakse programm
     
         programm(A,B,C,D,E,F,G,H,I):-
           plokk3(C,D,F,G).
         
    Sarnaselt saab leida kilokalorite järgi kõnnitava maa pikkuse:
         ?-energia(70,kg,X,km,jalgsi,150,min,750,kcal).
         
         programm(A,B,C,D,E,F,G,H,I):-
           plokk4(A,B,E,H,I,C,D).
         
  7. (11. nov., tähtaeg 22. nov., pikendatud 25. nov.) Kirjutage Prologi grammatika, mis kontrollib lihtsa Java programmi korrektsust ja transleerib selle vastavaks Prologi programmiks. Javas on lubatud järgmised konstruktsioonid: omistamine, for-tsükkel, arvu lugemine klaviatuurilt, teksti trükkimine ekraanile ja kommentaar. Predikaat transleeri/2 teisendab etteantud Java faili sama funktsionaalsusega Prologi failiks. Näiteks
         ?-transleeri('summa.java','summa.pl').
         ?-[summa].
         Sisestage N: 4.
         Arvude 1..4 summa on 10
         % summa compiled 0.00 sec, 44 bytes
         true.
         
  8. (22. nov., tähtaeg 2. dets., pikendatud 6. dets.) Realiseerige Prologis mäng "Viis nuppu ritta" (või sellega sarnane mäng), milles vastaseks on arvuti. Kasutajaliides võib olla kas tekstipõhine või graafiline.

  9. (6. dets., tähtaeg 16. dets.) Täiustage eelmise ülesande lahendust (arvuti strateegia, reeglid, ilus laud vms.).