Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Implementirajte infiksne operatore '+' i 'je' koji će omogućiti spajanje proizvoljnih atomarnih elemenata u listu. Pri implementaciji se smiju koristiti ugrađeni predikati.
- Primjeri korištenja:
- `| ?- a + 1 je X.
- X = [a,1];
- no
- | ?- a + b + d + 4 je Y.
- Y = [a,b,d,4];
- no
- | ?- a + f(1) + 3 je Z.
- no
- `
- */ //
- :- op( 500, xfy, + ).
- :- op( 600, xfx, je ).
- X + Y je [ X, Y ] :-
- atomic( X ),
- atomic( Y ).
- X + Y je [ X | Z ] :-
- Y je Z,
- compound( Y ),
- atomic( X ).
- /*
- Bez korištenja ugrađenih predikata implementirajte predikat veca/3 koji će usporediti dvije liste (prva dva argumenta) te uz treći argument vezati vrijednost 'istina', ako je prva lista duža od druge, odnosno vrijednost 'laz' u suprotnom.
- Primjeri korištenja:
- | ?- veca( [a,b,c], [1,2], X ).
- X = istina;
- no
- | ?- veca( [a,b], [1,2,3], X ).
- X = laz;
- no
- | ?- veca( [], [], X ).
- X = laz;
- no
- */
- veca( [ _ | _ ], [], istina ).
- veca( [], _, laz ).
- veca( [ _ | R1 ], [ _ | R2 ], X ) :-
- veca( R1, R2, X ).
- /*
- Neka je zadana baza činjenica kao što slijedi:
- osoba( ivek, 1990 ).
- osoba( joza, 1991 ).
- osoba( bara, 1989 ).
- osoba( stef, 1992 ).
- osoba( stefica, 1994 ).
- Implementirajte predikat godine/1 koji će uz svoj argument vezati listu osoba i odgovarajućih starosti oblika osoba(ime, starost).
- Primjeri korištenja:
- | ?- godine(L).
- L = [osoba(bara,23),osoba(ivek,22),osoba(joza,21),osoba(stef,20),osoba(stefica,18)]
- yes
- */
- osoba( ivek, 1990 ).
- osoba( joza, 1991 ).
- osoba( bara, 1989 ).
- osoba( stef, 1992 ).
- osoba( stefica, 1994 ).
- starost( X, Y ) :-
- osoba( X, Z ),
- Y is 2012 - Z.
- godine( L ) :-
- setof( osoba(X,Y), starost(X,Y), L ).
- /*
- Bez korištenja ugrađenih operatora implementirajte predikat zadnji/2 koji će za prvi argument primati listu, a uz drugi vezati zadnji element te liste umanjen za jedan.
- Primjer korištenja
- | ?- zadnji( [4,2,3,1,3], X ).
- X = 2;
- */
- zadnji( [ X ], Y ) :-
- Y is X - 1.
- zadnji( [ _ | R ], X ) :-
- zadnji( R, X ).
- /*
- Implementirajte infiksne operatore + i je koji omogućiti konkatenaciju (spajanje) lista. Dopušteno je korištenje ugrađenih predikata, npr. putem direktive:
- ?- import append/3 from lists.
- Primjeri korištenja:
- | ?- [1,2,3] + [4,5,6] je L.
- L = [1,2,3,4,5,6];
- no
- | ?- [1,2] + [3,4] + [5,6] + [7,8] je L.
- L = [1,2,3,4,5,6,7,8];
- */
- :- op( 500, xfy, + ).
- :- op( 600, xfx, je ).
- ?- import append/3 from lists.
- ?- import is_list/1 from lists.
- X + Y je Z :-
- is_list( Y ),
- append( X, Y, Z ).
- X + Y je Z :-
- not( is_list( Y ) ),
- Y je T,
- X + T je Z.
- /*
- Neka je zadana baza činjenica kao što slijedi (jednostavni usmjereni graf):
- put(a, b).
- put(b, c).
- put(b, d).
- put(c, e).
- put(d, e).
- put(e, f).
- Bez korištenja ugrađenih predikata implementirajte predikat putanja/3 koji će biti zadovoljen ako su prva dva argumenta čvorovi, a treći lista koja predstavlja putanju između ta dva čvora.
- Primjeri korištenja:
- | ?- putanja(a, f, P).
- P = [a,b,c,e,f];
- P = [a,b,d,e,f];
- no
- | ?- putanja(b, C, P).
- C = c
- P = [b,c];
- C = d
- P = [b,d];
- C = e
- P = [b,c,e];
- C = f
- P = [b,c,e,f];
- C = e
- P = [b,d,e];
- C = f
- P = [b,d,e,f];
- no
- */
- put(a, b).
- put(b, c).
- put(b, d).
- put(c, e).
- put(d, e).
- put(e, f).
- putanja(X,Y,[X,Y]) :-
- put(X,Y).
- putanja(X,Y,[X|R]) :-
- put(X,Z),
- putanja(Z,Y,R).
- 1.
- Implementirajte predikat format_datum/2 koji će za prvi argument primati datum u formatu datum( dd, mm, gggg ), a uz drugi argument vezati datum formata datum( dd, mjesec, gg ). Pri tome možete koristiti operator modularnog djeljenja (mod).
- Primjeri korištenja:
- | ?- format_datum( datum( 27, 9, 1988 ), D ).
- D = datum(27,rujan,88);
- no
- | ?- format_datum( datum( 30, 10, 2013 ), D ).
- D = datum(30,listopad,13);
- no
- RJEŠENJE:
- mjesec(sijecanj,1).
- mjesec(veljaca,2).
- mjesec(ozujak,3).
- mjesec(travanj,4).
- mjesec(svibanj,5).
- mjesec(lipanj,6).
- mjesec(srpanj,7).
- mjesec(kolovoz,8).
- mjesec(rujan,9).
- mjesec(listopad,10).
- mjesec(studeni,11).
- mjesec(prosinac,12).
- format_datum(datum(D,M,G),Z):-mjesec(X,M), G1 is mod(G,100), Z=datum(D,X,G1).
- 2.
- Bez korištenja ugrađenih predikata, implementirajte predikat prebroji/3 koji će za prvi argument primati listu koja se isključivo sastoji od konstanti x i y, prebrojati koliko ima x ondnosno y konstanti u listi i ostala dva argumenta vezati uz te vrijednosti respektivno.
- Primjeri korištenja:
- | ?- prebroji( [ x, y, x, x, x, y, y, x ], X, Y ).
- X = 5
- Y = 3;
- no
- | ?- prebroji( [ x ], X, Y ).
- X = 1
- Y = 0;
- no
- | ?- prebroji( [ x, a, y ], X, Y ).
- no
- 3.
- Implementirajte operator sp za simboličko zbrajanje listi proizvoljnih ali jednakih duljina, te operator sj za jednakost.
- Primjeri korištenja:
- | ?- [ p, o, o ] sp [ r, l, g ] sj L.
- L = [p + r,o + l,o + g];
- no
- | ?- [ a, b, c, d, e ] sp [ 1, 2, 3, 4, 5 ] sj L.
- L = [a + 1,b + 2,c + 3,d + 4,e + 5];
- no
- | ?- [ 1, 2 ] sp [ 1 ] sj L.
- no
- RJEŠENJE:
- :-op(400,xfx,sp).
- :-op(500,xfx,sj).
- [X] sp [Y] sj L:-L=[X+Y].
- [X|R1] sp [Y|R2] sj L:-R1 sp R2 sj L1, L=[X+Y|L1].
- 1.
- Implementirajte kontekstualno slobodnu gramatiku koja će biti u stanju kreirati stablo sintakse za izraze for petlje oblika:
- for( inicijalizacija; uvijet; inkrement ) {
- naredba1;
- naredba2;
- ...
- naredbaN;
- }
- Primjer korištenja:
- | ?- for( S, [ 'for', '(', 'i = 0', ';', 'i < 10', ';', 'i++', ')', '{', 'a++', 'b = i / a', 'b--', '}' ], [] ).
- S = for(inicijalizacija(i = 0),uvjet(i < 10),inkrement(i++),naredbe([a++,b = i / a,b--]));
- 2.
- Implementirajte predikat izvuci_podniz/1 koji će sa adrese
- http://arka.foi.hr/~mschatten/lp/k2lp.html
- povući HTML dokument, te od zadanog paragrafa izvući podniz od 15. do 37. znaka.
- Primjer korištenja:
- | ?- izvuci_podniz( R ).
- R = položit ću kolokvij
- /*
- Implementirajte infiksne operatore '+' i 'je' koji će omogućiti spajanje proizvoljnih atomarnih elemenata u listu. Pri implementaciji se smiju koristiti ugrađeni predikati.
- Primjeri korištenja:
- | ?- a + 1 je X.
- X = [a,1];
- no
- | ?- a + b + d + 4 je Y.
- Y = [a,b,d,4];
- no
- | ?- a + f(1) + 3 je Z.
- no
- */
- :- op( 500, xfy, + ).
- :- op( 600, xfx, je ).
- X + Y je [ X, Y ] :-
- atomic( X ),
- atomic( Y ).
- X + Y je [ X | Z ] :-
- Y je Z,
- compound( Y ),
- atomic( X ).
- /*
- Bez korištenja ugrađenih predikata implementirajte predikat veca/3 koji će usporediti dvije liste (prva dva argumenta) te uz treći argument vezati vrijednost 'istina', ako je prva lista duža od druge, odnosno vrijednost 'laz' u suprotnom.
- Primjeri korištenja:
- | ?- veca( [a,b,c], [1,2], X ).
- X = istina;
- no
- | ?- veca( [a,b], [1,2,3], X ).
- X = laz;
- no
- | ?- veca( [], [], X ).
- X = laz;
- no
- */
- veca( [ _ | _ ], [], istina ).
- veca( [], _, laz ).
- veca( [ _ | R1 ], [ _ | R2 ], X ) :-
- veca( R1, R2, X ).
- /*
- Neka je zadana baza činjenica kao što slijedi:
- osoba( ivek, 1990 ).
- osoba( joza, 1991 ).
- osoba( bara, 1989 ).
- osoba( stef, 1992 ).
- osoba( stefica, 1994 ).
- Implementirajte predikat godine/1 koji će uz svoj argument vezati listu osoba i odgovarajućih starosti oblika osoba(ime, starost).
- Primjeri korištenja:
- | ?- godine(L).
- L = [osoba(bara,23),osoba(ivek,22),osoba(joza,21),osoba(stef,20),osoba(stefica,18)]
- yes
- */
- osoba( ivek, 1990 ).
- osoba( joza, 1991 ).
- osoba( bara, 1989 ).
- osoba( stef, 1992 ).
- osoba( stefica, 1994 ).
- starost( X, Y ) :-
- osoba( X, Z ),
- Y is 2012 - Z.
- godine( L ) :-
- setof( osoba(X,Y), starost(X,Y), L ).
- /*
- Bez korištenja ugrađenih operatora implemetirajte predikat zadnji/2 koji će za prvi argument primati listu, a uz drugi vezati zadnji element te liste umanjen za jedan.
- Primjer korištenja
- | ?- zadnji( [4,2,3,1,3], X ).
- X = 2;
- */
- zadnji( [ X ], Y ) :-
- Y is X - 1.
- zadnji( [ _ | R ], X ) :-
- zadnji( R, X ).
- /*
- Implementirajte infiksne operatore + i je koji omogućiti konkatenaciju (spajanje) lista. Dopušteno je korištenje ugrađenih predikata, npr. putem direktive:
- ?- import append/3 from lists.
- Primjeri korištenja:
- | ?- [1,2,3] + [4,5,6] je L.
- L = [1,2,3,4,5,6];
- no
- | ?- [1,2] + [3,4] + [5,6] + [7,8] je L.
- L = [1,2,3,4,5,6,7,8];
- */
- :- op( 500, xfy, + ).
- :- op( 600, xfx, je ).
- ?- import append/3 from lists.
- ?- import is_list/1 from lists.
- X + Y je Z :-
- is_list( Y ),
- append( X, Y, Z ).
- X + Y je Z :-
- not( is_list( Y ) ),
- Y je T,
- X + T je Z.
- /*
- Neka je zadana baza činjenica kao što slijedi (jednostavni usmjereni graf):
- put(a, b).
- put(b, c).
- put(b, d).
- put(c, e).
- put(d, e).
- put(e, f).
- Bez korištenja ugrađenih predikata omplementirajte predikat putanja/3 koji će biti zadovoljen ako su prva dva argumenta čvorovi, a treći lista koja predstavlja putanju između ta dva čvora.
- Primjeri korištenja:
- | ?- putanja(a, f, P).
- P = [a,b,c,e,f];
- P = [a,b,d,e,f];
- no
- | ?- putanja(b, C, P).
- C = c
- P = [b,c];
- C = d
- P = [b,d];
- C = e
- P = [b,c,e];
- C = f
- P = [b,c,e,f];
- C = e
- P = [b,d,e];
- C = f
- P = [b,d,e,f];
- no
- */
- put(a, b).
- put(b, c).
- put(b, d).
- put(c, e).
- put(d, e).
- put(e, f).
- putanja(X,Y,[X,Y]) :-
- put(X,Y).
- putanja(X,Y,[X|R]) :-
- put(X,Z),
- putanja(Z,Y,R).
- `
- dionica(a,b,5,130,100).
- dionica(a,c,10,50,0).
- dionica(b,d,5,130,100).
- dionica(b,e,5,130,100).
- dionica(c,e,10,50,0).
- dionica(c,f,15,80,0).
- dionica(e,g,15,80,0).
- dionica(d,g,5,130,100).
- dionica(g,h,10,50,0).
- dionica(g,i,5,130,100).
- dionica(f,h,15,80,0).
- dionica(h,i,15,80,0).
- najkraci_put(T1,T2,[ T1 | T2 ],U):-
- dionica(T1,T2,U,_,_).
- najkraci_put(T1,T2,[ T1 | P ],S):-
- dionica(T1,X,U,_,_),
- najkraci_put(X,T2,P,U1),
- S is U + U1.
- a1:vozilo[boja->plava,godina_proizvodnje->2005].
- a2:vozilo[boja->zuta,godina_proizvodnje->1977].
- a3:vozilo[boja->zelena,godina_proizvodnje->1980].
- a4:vozilo[boja->crvena,godina_proizvodnje->2013].
- a5:vozilo[boja->zuta,godina_proizvodnje->2014].
- a6:vozilo[boja->plava,godina_proizvodnje->2002].
- a7:vozilo[boja->zelena,godina_proizvodnje->1990].
- a8:vozilo[boja->crvena,godina_proizvodnje->2003].
- ?vozilo[je_oldtimer(?sada)->?je_oldtimer]:-?vozilo[godina_proizvodnje->?godina_proizvodnje],
- ?je_oldtimer \is ?sada-?godina_proizvodnje.
- ?x[je_oldtimer]:-?x:vozilo[je_oldtimer(2015)->?je_oldtimer], ?je_oldtimer>30.
- ?x[opis->?o]:-?x:vozilo[boja->?o].
- vozila_prema_rasponu_godina (?x, ?y, ?v) :-
- ?v[godina_proizvodnje->?v1],
- ?prva \is ?x, ?druga \is ?y,
- ?v1>?prva, ?v1<?druga
- ?r:rijecnik[%dodaj(?k,?v)]:-not(?r[?k->?_]),t_insert{?r[?k->?v]}.
- ?r:rijecnik[%brisi(?k)]:-t_delete{?r[?k->?_]}.
- ?r:rijecnik[%azuriraj(?k,?v)]:-?r[%brisi(?k)],?r[%dodaj(?k,?v)].
- ?r:rijecnik[%prikazi(?x)]:-?x=collectset{?z | ?r[?k->?v], ?z=r(?k->?v)}.
- a:cvor[brid->{b,c,d}].
- b:cvor[brid->{c,e}].
- c:cvor[brid->{e,d}].
- d:cvor[brid->f].
- e:cvor[brid->f].
- F:cvor.
- ?c:cvor[put->?x]:-?c[brid->?x].
- ?c:cvor[put->?x]:-?c[brid->?y],?y[put->?x].
- ?c:cvor[duljina(?x)->1]:-?c[brid->?x].
- ?c:cvor[duljina(?x)->?d]:-?c[brid->?y],?y[duljina(?x)->?d1],?d is ?d1+1.
- obojeni_cvor::cvor.
- x:obojeni_cvor[boja->zuta, brid->a].
- y:obojeni_cvor[boja->zelena, brid->b].
- z:obojeni_cvor[boja->zelena, brid->c].
- ?c:cvor[put2->?x]:-?c[brid->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor).
- ?c:cvor[put2->?x]:-?c[brid->?y],?y[put2->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor),not(?y:obojeni_cvor).
- Zadan je xml dokument na sljedecoj adresi: http://arka.foi.hr/~mschatten/lp/rok.xml
- Potrebno je implementirati predikat rok/5 koji iz zadanog dokumenta izvlaci id, kolegij, datum, vrijeme i
- dvoranu roka. Pri tome je dopusteno koristiti ugradene predikate.
- Primjer koristenja:
- j ? rok ( I , K, D, V, Dv ) .
- I = LP1
- K = Logi c ko p r o g r ami r a n j e
- D = 20140211
- V = 16:00
- Dv = D5 ;
- I = TBP1
- K = Te o r i j a baza podataka
- D = 20140212
- V = 16:00
- Dv = D2 ;
- I = VAS1
- K = Vi s e a g e n t n i s u s t a v i
- D = 20140212
- V = 16:00
- Dv = D2 ;
- I = FOBP1
- K = F i z i c ko o b l i k o v a n j e baza podataka
- D = 20140211
- V = 16:00
- Dv = D5 ;
- :- import load_xml_structure/3 from sgml.
- :- import parse_xpath/4 from xpath.
- :- import ith/3 from basics.
- rok( Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
- XmlSource = url('http://arka.foi.hr/~mschatten/lp/rok.xml'),
- parse_xpath( XmlSource, '/rokovi/rok/id', Ids, [] ),
- parse_xpath( XmlSource, '/rokovi/rok/kolegij', Kolegiji, [] ),
- parse_xpath( XmlSource, '/rokovi/rok/datum', Datumi, [] ),
- parse_xpath( XmlSource, '/rokovi/rok/vrijeme', Vremena, [] ),
- parse_xpath( XmlSource, '/rokovi/rok/dvorana', Dvorane, [] ),
- dohvati_info(
- Ids, Kolegiji, Datumi, Vremena, Dvorane,
- Id, Kolegij, Datum, Vrijeme, Dvorana
- ).
- get_element( element( _, _, [ X ] ), X ).
- dohvati_info( Ids, Kolegiji, Datumi, Vremena, Dvorane,
- Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
- load_xml_structure( string( Ids ), Id_struct, _ ),
- load_xml_structure( string( Kolegiji ), Kolegij_struct, _ ),
- load_xml_structure( string( Datumi ), Datum_struct, _ ),
- load_xml_structure( string( Vremena ), Vrijeme_struct, _ ),
- load_xml_structure( string( Dvorane ), Dvorana_struct, _ ),
- ith( I, Id_struct, Id_elem ),
- ith( I, Kolegij_struct, Kolegij_elem ),
- ith( I, Datum_struct, Datum_elem ),
- ith( I, Vrijeme_struct, Vrijeme_elem ),
- ith( I, Dvorana_struct, Dvorana_elem ),
- get_element( Id_elem, Id ),
- get_element( Kolegij_elem, Kolegij ),
- get_element( Datum_elem, Datum ),
- get_element( Vrijeme_elem, Vrijeme ),
- get_element( Dvorana_elem, Dvorana ).
- Rjesenje prethodnog zadatka pohranite u datoteku dohvat.P te ju koristite kao modul unutar
- ora-2
- stroja. Potrebno je implementirati klasu rok koja sadrzi atribute kolegij, datum, vrijeme i dvorana.
- Implementirajte predikat rokovi prema dvoranama/2 koji ce uz svoje parametre vezati dvorane te
- odgovarajuce liste rokova koji se odrzavaju u toj dvorani.
- ?- [dohvat].
- load_rokovi :-
- rok( ?id, ?kolegij, ?datum, ?vrijeme, ?dvorana )@_prolog,
- insert { ?id : rok [
- kolegij -> ?kolegij,
- datum -> ?datum,
- vrijeme -> ?vrijeme,
- dvorana -> ?dvorana
- ] }.
- ?- load_rokovi.
- rokovi_prema_dvoranama( ?dvorana, ?kolegiji ) :-
- ?_ : rok [ dvorana -> ?dvorana ],
- ?kolegiji = setof { ?_id | ?_id : rok [ dvorana -> ?dvorana ] }.
- rokovi_prema_datumima( ?datum, ?vrijeme, ?rokovi ) :-
- ?_ : rok [ datum -> ?datum, vrijeme -> ?vrijeme ],
- ?rokovi = setof { ?_id | ?_id : rok [ datum -> ?datum, vrijeme -> ?vrijeme ] }.
- :-import load_xml_structure/3 from sgml.
- :-import parse_xpath/4 from xpath.
- :-import ith/3 from basics.
- dio( sifra, naziv):-
- XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
- parse_xpath(XmlSource, '/djelovi/dio/sifra',S,[]),
- parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
- dohvati(S, N, sifra, naziv).
- get_element( element( _, _, [ X ] ), X ).
- dohvati(S,N,sifra,naziv):-
- load_xml_structure( string( S ), sifra_struct, _ ),
- load_xml_structure( string( N ), naziv_struct, _ ),
- ith( S, sifra_struct, sifra_elem ),
- ith( N, naziv_struct, naziv_elem ),
- get_element( sifra_elem, sifra ),
- get_element( naziv_elem, naziv ).
- ima(naziv):-
- XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
- parse_xpath(XmlSource, '/djelovi/dio/sastav',sastavS,[]),
- parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
- skini(sastavS, N, naziv).
- skini(S,N,naziv):-
- load_xml_structure( string( S ), sastav_struct, _ ),
- load_xml_structure( string( N ), naziv_struct, _ ),
- ith( S, sastav_struct, sastav_elem ),
- ith( N, naziv_struct, naziv_elem ),
- sastav is 0 -> !;true.
- komponenta(naziv,popis):-
- ima(naziv), ispis(popis, naziv).
- ispis(popis,naziv):-
- XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
- parse_xpath(XmlSource, '/djelovi/dio/',S,[]),
- parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
- dohvati(S, N, sifra, naziv).
- a : cvor [ brid -> { b, c, d } ].
- b : cvor [ brid -> { c, e } ].
- c : cvor [ brid -> { e, d } ].
- d : cvor [ brid -> f ].
- e : cvor [ brid -> f ].
- f : cvor.
- // 1) Implementirajte metodu put/0 klase cvor koja vraća sve čvorove kojima je
- // trenutni čvor povezan usmjerenom putanjom. (2 boda)
- ?_n : cvor [ put -> ?x ] :-
- ?_n [ brid -> ?x ].
- ?_n : cvor [ put -> ?x ] :-
- ?_n [ brid -> ?_m ],
- ?_m [ put -> ?x ].
- // 2) Implementirajte metodu duljina/1 klase cvor koja za primljeni čvor vraća
- // sve udaljenosti od trenutnog čvora. (2 boda)
- ?_n : cvor [ duljina( ?_n ) -> 0 ].
- ?_n : cvor [ duljina( ?_tn ) -> 1 ] :-
- ?_n [ brid -> ?_tn ].
- ?_n : cvor [ duljina( ?_tn ) -> ?d ] :-
- ?_n [ brid -> ?_m ],
- ?_m [ duljina( ?_tn ) -> ?_y ],
- ?d is ?_y + 1.
- // 3) Implementirajte klasu obojeni cvor koja naslijeđuje iz klase cvor te ima
- // dodatni atribut boja. Dodajte tri obojena čvora (x, y, z) koji imaju boje
- // žuta, plava i zelena i imaju bridove k čvorovima a, b i c respektivno.
- // (3 boda)
- obojeni_cvor :: cvor [
- boja => string
- ].
- x : obojeni_cvor [ boja -> zuta, brid -> a ].
- y : obojeni_cvor [ boja -> plava, brid -> b ].
- z : obojeni_cvor [ boja -> zelena, brid -> c ].
- // 4) Izmjenite metodu put iz prvog zadatka tako da ona vrijedi samo za
- // neobojene čvorove. Novu metodu nazovite put2/0. (3 boda)
- ?_n : cvor [ put2 -> ?x ] :-
- not(?_n [ boja -> ?_ ]),
- ?_n [ brid -> ?x ].
- ?_n : cvor [ put2 -> ?x ] :-
- not(?_n [ boja -> ?_ ]),
- ?_n [ brid -> ?_m ],
- ?_m [ put2 -> ?x ].
- % 1) Implementrajte predikate pocetak/1 (početni čvor), kraj/1 (završni čvor),
- % boja/2 (boja čvora) i put/2 (veza izmedu dva čvora). (2 boda)
- pocetak(1).
- kraj(11).
- boja(2, crna).
- boja(6, crna).
- boja(9, crna).
- boja(_X, bijela) :-
- not(boja(_X, crna)).
- put(1, 2).
- put(1, 3).
- put(2, 3).
- put(3, 4).
- put(3, 7).
- put(4, 5).
- put(4, 6).
- put(5, 8).
- put(6, 7).
- put(6, 8).
- put(7, 9).
- put(8,10).
- put(9,10).
- put(9,11).
- put(10, 11). % na grafu nije oznacena, ali u rezultatima se pojavljuje
- % 2) Implementirajte predikat bijeli_put/2 koji će za dva čvora provjeriti jesu
- % li oba bijela i povezana putem. (2 boda)
- bijeli_put(X, Y) :-
- put(X, Y),
- boja(X, bijela),
- boja(Y, bijela).
- % 3) Implementirajte predikat bijela_putanja/2 koji će provjeriti postoji li
- % izmedu dva čvora putanja u kojoj su svi među-čvorovi bijeli. (3 boda)
- bijela_putanja(X, Y) :-
- bijeli_put(X, Y).
- bijela_putanja(X, Y) :-
- bijeli_put(X, Z),
- bijela_putanja(Z, Y).
- % 4) Implementirajte predikat bijela_putanja/3 koja će se ponašati isto kao i
- % predikat u predhodnom zadatku uz nadopunu da će u trećem argumentu
- % prikupiti listu elemenata koji su na tom putu. (3 boda)
- bijela_putanja(X, X, [ X ]) :-
- boja(X, bijela).
- bijela_putanja(X, Y, [ X, Y ]) :-
- bijeli_put(X, Y).
- bijela_putanja(X, Y, [ X | Putanja ]) :-
- bijeli_put(X, Z),
- bijela_putanja(Z, Y, Putanja).
- ?- [s>>s1].
- ?- [s>>s2].
- ?- insert { B[ k->s1 ]@s1 }.
- ?- delete { I(p1)@s1 }.
- percipira( ?agent, ?svijet, ?svjetovi ) :-
- ?svjetovi = setof { ?_vidi | ?agent[ k->?_vidi ]@?svijet }.
- vrijedi_u_svjetovima( ?_, [] ).
- vrijedi_u_svjetovima( ?propozicija, [ ?svijet | ?r ] ) :-
- I( ?propozicija )@?svijet,
- vrijedi_u_svjetovima( ?propozicija, ?r ).
- zna( ?agent, ?propozicija, ?svijet ) :-
- percipira( ?agent, ?svijet, ?_svjetovi ),
- vrijedi_u_svjetovima( ?propozicija, ?_svjetovi ).
- I(p1).
- I(p2).
- A[ k->s1, k->s2 ].
- B[ k->s2 ].
- hodnik [ vrata -> 'dnevni boravak', vrata -> 'spavaca soba' ].
- 'spavaca soba' [ vrata -> kupaona ].
- 'dnevni boravak' [ vrata -> kuhinja ].
- kuhinja [ sadrzi -> pizza ].
- igrac [ pozicija -> hodnik ].
- // 1) Potrebno je implementirati pravilo po kojem će vrijediti da ako iz jedne
- // sobe postoje vrata u drugu, tada postoje i vrata iz druge u prvu. (2 boda)
- ?prostorija [ vrata -> ?soba ] :-
- ?soba [ vrata -> ?prostorija ].
- // 2) Potrebno je implementirati predikat put/2 koji će provjeravati postoji li
- // izmedu dvije sobe put. (2 boda)
- put(?soba1, ?soba2) :-
- ?soba1 [ vrata -> ?soba2 ].
- put(?soba1, ?soba2) :-
- ?soba1 [ vrata -> ?soba3 ],
- put(?soba3, ?soba2).
- // 3) Potrebno je implementirati metodu idi/1 objekta igrač koja će provjeriti
- // postoji li za igrača put u zadanu sobu te promijeniti njegovu poziciju.
- // (3 boda)
- igrac [ idi(?soba) ] :-
- igrac [ pozicija -> ?trenutna ],
- put(?trenutna, ?soba),
- delete { igrac [ pozicija -> ?trenutna] },
- insert { igrac [ pozicija -> ?soba ] }.
- // 4) Potrebno je implementirati metodu uzmi/1 objekta igrac koja će provjeriti
- // nalazi li se zadana stvar u trenutnoj sobi igrača, ukloniti stvar iz sobe,
- // te igraču pridodati atribut ima čija vrijednost će biti zadana stvar.
- // (3 boda)
- igrac [ uzmi(?predmet) ] :-
- igrac [ pozicija -> ?trenutna ],
- ?trenutna [ sadrzi -> ?predmet ],
- igrac [ ima -> ?stari_predmet ],
- delete { igrac [ ima -> ?stari_predmet ] },
- delete { ?trenutna [ sadrzi -> ?predmet ] },
- insert { igrac [ ima -> ?predmet ] }.
- igrac [ uzmi(?predmet) ] :-
- igrac [ pozicija -> ?trenutna ],
- ?trenutna [ sadrzi -> ?predmet ],
- delete { ?trenutna [ sadrzi -> ?predmet ] },
- insert { igrac [ ima -> ?predmet] }.
- Zadana je baza znanja:
- a : cvor [b r i d −>{b, c, d } ].
- b : cvor [b r i d −>{c, e } ].
- c : cvor [b r i d −>{e, d } ].
- d : cvor [b r i d −>f].
- e : cvor [b r i d −>f].
- f : cvor .
- ________________________________________
- Implementirajte metodu put/0 klase cvor koja vraca sve cvorove kojima je trenutni cvor povezan usmjerenom putanjom.
- Primjeri korištenja:
- flora2 ?− c [ put −>?x ] .
- ?x = d
- ?x = e
- ?x = f
- 3 solution (s) in 0.0000 seconds
- Yes
- flora2 ?− a [ put −>?x ] .
- ?x = b
- ?x = c
- ?x = d
- ?x = e
- ?x = f
- Rj.:
- ?c:cvor[put->?x]:-?c[brid->?x].
- ?c:cvor[put->?x]:-?c[brid->?y],?y[put->?x]
- ________________________________________
- Implementirajte metodu duljina/1 klase cvor koja za primljeni cvor vraca sve udaljenosti od trenutnog cvora.
- Primjeri koristenja:
- flora2 ?− a [ duljina ( c )−>?x ] .
- ?x = 1
- ?x = 2
- 2 solution ( s ) in 0.0040 seconds
- Yes
- flora2 ?− a [duljina ( e )−>?x ] .
- ?x = 2
- Rj.:
- ?c:cvor[duljina(?x)->1]:-?c[brid->?x].
- ?c:cvor[duljina(?x)->?d]:-?c[brid->?y],?y[duljina(?x)->?d1],?d is ?d1+1.
- ________________________________________
- Implementirajte klasu obojeni cvor koja naslijeduje iz klase cvor te ima dodatni atribut boja. Dodajte tri obojena cvora (x, y, z) koji imaju boje zuta, plava i zelena i imaju bridove k cvorovima a, b i c respektivno.
- Primjeri koristenja:
- flora2 ?− ?C : obojeni_cvor [boja−>?boja ,brid−>? brid] .
- ?C = x
- ? boja = zuta
- ? brid = a
- ?C = y
- ? boja = plava
- ? brid = b
- ?C = z
- ? boja = zelena
- ? brid = c
- Rj.:
- obojeni_cvor::cvor.
- x:obojeni_cvor[boja->zuta, brid->a].
- y:obojeni_cvor[boja->zelena, brid->b].
- z:obojeni_cvor[boja->zelena, brid->c].
- ________________________________________
- Izmjenite metodu put iz prvog zadatka tako da ona vrijedi samo za neobojene cvorove. Novu petodu nazovite put2/0.
- Primjeri koristenja:
- flora2 ?− x [ put −>?y ] .
- ?y = a
- ?y = b
- ?y = c
- ?y = d
- ?y = e
- ?y = f
- 6 solution (s) in 0.0000 seconds
- Yes
- flora2 ?− x [ put2 −>?y ] .
- No
- Rj.:
- ?c:cvor[put2->?x]:-?c[brid->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor).
- ?c:cvor[put2->?x]:-?c[brid->?y],?y[put2->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor),not(?y:obojeni_cvor).
- Neka je zadana baza znanja:
- zaposlenik::osoba.
- kupac::osoba.
- menadzer::zaposlenik.
- direktor::menadzer.
- stefica:kupac.
- ivek:zaposlenik.
- joza:menadzer.
- bara:direktor.
- ivek[ placa->100 ].
- joza[ placa->200 ].
- bara[ placa->300 ].
- ________________________________________
- Implementirajte metodu ukupne_place koja će za zadanu klasu vratiti zbroj svih plaća objekata u toj klasi.
- Primjeri korištenja:
- flora2 ?- osoba[ ukupne_place->?p ].
- ?p = 600
- 1 solution(s) in 0.0100 seconds
- Yes
- flora2 ?- zaposlenik[ ukupne_place->?p ].
- ?p = 600
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- menadzer[ ukupne_place->?p ].
- ?p = 500
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- direktor[ ukupne_place->?p ].
- ?p = 300
- 1 solution(s) in 0.0000 seconds
- Yes
- Rj.:
- osoba[ukupne_place => integer].
- zaposlenik::osoba[placa => integer].
- ?osoba[ukupne_place -> ?ukupna_placa] :-
- ?ukupna_placa = sum{? _ g | ? _ :?osoba[placa->?_g]}.
- ________________________________________
- Implementirajte meta-predikat (naziv/funktor predikata je varijabilan) koji će omogućiti vraćanje liste objekata koji su u
- klasi zadanom nazivom predikata.
- Primjeri korištenja:
- flora2 ?- osoba( ?x ).
- ?x = [bara, ivek, joza, stefica]
- 1 solution(s) in 0.0100 seconds
- Yes
- flora2 ?- kupac( ?x ).
- ?x = [stefica]
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- zaposlenik( ?x ).
- ?x = [bara, ivek, joza]
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- menadzer( ?x ).
- ?x = [bara, joza]
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- direktor( ?x ).
- ?x = [bara]
- 1 solution(s) in 0.0000 seconds
- Yes
- Rj.
- ?predikat(?x) :- ?x = collectset{?_g| ?_g:?predikat}.
- Neka je zadana sljedeća baza znanja u F-logici:
- Joza:osoba[ roditelj->{ Stef, Bara }, spol->musko ].
- Stef:osoba[ roditelj->{ Stefica, Ivek }, spol->musko ].
- Bara:osoba[ roditelj->{ Slavek, Marica }, spol->zensko ].
- Ivek:osoba[ spol->musko ].
- Stefica:osoba[ spol->zensko ].
- Slavek:osoba[ spol->musko ].
- Marica:osoba[ spol->zensko ].
- ________________________________________
- Implementirajte metode baka i predak za klasu osoba. Primjeri korištenja:
- flora2 ?- ?x[ baka->?y ].
- ?x = Joza
- ?y = Marica
- ?x = Joza
- ?y = Stefica
- 2 solution(s) in 0.0000 seconds
- Yes
- flora2 ?- Joza[ predak->?y ].
- ?y = Bara
- ?y = Ivek
- ?y = Marica
- ?y = Slavek
- ?y = Stef
- ?y = Stefica
- 6 solution(s) in 0.0000 seconds
- Yes
- flora2 ?-
- Rj.:
- osoba [ roditelj = > osoba, spol = > string, baka = > osoba, predak = > osoba ].
- ?osoba[baka -> ?baka] :- ?osoba[roditelj->?roditelj], ?roditelj[roditelj->?baka], ?baka[spol->zensko].
- ?osoba[predak -> ?predak] :- ?osoba[roditelj->?predak].
- ?osoba[predak -> ?predak] :- ?osoba[predak -> ?x], ?x[roditelj->?predak].
- Joza:osoba[ roditelj->{ Stef, Bara }, spol->musko ].
- Stef:osoba[ roditelj->{ Stefica, Ivek }, spol->musko ].
- Bara:osoba[ roditelj->{ Slavek, Marica }, spol->zensko ].
- Ivek:osoba[ spol->musko ].
- Stefica:osoba[ spol->zensko ].
- Slavek:osoba[ spol->musko ].
- Marica:osoba[ spol->zensko ].
- Implementirajte sljedeći UML dijagram u F-logici:
- http://arka.foi.hr/~mschatten/lp/uml_manageri.png
- Metoda podređeni prima naziv odjela i vraća listu podređenih datog menadžera.
- Primjerice neka je zadana sljedeća baza znanja:
- ivek:zaposlenik[ ime->Ivan, prezime->Presvetli, nadredjeni->bara, odjel->Marketing ].
- joza:zaposlenik[ ime->Josip, prezime->Prikratki, nadredjeni->bara, odjel->Marketing ].
- bara:menadzer[ ime->Barica, prezime->Jambrek ].
- Tada će se program ponašati na sljedeći način:
- flora2 ?- bara[ podredjeni( Marketing ) -> ?x ].
- ?x = [ivek, joza]
- 1 solution(s) in 0.0000 seconds
- Yes
- Rj.:
- zaposlenik [ ime => _string, prezime => _string, nadredjeni => menadzer, odjel => _string ].
- menadzer::zaposlenik[podredjeni(_string)=>zaposlenik].
- ?menadzer[podredjeni(?odjel)->?podredjeni] :-
- ?podredjeni = collectset{?_g| ?_g:zaposlenik[nadredjeni->?menadzer, odjel-> ?odjel]}.
- ivek:zaposlenik[ ime->Ivan, prezime->Presvetli, nadredjeni->bara, odjel->Marketing ].
- joza:zaposlenik[ ime->Josip, prezime->Prikratki, nadredjeni->bara, odjel->Marketing ].
- bara:menadzer[ ime->Barica, prezime->Jambrek ].
- Neka je zadan modul kuca.flr koji definira objekte koji predstavljaju sobe u kući te trenutnu poziciju igrača.
- hodnik[vrata−>’dnevni boravak’, vrata−>’spavaca soba’].
- ’spavaca soba’[vrata−>kupaona].
- ’dnevni boravak’ [vrata−>kuhinja].
- kuhinja [sadrzi−>pizza].
- igrac[pozicija−>hodnik].
- ________________________________________
- 1.Potrebno je implementirati pravilo po kojem ́ce vrijediti da ako iz jedne sobe postoje vrata u drugu, tada postoje i vrata iz druge u prvu.
- Primjer korištenja:
- flora2 ?− kuhinja[vrata−>?soba].
- ? soba = dnevni boravak
- 1 solution (s) in 0.0000 seconds
- Rj.:
- ?x[vrata->?soba] :- ?soba[vrata->?x].
- ________________________________________
- 2.Potrebno je implementirati predikat put/2 koji ́ce provjeravati je li izmedu dvije sobe postoji put.
- Primjer korištenja:
- flora2 ?− put(hodnik, ?soba).
- ? soba = dnevni boravak
- ? soba = hodnik
- ? soba = kuhinja
- ? soba = kupaona
- ? soba = spavaca soba
- 5 solution(s) in 0.0000 seconds
- Rj.:
- put(?x,?soba):-?x[vrata->?soba1],?soba1[vrata->?soba].
- put(?x,?soba):-?x[vrata->?soba],?soba[vrata->?soba1],?soba1[vrata->?soba].
- ________________________________________
- 3.Potrebno je implementirati metodu idi/1 objekta igrac koja ́ce provjeriti je li za igrača postoji put u zadanu sobu te promijeniti njegovu poziciju.
- Primjeri korištenja:
- flora2 ?− igrac [idi (kuhinja)].
- Elapsed time 0.0000 seconds
- Yes
- flora2 ?− igrac [pozicija−>?soba].
- ? soba = kuhinja
- 1 solution(s) in 0.0000 seconds
- Rj.:
- ?i[idi(?soba)]:-?i[pozicija->?poz], ?poz[vrata->?soba], ?soba[vrata->?poz], delete{?i[pozicija->?poz]}, insert{?i[pozicija->?soba]},
- refresh{?i[pozicija->?soba]}, ?i[pozicija->?soba].
- ________________________________________
- 4.Potrebno je implementirati metodu uzmi/1 objekta igrac koja ́ce provjeriti je li se zadana stvar nalazi u trenutnoj sobi igrača, ukloniti stvar iz sobe, te igraču pridodati atribut ima čija vrijednost ́ce biti zadana stvar.
- Primjeri korištenja:
- flora2 ?− igrac [uzmi(pizza)].
- Elapsed time 0.0000 seconds
- Yes
- flora2 ?− igrac [ima−>?stvar].
- ?stvar = pizza
- 1 solution(s) in 0.0000 seconds
- Yes
- flora2 ?− kuhinja [sadrzi−>?stvar].
- No
- Rj.:
- ?i[uzmi(?stvar)] :- ?i[pozicija->?poz], ?poz[sadrzi->?stvar], delete{?poz[sadrzi->?stvar]}, insert{?i[ima->?stvar]}, refresh{?i[ima->?stvar]}, ?i[ima->?stvar].
- Zadana je baza znaja o automobilima:
- a1:vozilo[boja->plava,godina_proizvodnje->2005].
- a2:vozilo[boja->zuta,godina_proizvodnje->1977].
- a3:vozilo[boja->zelena,godina_proizvodnje->1980].
- a4:vozilo[boja->crvena,godina_proizvodnje->2013].
- a5:vozilo[boja->zuta,godina_proizvodnje->2014].
- a6:vozilo[boja->plava,godina_proizvodnje->2002].
- a7:vozilo[boja->zelena,godina_proizvodnje->1990].
- a8:vozilo[boja->crvena,godina_proizvodnje->2003].
- ________________________________________
- 1. Potrebno je implementirati atribut je_oldtimer klase vozilo koji pokazuje je li neko vozilo starije od 30godina.
- Primjer korištenja:
- ?x[je_oldtimer].
- ?x=a2
- ?x=a3.
- ?vozilo[je_oldtimer(?sada)->?je_oldtimer]:-?vozilo[godina_proizvodnje->?godina_proizvodnje],
- ?je_oldtimer \is ?sada-?godina_proizvodnje.
- ?x[je_oldtimer]:-?x:vozilo[je_oldtimer(2015)->?je_oldtimer], ?je_oldtimer>30.
- ________________________________________
- 2.Potrebno je implementirati atribut opis koji se izračunava na temelju atributa boja i to tako da se makne zadnje slovo vrijednosti atributa i doda nastavak o_vozilo. Pri implementaciji se smiju koristiti moduli.
- Primjeri korištenja:
- ?x[opis->?o].
- ?x=a1
- ?o=plavo_vozilo
- ?x=a2
- ?o=zuto_vozilo
- ?x=a3
- ?o=zeleno_vozilo
- ?x=a4
- ?o=crveno_vozilo
- ..
- ?x[opis->?o]:-?x:vozilo[boja->?o].
- ????????
- ________________________________________
- 3.Potrebno je implementirati predikat vozila_prema_rasponu_godina/3 koji će za prva 2 argumenta primati godine te uz zadnji argument vezati ona vozila koja su proizvedena u zadanom rasponu.
- Primjeri korištenja:
- vozila_prema_rasponu_godina(2000,2015,?v).
- ?v=a1
- ?v=a4
- ?v=a5
- ?v=a6
- ?v=a8
- vozila_prema_rasponu_godina(?x,?y,?v):-?v[godina_proizvodnje->?v1], ?prva \is ?x, ?druga \is ?y, ?v1>?prva, ?v1<?druga.
- ________________________________________
- 4.Potrebno implementirati predikat vozila_po_boji/2 koji će agregirati vozila i njihove godine proizvodnje u listu čiji su elementi oblika v(vozilo,godina) i grupirati ih prema boji.
- Primjeri korištenja:
- vozila_po_boji(plava,?v).
- ?v=[v(a1,2005),v(a6,2002)]
- vozila_po_boji(?_boja,?v):-?v=collectset{?v[?_boja]|?v:vozilo[boja->?_boja]}.
- Potrebno je implementirati apstraktni tip podataka rjeˇcnik (asocijativni niz) u Flori-2. Obratite pozornost na to
- da akcije ažuriranja trebaju biti transakcijske, kako bi se izbjegli neˇzeljeni rezultati (koriˇstenje prefiksa ’%’ kod metoda
- objekta i metoda aˇzuriranja s prefiksom ’t ’).
- 1. (2 boda) Implementirajte metodu dodaj/2 koja ́ce primati dva parametra (ključ i vrijednost) i dodavati odgo-
- varaju ́ce vrijednosti u rijeˇcnik.
- Primjeri koriˇstenja:
- f l o r a 2 ?− i n s e r t { a : r j e c n i k } .
- f l o r a 2 ?− a [ %d o d a j ( 1 , 2 ) ] .
- Elapsed time 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 2
- f l o r a 2 ?− a [ %d o d a j ( 1 , 3 ) ] .
- No
- f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 2
- 1 s o l u t i o n ( s ) in 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ %d o d a j ( 2 , 3 ) ] .
- 1Elapsed time 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 2
- ?x = 2
- ?y = 3
- 2 s o l u t i o n ( s ) in 0.0000 seconds
- Yes
- Rješenje:
- ?r:rjecnik[%dodaj(?k,?v)]:-?r[not(?k->?_)],t_insert{?r[?k->?v]}.
- ________________________________________
- 1. (2 boda) Implementirajte metodu brisi/1 koja ́ce primati kljuˇc rijeˇcnika i obrisati vrijednost pod zadanim kljuˇcem.
- Primjeri koriˇstenja:
- f l o r a 2 ?− a [ %b r i s i ( 2 ) ] .
- Elapsed time 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 2
- Rješenje:
- ?r:rijecnik[%brisi(?k)]:-t_delete{?r[?k->?_]}.
- ________________________________________
- 1. (3 boda) Implementirajte metodu azuriraj/2 koja ́ce primati postoje ́ci kljuˇci za njega promijeniti trenutnu
- vrijednost na prosljedenu.
- Primjeri koriˇstenja:
- f l o r a 2 ?− a [ %a z u r i r a j ( 1 , 3 ) ] .
- Elapsed time 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 3
- 1 s o l u t i o n ( s ) in 0.0040 seconds
- Yes
- f l o r a 2 ?− a [ %a z u r i r a j ( 2 , 3 ) ] .
- No
- 2f l o r a 2 ?− a [ ? x−>?y ] .
- ?x = 1
- ?y = 3
- Rješenje:
- ?r:rijecnik[%azuriraj(?k,?v)]:-?r[%brisi(?k)],?r[%dodaj(?k,?v)].
- ________________________________________
- 1. (3 boda) Implementirajte metodu prikazi/1 koja ́ce prikazati sadrˇzaj rjeˇcnika.
- Primjeri koriˇstenja:
- f l o r a 2 ?− a [ %p r i k a z i ( ? x ) ] .
- ?x = [ r (1 ,2)]
- 1 s o l u t i o n ( s ) in 0.0040 seconds
- Yes
- f l o r a 2 ?− a [ %d o d a j ( 3 , 4 ) ] .
- Elapsed time 0.0000 seconds
- Yes
- f l o r a 2 ?− a [ %p r i k a z i ( ? x ) ] .
- ?x = [ r (1 ,2) , r (3 ,4)]
- Rješenje:
- ?r:rijecnik[%prikazi(?x)]:-?x=collectset{?z | ?r[?k->?v], ?z=r(?k->?v)}.
- Neka je zadan modul s.flr koji daje interpretaciju za odredeni svijet (relacija I ) te de
- niciju mogucnosnih relacija za agente A i B (relacija k).
- I ( p1 ) .
- I ( p2 ) .
- A[ k>s1 , k>s2 ] .
- B[ k>s2 ] .
- Logicki naziv modula u koji ce se ucitati modul s.flr predstavljat ce naziv svijeta u kojem on vrijedi. Konkretno, ako se modul ucita u logicki modul s1, to znaci da u svijetu s1 vrijede propozicije p1 i p2, da agent A u svijetu s1 percipira svijetove s1 i s2, a agent B u svijetu s1 percipira svijet s2. Vas zadatak odnosi se na implementaciju
- logickog programa za rezoniranje u Kripkeovim strukturama.
- 1.Potrebno je implementirati modul agenti.flr te pri pokretanju modula dva puta ucitati modul s.flr jednom u logicki modul s1, a drugi put u logicki modul s2.
- Primjer koristenja:
- f l o r a 2 ? [ a g e n t i ] .
- . . . u c i t a v a n j e modula . . .
- Yes
- f l o r a 2 ? A[ k>? v i d i ]@?u .
- ? v i d i = s1
- ?u = s1
- ? v i d i = s1
- ?u = s2
- ? v i d i = s2
- ?u = s1
- ? v i d i = s2
- ?u = s2
- Rješenje:
- ?- [s>>s1].
- ?- [s>>s2].
- ________________________________________
- 1. Potrebno je azurirati bazu znanja tako da se u logicki modul s1 doda cinjenica:
- B[ k>s1 ] .
- te obrise cinjenica (iz istog modula s1):
- I ( p1 ) .
- Rješenje:
- ?- insert { B[ k->s1 ]@s1 }.
- ?- delete { I(p1)@s1 }.
- Oba azuriranja treba provesti pri pokretanju glavnog modula agenti.flr
- Primjeri koristenja:
- fl o r a 2 ? [ a g e n t i ] .
- . . . u c i t a v a n j e modula . . .
- Yes
- f l o r a 2 ? B[ k>? v i d i ]@?u .
- ? v i d i = s1
- ?u = s1
- ? v i d i = s2
- ?u = s1
- ? v i d i = s2
- ?u = s2
- f l o r a 2 ? I (? v r i j e d i )@?u .
- ? v r i j e d i = p1
- ?u = s2
- ? v r i j e d i = p2
- ?u = s1
- ? v r i j e d i = p2
- ?u = s2
- ________________________________________
- 1. Potrebno je implementirati predikat percipira( ?agent, ?svijet, ?svijetovi ) koji ce za zadanog agenta
- i zadani svijet uz varijablu ?svijetovi vezati listu svih svijetova koje agent percipira putem svoje mogucnosne
- relacije k u zadanom svijetu.
- Primjeri koristenja:
- f l o r a 2 ? p e r c i p i r a ( A, s1 , ? s ) .
- ? s = [ s1 , s2 ]
- f l o r a 2 ? p e r c i p i r a ( B, s2 , ? s ) .
- ? s = [ s2 ]
- Rješenje:
- percipira( ?agent, ?svijet, ?svjetovi ) :-
- ?svjetovi = setof { ?_vidi | ?agent[ k->?_vidi ]@?svijet }.
- ________________________________________
- 1. Potrebno je implementirati predikat zna( ?agent, ?propozicija, ?svijet ) koji ce za zadanog agenta,
- zadanu propoziciju i zadani svijet provjeriti je li agent zna propoziciju u tom svijetu. (Agent zna propoziciju p
- akko ne postoji niti jedan svijet koji agent percipira, a da u njemu p ne vrijedi).
- Primjeri koristenja:
- fl o r a 2 ? zna ( A, p1 , s1 ) .
- No
- f l o r a 2 ? zna ( A, p2 , s2 ) .
- El aps ed time 0.0000 s e c onds
- Yes
- Rješenje:
- vrijedi_u_svjetovima( ?_, [] ).
- vrijedi_u_svjetovima( ?propozicija, [ ?svijet | ?r ] ) :-
- I( ?propozicija )@?svijet,
- vrijedi_u_svjetovima( ?propozicija, ?r ).
- zna( ?agent, ?propozicija, ?svijet ) :-
- percipira( ?agent, ?svijet, ?_svjetovi ),
- vrijedi_u_svjetovima( ?propozicija, ?_svjetovi ).
- Neka je zadan usmjereni graf kao na slici:
- Predikat veza/2 koji ce upjevati ako postoji veza od cvora zadanog u prvom parametru do cvora
- zadanog u drugom parametru.
- Primjeri koristenja:
- v e za ( a , X ) .
- X = b ;
- X = c ;
- no
- j ? v e za ( Y, h ) .
- Y = f ;
- Y = g ;
- no
- j ?
- Rješenje:
- veza(a, b).
- veza(a, c).
- veza(b, d).
- veza(b, c).
- veza(c, e).
- veza(c, f).
- veza(d, g).
- veza(e, d).
- veza(e, g).
- veza(f, h).
- veza(g, h).
- ________________________________________
- 2.Predikat putanja/2 koji ce provjeravati je li postoji usmjerena putanja izmedu cvorova. Primjeri
- koristenja:
- p u t a n j a ( d , X ) .
- X = g;
- X = h ;
- no
- j ? p u t a n j a ( c , X ) .
- X = e ;
- X = f ;
- X = d ;
- X = g ;
- X = g ;
- X = h ;
- X = h ;
- X = h ;
- Rješenje:
- putanja(A, B) :-
- veza(A, B).
- putanja(A, B) :-
- veza(A, C),
- putanja(C, B).
- ________________________________________
- 1. Predikat dostupno/2 koji ce vracati listu onih cvorova koji su dostupni iz zadanog cvora. Primjeri
- koristenja
- ? dos tupno ( c , L ) .
- L = [ d , e , f , g , h ] ;
- Rješenje:
- dostupno(A, L) :-
- setof(_B, putanja(A, _B), L).
- ________________________________________
- 1. Predikat put od do/3 koji ce za zadane cvorove u listi vratiti putanju izmedu njih, ako ona postoji.
- Radi mogucnoti beskonacne petlje, tablirajte predikat direktivom
- : t a b l e put od do / 3.
- Primjeri korištenja:
- put od do ( a , d , P ) .
- P = [ a , c , e , d ] ;
- P = [ a , b , d ] ;
- P = [ a , b , c , e , d ] ;
- Rješenje:
- put_od_do(A, A, [A]).
- put_od_do(A, B, [A, B]) :-
- veza(A, B).
- put_od_do(A, B, [A | Put]) :-
- veza(A, C),
- put_od_do(C, B, Put).
- :- table put_od_do/3.
- Neka je zadan obojeni, usmjereni graf s naznacenim pocetkom (cvor 1) i krajem (cvor 11) kao na slici:
- 1.Implementrajte predikate pocetak/1 (pocetni cvor), kraj/1 (zavrsni cvor), boja/2 (boja cvora) i put/2
- (veza izmedu dva cvora) koji ce imati sljedece ponasanje:
- ? poc e t ak ( P ) , k r a j ( K ) .
- P = 1
- K = 1 1 ;
- no
- j ? bo j a ( 1 , X ) .
- X = b i j e l a
- y e s
- j ? bo j a ( 2 , X ) .
- X = c rna
- y e s
- j ? put ( 9 , X ) .
- X = 1 0 ;
- X = 1 1 ;
- Rješenje:
- boja(2, crna).
- boja(6, crna).
- boja(9, crna).
- boja(_X, bijela) :-
- not(boja(_X, crna)).
- put(1, 2).
- put(1, 3).
- put(2, 3).
- put(3, 4).
- put(3, 7).
- put(4, 5).
- put(4, 6).
- put(5, 8).
- put(6, 7).
- put(6, 8).
- put(7, 9).
- put(8,10).
- put(9,10).
- put(9,11).
- put(10, 11).
- ________________________________________
- 1. Implementirajte predikat bijeli put/2 koji ce za dva cvora provjeriti jesu li oba bijela i povezana
- putem. Primjer koristenja:
- ? b i j e l i p u t ( X, Y ) .
- X = 1
- Y = 3 ;
- X = 3
- Y = 4 ;
- X = 3
- Y = 7 ;
- X = 4
- Y = 5 ;
- X = 5
- Y = 8 ;
- X = 8
- Y = 1 0 ;
- X = 10
- Y = 1 1 ;
- Rješenje:
- bijeli_put(X, Y) :-
- put(X, Y),
- boja(X, bijela),
- boja(Y, bijela).
- ________________________________________
- 1. Implementirajte predikat bijela_putanja/2 koji će provjeriti postoji li
- izmedu dva čvora putanja u kojoj su svi među-čvorovi bijeli.
- Primjeri korištenja:
- ? b i j e l a p u t a n j a ( 1 , X ) .
- X = 3 ;
- X = 4 ;
- X = 7 ;
- X = 5 ;
- X = 8 ;
- X = 1 0 ;
- X = 1 1 ;
- Rješnjje:
- bijela_putanja(X, Y) :-
- bijeli_put(X, Y).
- bijela_putanja(X, Y) :-
- bijeli_put(X, Z),
- bijela_putanja(Z, Y).
- ________________________________________
- 4.Implementirajte predikat bijela putranja/3 koja ce se ponasati isto kao i predikat u predhodnom
- zadatku uz nadopunu da ce u trecem argumentu prikupiti listu elemenata koji su na tom putu. Primjeri
- koristenja:
- b i j e l a p u t a n j a ( 1 , 11 , P ) .
- P = [ 1 , 3 , 4 , 5 , 8 , 1 0 , 1 1 ]
- y e s
- j ? b i j e l a p u t a n j a ( 7 , 11 , P ) .
- no
- Rješenje:
- bijela_putanja(X, X, [ X ]) :-
- boja(X, bijela).
- bijela_putanja(X, Y, [ X, Y ]) :-
- bijeli_put(X, Y).
- bijela_putanja(X, Y, [ X | Putanja ]) :-
- bijeli_put(X, Z),
- bijela_putanja(Z, Y, Putanja).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement