Advertisement
Guest User

prolog_swi_tasks1

a guest
Jul 1st, 2015
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.48 KB | None | 0 0
  1. Implementirajte infiksne operatore '+' i 'je' koji će omogućiti spajanje proizvoljnih atomarnih elemenata u listu. Pri implementaciji se smiju koristiti ugrađeni predikati.
  2.  
  3. Primjeri korištenja:
  4.  
  5. `| ?- a + 1 je X.
  6.  
  7. X = [a,1];
  8.  
  9. no
  10. | ?- a + b + d + 4 je Y.
  11.  
  12. Y = [a,b,d,4];
  13.  
  14. no
  15. | ?- a + f(1) + 3 je Z.
  16.  
  17. no
  18.  
  19. `
  20. */ //
  21.  
  22. :- op( 500, xfy, + ).
  23. :- op( 600, xfx, je ).
  24.  
  25. X + Y je [ X, Y ] :-
  26. atomic( X ),
  27. atomic( Y ).
  28.  
  29. X + Y je [ X | Z ] :-
  30. Y je Z,
  31. compound( Y ),
  32. atomic( X ).
  33.  
  34. /*
  35. 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.
  36.  
  37. Primjeri korištenja:
  38.  
  39. | ?- veca( [a,b,c], [1,2], X ).
  40.  
  41. X = istina;
  42.  
  43. no
  44. | ?- veca( [a,b], [1,2,3], X ).
  45.  
  46. X = laz;
  47.  
  48. no
  49. | ?- veca( [], [], X ).
  50.  
  51. X = laz;
  52.  
  53. no
  54.  
  55. */
  56.  
  57. veca( [ _ | _ ], [], istina ).
  58. veca( [], _, laz ).
  59. veca( [ _ | R1 ], [ _ | R2 ], X ) :-
  60. veca( R1, R2, X ).
  61.  
  62. /*
  63. Neka je zadana baza činjenica kao što slijedi:
  64.  
  65. osoba( ivek, 1990 ).
  66. osoba( joza, 1991 ).
  67. osoba( bara, 1989 ).
  68. osoba( stef, 1992 ).
  69. osoba( stefica, 1994 ).
  70.  
  71. Implementirajte predikat godine/1 koji će uz svoj argument vezati listu osoba i odgovarajućih starosti oblika osoba(ime, starost).
  72.  
  73. Primjeri korištenja:
  74.  
  75. | ?- godine(L).
  76.  
  77. L = [osoba(bara,23),osoba(ivek,22),osoba(joza,21),osoba(stef,20),osoba(stefica,18)]
  78.  
  79. yes
  80.  
  81. */
  82.  
  83. osoba( ivek, 1990 ).
  84. osoba( joza, 1991 ).
  85. osoba( bara, 1989 ).
  86. osoba( stef, 1992 ).
  87. osoba( stefica, 1994 ).
  88.  
  89. starost( X, Y ) :-
  90. osoba( X, Z ),
  91. Y is 2012 - Z.
  92.  
  93. godine( L ) :-
  94. setof( osoba(X,Y), starost(X,Y), L ).
  95.  
  96. /*
  97. 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.
  98.  
  99. Primjer korištenja
  100.  
  101. | ?- zadnji( [4,2,3,1,3], X ).
  102.  
  103. X = 2;
  104.  
  105. */
  106.  
  107. zadnji( [ X ], Y ) :-
  108. Y is X - 1.
  109. zadnji( [ _ | R ], X ) :-
  110. zadnji( R, X ).
  111.  
  112. /*
  113. Implementirajte infiksne operatore + i je koji omogućiti konkatenaciju (spajanje) lista. Dopušteno je korištenje ugrađenih predikata, npr. putem direktive:
  114.  
  115. ?- import append/3 from lists.
  116.  
  117. Primjeri korištenja:
  118.  
  119. | ?- [1,2,3] + [4,5,6] je L.
  120.  
  121. L = [1,2,3,4,5,6];
  122.  
  123. no
  124. | ?- [1,2] + [3,4] + [5,6] + [7,8] je L.
  125.  
  126. L = [1,2,3,4,5,6,7,8];
  127.  
  128. */
  129.  
  130. :- op( 500, xfy, + ).
  131. :- op( 600, xfx, je ).
  132.  
  133. ?- import append/3 from lists.
  134. ?- import is_list/1 from lists.
  135.  
  136. X + Y je Z :-
  137. is_list( Y ),
  138. append( X, Y, Z ).
  139.  
  140. X + Y je Z :-
  141. not( is_list( Y ) ),
  142. Y je T,
  143. X + T je Z.
  144.  
  145. /*
  146. Neka je zadana baza činjenica kao što slijedi (jednostavni usmjereni graf):
  147.  
  148. put(a, b).
  149. put(b, c).
  150. put(b, d).
  151. put(c, e).
  152. put(d, e).
  153. put(e, f).
  154.  
  155. 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.
  156.  
  157. Primjeri korištenja:
  158.  
  159. | ?- putanja(a, f, P).
  160.  
  161. P = [a,b,c,e,f];
  162.  
  163. P = [a,b,d,e,f];
  164.  
  165. no
  166. | ?- putanja(b, C, P).
  167.  
  168. C = c
  169. P = [b,c];
  170.  
  171. C = d
  172. P = [b,d];
  173.  
  174. C = e
  175. P = [b,c,e];
  176.  
  177. C = f
  178. P = [b,c,e,f];
  179.  
  180. C = e
  181. P = [b,d,e];
  182.  
  183. C = f
  184. P = [b,d,e,f];
  185.  
  186. no
  187.  
  188. */
  189.  
  190. put(a, b).
  191. put(b, c).
  192. put(b, d).
  193. put(c, e).
  194. put(d, e).
  195. put(e, f).
  196.  
  197. putanja(X,Y,[X,Y]) :-
  198. put(X,Y).
  199.  
  200. putanja(X,Y,[X|R]) :-
  201. put(X,Z),
  202. putanja(Z,Y,R).
  203.  
  204. 1.
  205. 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).
  206.  
  207. Primjeri korištenja:
  208.  
  209. | ?- format_datum( datum( 27, 9, 1988 ), D ).
  210.  
  211. D = datum(27,rujan,88);
  212.  
  213. no
  214. | ?- format_datum( datum( 30, 10, 2013 ), D ).
  215.  
  216. D = datum(30,listopad,13);
  217.  
  218. no
  219.  
  220. RJEŠENJE:
  221. mjesec(sijecanj,1).
  222. mjesec(veljaca,2).
  223. mjesec(ozujak,3).
  224. mjesec(travanj,4).
  225. mjesec(svibanj,5).
  226. mjesec(lipanj,6).
  227. mjesec(srpanj,7).
  228. mjesec(kolovoz,8).
  229. mjesec(rujan,9).
  230. mjesec(listopad,10).
  231. mjesec(studeni,11).
  232. mjesec(prosinac,12).
  233.  
  234. format_datum(datum(D,M,G),Z):-mjesec(X,M), G1 is mod(G,100), Z=datum(D,X,G1).
  235. 2.
  236. 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.
  237.  
  238. Primjeri korištenja:
  239.  
  240. | ?- prebroji( [ x, y, x, x, x, y, y, x ], X, Y ).
  241.  
  242. X = 5
  243. Y = 3;
  244.  
  245. no
  246. | ?- prebroji( [ x ], X, Y ).
  247.  
  248. X = 1
  249. Y = 0;
  250.  
  251. no
  252. | ?- prebroji( [ x, a, y ], X, Y ).
  253. no 
  254. 3.
  255. Implementirajte operator sp za simboličko zbrajanje listi proizvoljnih ali jednakih duljina, te operator sj za jednakost.
  256.  
  257. Primjeri korištenja:
  258.  
  259. | ?- [ p, o, o ] sp [ r, l, g ] sj L.
  260.  
  261. L = [p + r,o + l,o + g];
  262.  
  263. no
  264. | ?- [ a, b, c, d, e ] sp [ 1, 2, 3, 4, 5 ] sj L.
  265.  
  266. L = [a + 1,b + 2,c + 3,d + 4,e + 5];
  267.  
  268. no
  269. | ?- [ 1, 2 ] sp [ 1 ] sj L.
  270.  
  271. no
  272.  
  273. RJEŠENJE:
  274. :-op(400,xfx,sp).
  275. :-op(500,xfx,sj).
  276.  
  277. [X] sp [Y] sj L:-L=[X+Y].
  278. [X|R1] sp [Y|R2] sj L:-R1 sp R2 sj L1, L=[X+Y|L1]. 
  279. 1.
  280. Implementirajte kontekstualno slobodnu gramatiku koja će biti u stanju kreirati stablo sintakse za izraze for petlje oblika:
  281.  
  282. for( inicijalizacija; uvijet; inkrement ) {
  283. naredba1;
  284. naredba2;
  285. ...
  286. naredbaN;
  287. }
  288.  
  289. Primjer korištenja:
  290.  
  291. | ?- for( S, [ 'for', '(', 'i = 0', ';', 'i < 10', ';', 'i++', ')', '{', 'a++', 'b = i / a', 'b--', '}' ], [] ).
  292.  
  293. S = for(inicijalizacija(i = 0),uvjet(i < 10),inkrement(i++),naredbe([a++,b = i / a,b--]));
  294.  
  295. 2.
  296. Implementirajte predikat izvuci_podniz/1 koji će sa adrese
  297.  
  298. http://arka.foi.hr/~mschatten/lp/k2lp.html
  299.  
  300. povući HTML dokument, te od zadanog paragrafa izvući podniz od 15. do 37. znaka.
  301.  
  302. Primjer korištenja:
  303.  
  304. | ?- izvuci_podniz( R ).
  305.  
  306. R = položit ću kolokvij
  307.  
  308. /*
  309. Implementirajte infiksne operatore '+' i 'je' koji će omogućiti spajanje proizvoljnih atomarnih elemenata u listu. Pri implementaciji se smiju koristiti ugrađeni predikati.
  310.  
  311. Primjeri korištenja:
  312.  
  313. | ?- a + 1 je X.
  314.  
  315. X = [a,1];
  316.  
  317. no
  318. | ?- a + b + d + 4 je Y.
  319.  
  320. Y = [a,b,d,4];
  321.  
  322. no
  323. | ?- a + f(1) + 3 je Z.
  324.  
  325. no
  326.  
  327.  
  328. */
  329.  
  330. :- op( 500, xfy, + ).
  331. :- op( 600, xfx, je ).
  332.  
  333. X + Y je [ X, Y ] :-
  334. atomic( X ),
  335. atomic( Y ).
  336.  
  337. X + Y je [ X | Z ] :-
  338. Y je Z,
  339. compound( Y ),
  340. atomic( X ).
  341.  
  342. /*
  343. 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.
  344.  
  345. Primjeri korištenja:
  346.  
  347. | ?- veca( [a,b,c], [1,2], X ).
  348.  
  349. X = istina;
  350.  
  351. no
  352. | ?- veca( [a,b], [1,2,3], X ).
  353.  
  354. X = laz;
  355.  
  356. no
  357. | ?- veca( [], [], X ).
  358.  
  359. X = laz;
  360.  
  361. no
  362.  
  363. */
  364.  
  365. veca( [ _ | _ ], [], istina ).
  366. veca( [], _, laz ).
  367. veca( [ _ | R1 ], [ _ | R2 ], X ) :-
  368. veca( R1, R2, X ).
  369.  
  370. /*
  371. Neka je zadana baza činjenica kao što slijedi:
  372.  
  373. osoba( ivek, 1990 ).
  374. osoba( joza, 1991 ).
  375. osoba( bara, 1989 ).
  376. osoba( stef, 1992 ).
  377. osoba( stefica, 1994 ).
  378.  
  379. Implementirajte predikat godine/1 koji će uz svoj argument vezati listu osoba i odgovarajućih starosti oblika osoba(ime, starost).
  380.  
  381. Primjeri korištenja:
  382.  
  383. | ?- godine(L).
  384.  
  385. L = [osoba(bara,23),osoba(ivek,22),osoba(joza,21),osoba(stef,20),osoba(stefica,18)]
  386.  
  387. yes
  388.  
  389. */
  390.  
  391. osoba( ivek, 1990 ).
  392. osoba( joza, 1991 ).
  393. osoba( bara, 1989 ).
  394. osoba( stef, 1992 ).
  395. osoba( stefica, 1994 ).
  396.  
  397. starost( X, Y ) :-
  398. osoba( X, Z ),
  399. Y is 2012 - Z.
  400.  
  401. godine( L ) :-
  402. setof( osoba(X,Y), starost(X,Y), L ).
  403.  
  404. /*
  405. 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.
  406.  
  407. Primjer korištenja
  408.  
  409. | ?- zadnji( [4,2,3,1,3], X ).
  410.  
  411. X = 2;
  412.  
  413. */
  414.  
  415. zadnji( [ X ], Y ) :-
  416. Y is X - 1.
  417. zadnji( [ _ | R ], X ) :-
  418. zadnji( R, X ).
  419.  
  420. /*
  421. Implementirajte infiksne operatore + i je koji omogućiti konkatenaciju (spajanje) lista. Dopušteno je korištenje ugrađenih predikata, npr. putem direktive:
  422.  
  423. ?- import append/3 from lists.
  424.  
  425. Primjeri korištenja:
  426.  
  427. | ?- [1,2,3] + [4,5,6] je L.
  428.  
  429. L = [1,2,3,4,5,6];
  430.  
  431. no
  432. | ?- [1,2] + [3,4] + [5,6] + [7,8] je L.
  433.  
  434. L = [1,2,3,4,5,6,7,8];
  435.  
  436. */
  437.  
  438. :- op( 500, xfy, + ).
  439. :- op( 600, xfx, je ).
  440.  
  441. ?- import append/3 from lists.
  442. ?- import is_list/1 from lists.
  443.  
  444. X + Y je Z :-
  445. is_list( Y ),
  446. append( X, Y, Z ).
  447.  
  448. X + Y je Z :-
  449. not( is_list( Y ) ),
  450. Y je T,
  451. X + T je Z.
  452.  
  453. /*
  454. Neka je zadana baza činjenica kao što slijedi (jednostavni usmjereni graf):
  455.  
  456. put(a, b).
  457. put(b, c).
  458. put(b, d).
  459. put(c, e).
  460. put(d, e).
  461. put(e, f).
  462.  
  463. 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.
  464.  
  465. Primjeri korištenja:
  466.  
  467. | ?- putanja(a, f, P).
  468.  
  469. P = [a,b,c,e,f];
  470.  
  471. P = [a,b,d,e,f];
  472.  
  473. no
  474. | ?- putanja(b, C, P).
  475.  
  476. C = c
  477. P = [b,c];
  478.  
  479. C = d
  480. P = [b,d];
  481.  
  482. C = e
  483. P = [b,c,e];
  484.  
  485. C = f
  486. P = [b,c,e,f];
  487.  
  488. C = e
  489. P = [b,d,e];
  490.  
  491. C = f
  492. P = [b,d,e,f];
  493.  
  494. no
  495.  
  496. */
  497.  
  498. put(a, b).
  499. put(b, c).
  500. put(b, d).
  501. put(c, e).
  502. put(d, e).
  503. put(e, f).
  504.  
  505. putanja(X,Y,[X,Y]) :-
  506. put(X,Y).
  507.  
  508. putanja(X,Y,[X|R]) :-
  509. put(X,Z),
  510. putanja(Z,Y,R).
  511. `
  512. dionica(a,b,5,130,100).
  513. dionica(a,c,10,50,0).
  514. dionica(b,d,5,130,100).
  515. dionica(b,e,5,130,100).
  516. dionica(c,e,10,50,0).
  517. dionica(c,f,15,80,0).
  518. dionica(e,g,15,80,0).
  519. dionica(d,g,5,130,100).
  520. dionica(g,h,10,50,0).
  521. dionica(g,i,5,130,100).
  522. dionica(f,h,15,80,0).
  523. dionica(h,i,15,80,0).
  524.  
  525.  
  526. najkraci_put(T1,T2,[ T1 | T2 ],U):-
  527. dionica(T1,T2,U,_,_).
  528. najkraci_put(T1,T2,[ T1 | P ],S):-
  529. dionica(T1,X,U,_,_),
  530. najkraci_put(X,T2,P,U1),
  531. S is U + U1.
  532.  
  533. a1:vozilo[boja->plava,godina_proizvodnje->2005].
  534. a2:vozilo[boja->zuta,godina_proizvodnje->1977].
  535. a3:vozilo[boja->zelena,godina_proizvodnje->1980].
  536. a4:vozilo[boja->crvena,godina_proizvodnje->2013].
  537. a5:vozilo[boja->zuta,godina_proizvodnje->2014].
  538. a6:vozilo[boja->plava,godina_proizvodnje->2002].
  539. a7:vozilo[boja->zelena,godina_proizvodnje->1990].
  540. a8:vozilo[boja->crvena,godina_proizvodnje->2003].
  541.  
  542.  
  543.  
  544.  
  545. ?vozilo[je_oldtimer(?sada)->?je_oldtimer]:-?vozilo[godina_proizvodnje->?godina_proizvodnje],
  546. ?je_oldtimer \is ?sada-?godina_proizvodnje.
  547.  
  548. ?x[je_oldtimer]:-?x:vozilo[je_oldtimer(2015)->?je_oldtimer], ?je_oldtimer>30.
  549.  
  550.  
  551. ?x[opis->?o]:-?x:vozilo[boja->?o].
  552.  
  553. vozila_prema_rasponu_godina (?x, ?y, ?v) :-
  554. ?v[godina_proizvodnje->?v1],
  555. ?prva \is ?x, ?druga \is ?y,
  556. ?v1>?prva, ?v1<?druga
  557.  
  558.  
  559. ?r:rijecnik[%dodaj(?k,?v)]:-not(?r[?k->?_]),t_insert{?r[?k->?v]}.
  560.  
  561. ?r:rijecnik[%brisi(?k)]:-t_delete{?r[?k->?_]}.
  562.  
  563. ?r:rijecnik[%azuriraj(?k,?v)]:-?r[%brisi(?k)],?r[%dodaj(?k,?v)].
  564.  
  565. ?r:rijecnik[%prikazi(?x)]:-?x=collectset{?z | ?r[?k->?v], ?z=r(?k->?v)}.
  566.  
  567. a:cvor[brid->{b,c,d}].
  568. b:cvor[brid->{c,e}].
  569. c:cvor[brid->{e,d}].
  570. d:cvor[brid->f].
  571. e:cvor[brid->f].
  572. F:cvor.
  573.  
  574. ?c:cvor[put->?x]:-?c[brid->?x].
  575. ?c:cvor[put->?x]:-?c[brid->?y],?y[put->?x].
  576.  
  577. ?c:cvor[duljina(?x)->1]:-?c[brid->?x].
  578. ?c:cvor[duljina(?x)->?d]:-?c[brid->?y],?y[duljina(?x)->?d1],?d is ?d1+1.
  579.  
  580. obojeni_cvor::cvor.
  581. x:obojeni_cvor[boja->zuta, brid->a].
  582. y:obojeni_cvor[boja->zelena, brid->b].
  583. z:obojeni_cvor[boja->zelena, brid->c].
  584.  
  585. ?c:cvor[put2->?x]:-?c[brid->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor).
  586. ?c:cvor[put2->?x]:-?c[brid->?y],?y[put2->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor),not(?y:obojeni_cvor).
  587.  
  588.  
  589. Zadan je xml dokument na sljedecoj adresi: http://arka.foi.hr/~mschatten/lp/rok.xml
  590. Potrebno je implementirati predikat rok/5 koji iz zadanog dokumenta izvlaci id, kolegij, datum, vrijeme i
  591. dvoranu roka. Pri tome je dopusteno koristiti ugradene predikate.
  592. Primjer koristenja:
  593. j ?􀀀 rok ( I , K, D, V, Dv ) .
  594. I = LP1
  595. K = Logi c ko p r o g r ami r a n j e
  596. D = 2014􀀀02􀀀11
  597. V = 16:00
  598. Dv = D5 ;
  599. I = TBP1
  600. K = Te o r i j a baza podataka
  601. D = 2014􀀀02􀀀12
  602. V = 16:00
  603. Dv = D2 ;
  604. I = VAS1
  605. K = Vi s e a g e n t n i s u s t a v i
  606. D = 2014􀀀02􀀀12
  607. V = 16:00
  608. Dv = D2 ;
  609. I = FOBP1
  610. K = F i z i c ko o b l i k o v a n j e baza podataka
  611. D = 2014􀀀02􀀀11
  612. V = 16:00
  613. Dv = D5 ;
  614.  
  615.  
  616. :- import load_xml_structure/3 from sgml.
  617. :- import parse_xpath/4 from xpath.
  618. :- import ith/3 from basics.
  619.  
  620. rok( Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
  621. XmlSource = url('http://arka.foi.hr/~mschatten/lp/rok.xml'),
  622. parse_xpath( XmlSource, '/rokovi/rok/id', Ids, [] ),
  623. parse_xpath( XmlSource, '/rokovi/rok/kolegij', Kolegiji, [] ),
  624. parse_xpath( XmlSource, '/rokovi/rok/datum', Datumi, [] ),
  625. parse_xpath( XmlSource, '/rokovi/rok/vrijeme', Vremena, [] ),
  626. parse_xpath( XmlSource, '/rokovi/rok/dvorana', Dvorane, [] ),
  627. dohvati_info(
  628. Ids, Kolegiji, Datumi, Vremena, Dvorane,
  629. Id, Kolegij, Datum, Vrijeme, Dvorana
  630. ).
  631.  
  632. get_element( element( _, _, [ X ] ), X ).
  633.  
  634. dohvati_info( Ids, Kolegiji, Datumi, Vremena, Dvorane,
  635. Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
  636.  
  637. load_xml_structure( string( Ids ), Id_struct, _ ),
  638. load_xml_structure( string( Kolegiji ), Kolegij_struct, _ ),
  639. load_xml_structure( string( Datumi ), Datum_struct, _ ),
  640. load_xml_structure( string( Vremena ), Vrijeme_struct, _ ),
  641. load_xml_structure( string( Dvorane ), Dvorana_struct, _ ),
  642.  
  643. ith( I, Id_struct, Id_elem ),
  644. ith( I, Kolegij_struct, Kolegij_elem ),
  645. ith( I, Datum_struct, Datum_elem ),
  646. ith( I, Vrijeme_struct, Vrijeme_elem ),
  647. ith( I, Dvorana_struct, Dvorana_elem ),
  648.  
  649. get_element( Id_elem, Id ),
  650. get_element( Kolegij_elem, Kolegij ),
  651. get_element( Datum_elem, Datum ),
  652. get_element( Vrijeme_elem, Vrijeme ),
  653. get_element( Dvorana_elem, Dvorana ).
  654.  
  655. Rjesenje prethodnog zadatka pohranite u datoteku dohvat.P te ju koristite kao modul unutar
  656. ora-2
  657. stroja. Potrebno je implementirati klasu rok koja sadrzi atribute kolegij, datum, vrijeme i dvorana.
  658.  
  659. Implementirajte predikat rokovi prema dvoranama/2 koji ce uz svoje parametre vezati dvorane te
  660. odgovarajuce liste rokova koji se odrzavaju u toj dvorani.
  661.  
  662. ?- [dohvat].
  663.  
  664. load_rokovi :-
  665. rok( ?id, ?kolegij, ?datum, ?vrijeme, ?dvorana )@_prolog,
  666. insert { ?id : rok [
  667. kolegij -> ?kolegij,
  668. datum -> ?datum,
  669. vrijeme -> ?vrijeme,
  670. dvorana -> ?dvorana
  671. ] }.
  672. ?- load_rokovi.
  673.  
  674. rokovi_prema_dvoranama( ?dvorana, ?kolegiji ) :-
  675. ?_ : rok [ dvorana -> ?dvorana ],
  676. ?kolegiji = setof { ?_id | ?_id : rok [ dvorana -> ?dvorana ] }.
  677.  
  678. rokovi_prema_datumima( ?datum, ?vrijeme, ?rokovi ) :-
  679. ?_ : rok [ datum -> ?datum, vrijeme -> ?vrijeme ],
  680. ?rokovi = setof { ?_id | ?_id : rok [ datum -> ?datum, vrijeme -> ?vrijeme ] }.
  681.  
  682.  
  683.  
  684. :-import load_xml_structure/3 from sgml.
  685. :-import parse_xpath/4 from xpath.
  686. :-import ith/3 from basics.
  687. dio( sifra, naziv):-
  688. XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
  689. parse_xpath(XmlSource, '/djelovi/dio/sifra',S,[]),
  690. parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
  691. dohvati(S, N, sifra, naziv).
  692. get_element( element( _, _, [ X ] ), X ).
  693. dohvati(S,N,sifra,naziv):-
  694. load_xml_structure( string( S ), sifra_struct, _ ),
  695. load_xml_structure( string( N ), naziv_struct, _ ),
  696.  
  697. ith( S, sifra_struct, sifra_elem ),
  698. ith( N, naziv_struct, naziv_elem ),
  699.  
  700. get_element( sifra_elem, sifra ),
  701. get_element( naziv_elem, naziv ).
  702.  
  703. ima(naziv):-
  704. XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
  705. parse_xpath(XmlSource, '/djelovi/dio/sastav',sastavS,[]),
  706. parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
  707. skini(sastavS, N, naziv).
  708.  
  709. skini(S,N,naziv):-
  710. load_xml_structure( string( S ), sastav_struct, _ ),
  711. load_xml_structure( string( N ), naziv_struct, _ ),
  712.  
  713. ith( S, sastav_struct, sastav_elem ),
  714. ith( N, naziv_struct, naziv_elem ),
  715.  
  716.  
  717. sastav is 0 -> !;true.
  718.  
  719. komponenta(naziv,popis):-
  720. ima(naziv), ispis(popis, naziv).
  721. ispis(popis,naziv):-
  722. XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
  723. parse_xpath(XmlSource, '/djelovi/dio/',S,[]),
  724. parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
  725. dohvati(S, N, sifra, naziv).
  726. a : cvor [ brid -> { b, c, d } ].
  727. b : cvor [ brid -> { c, e } ].
  728. c : cvor [ brid -> { e, d } ].
  729. d : cvor [ brid -> f ].
  730. e : cvor [ brid -> f ].
  731. f : cvor.
  732.  
  733. // 1) Implementirajte metodu put/0 klase cvor koja vraća sve čvorove kojima je
  734. // trenutni čvor povezan usmjerenom putanjom. (2 boda)
  735. ?_n : cvor [ put -> ?x ] :-
  736. ?_n [ brid -> ?x ].
  737. ?_n : cvor [ put -> ?x ] :-
  738. ?_n [ brid -> ?_m ],
  739. ?_m [ put -> ?x ].
  740.  
  741. // 2) Implementirajte metodu duljina/1 klase cvor koja za primljeni čvor vraća
  742. // sve udaljenosti od trenutnog čvora. (2 boda)
  743. ?_n : cvor [ duljina( ?_n ) -> 0 ].
  744. ?_n : cvor [ duljina( ?_tn ) -> 1 ] :-
  745. ?_n [ brid -> ?_tn ].
  746. ?_n : cvor [ duljina( ?_tn ) -> ?d ] :-
  747. ?_n [ brid -> ?_m ],
  748. ?_m [ duljina( ?_tn ) -> ?_y ],
  749. ?d is ?_y + 1.
  750.  
  751. // 3) Implementirajte klasu obojeni cvor koja naslijeđuje iz klase cvor te ima
  752. // dodatni atribut boja. Dodajte tri obojena čvora (x, y, z) koji imaju boje
  753. // žuta, plava i zelena i imaju bridove k čvorovima a, b i c respektivno.
  754. // (3 boda)
  755. obojeni_cvor :: cvor [
  756. boja => string
  757. ].
  758. x : obojeni_cvor [ boja -> zuta, brid -> a ].
  759. y : obojeni_cvor [ boja -> plava, brid -> b ].
  760. z : obojeni_cvor [ boja -> zelena, brid -> c ].
  761.  
  762.  
  763. // 4) Izmjenite metodu put iz prvog zadatka tako da ona vrijedi samo za
  764. // neobojene čvorove. Novu metodu nazovite put2/0. (3 boda)
  765. ?_n : cvor [ put2 -> ?x ] :-
  766. not(?_n [ boja -> ?_ ]),
  767. ?_n [ brid -> ?x ].
  768. ?_n : cvor [ put2 -> ?x ] :-
  769. not(?_n [ boja -> ?_ ]),
  770. ?_n [ brid -> ?_m ],
  771. ?_m [ put2 -> ?x ].
  772.  
  773. % 1) Implementrajte predikate pocetak/1 (početni čvor), kraj/1 (završni čvor),
  774. % boja/2 (boja čvora) i put/2 (veza izmedu dva čvora). (2 boda)
  775. pocetak(1).
  776. kraj(11).
  777.  
  778. boja(2, crna).
  779. boja(6, crna).
  780. boja(9, crna).
  781. boja(_X, bijela) :-
  782. not(boja(_X, crna)).
  783.  
  784. put(1, 2).
  785. put(1, 3).
  786. put(2, 3).
  787. put(3, 4).
  788. put(3, 7).
  789. put(4, 5).
  790. put(4, 6).
  791. put(5, 8).
  792. put(6, 7).
  793. put(6, 8).
  794. put(7, 9).
  795. put(8,10).
  796. put(9,10).
  797. put(9,11).
  798. put(10, 11). % na grafu nije oznacena, ali u rezultatima se pojavljuje
  799.  
  800. % 2) Implementirajte predikat bijeli_put/2 koji će za dva čvora provjeriti jesu
  801. % li oba bijela i povezana putem. (2 boda)
  802. bijeli_put(X, Y) :-
  803. put(X, Y),
  804. boja(X, bijela),
  805. boja(Y, bijela).
  806.  
  807.  
  808. % 3) Implementirajte predikat bijela_putanja/2 koji će provjeriti postoji li
  809. % izmedu dva čvora putanja u kojoj su svi među-čvorovi bijeli. (3 boda)
  810. bijela_putanja(X, Y) :-
  811. bijeli_put(X, Y).
  812. bijela_putanja(X, Y) :-
  813. bijeli_put(X, Z),
  814. bijela_putanja(Z, Y).
  815.  
  816. % 4) Implementirajte predikat bijela_putanja/3 koja će se ponašati isto kao i
  817. % predikat u predhodnom zadatku uz nadopunu da će u trećem argumentu
  818. % prikupiti listu elemenata koji su na tom putu. (3 boda)
  819. bijela_putanja(X, X, [ X ]) :-
  820. boja(X, bijela).
  821. bijela_putanja(X, Y, [ X, Y ]) :-
  822. bijeli_put(X, Y).
  823. bijela_putanja(X, Y, [ X | Putanja ]) :-
  824. bijeli_put(X, Z),
  825. bijela_putanja(Z, Y, Putanja).
  826.  
  827. ?- [s>>s1].
  828. ?- [s>>s2].
  829.  
  830. ?- insert { B[ k->s1 ]@s1 }.
  831. ?- delete { I(p1)@s1 }.
  832.  
  833.  
  834. percipira( ?agent, ?svijet, ?svjetovi ) :-
  835. ?svjetovi = setof { ?_vidi | ?agent[ k->?_vidi ]@?svijet }.
  836.  
  837.  
  838. vrijedi_u_svjetovima( ?_, [] ).
  839. vrijedi_u_svjetovima( ?propozicija, [ ?svijet | ?r ] ) :-
  840. I( ?propozicija )@?svijet,
  841. vrijedi_u_svjetovima( ?propozicija, ?r ).
  842.  
  843. zna( ?agent, ?propozicija, ?svijet ) :-
  844. percipira( ?agent, ?svijet, ?_svjetovi ),
  845. vrijedi_u_svjetovima( ?propozicija, ?_svjetovi ).
  846.  
  847. I(p1).
  848. I(p2).
  849.  
  850. A[ k->s1, k->s2 ].
  851. B[ k->s2 ].
  852.  
  853.  
  854. hodnik [ vrata -> 'dnevni boravak', vrata -> 'spavaca soba' ].
  855. 'spavaca soba' [ vrata -> kupaona ].
  856. 'dnevni boravak' [ vrata -> kuhinja ].
  857. kuhinja [ sadrzi -> pizza ].
  858. igrac [ pozicija -> hodnik ].
  859.  
  860. // 1) Potrebno je implementirati pravilo po kojem će vrijediti da ako iz jedne
  861. // sobe postoje vrata u drugu, tada postoje i vrata iz druge u prvu. (2 boda)
  862. ?prostorija [ vrata -> ?soba ] :-
  863. ?soba [ vrata -> ?prostorija ].
  864.  
  865. // 2) Potrebno je implementirati predikat put/2 koji će provjeravati postoji li
  866. // izmedu dvije sobe put. (2 boda)
  867. put(?soba1, ?soba2) :-
  868. ?soba1 [ vrata -> ?soba2 ].
  869. put(?soba1, ?soba2) :-
  870. ?soba1 [ vrata -> ?soba3 ],
  871. put(?soba3, ?soba2).
  872.  
  873. // 3) Potrebno je implementirati metodu idi/1 objekta igrač koja će provjeriti
  874. // postoji li za igrača put u zadanu sobu te promijeniti njegovu poziciju.
  875. // (3 boda)
  876. igrac [ idi(?soba) ] :-
  877. igrac [ pozicija -> ?trenutna ],
  878. put(?trenutna, ?soba),
  879. delete { igrac [ pozicija -> ?trenutna] },
  880. insert { igrac [ pozicija -> ?soba ] }.
  881.  
  882. // 4) Potrebno je implementirati metodu uzmi/1 objekta igrac koja će provjeriti
  883. // nalazi li se zadana stvar u trenutnoj sobi igrača, ukloniti stvar iz sobe,
  884. // te igraču pridodati atribut ima čija vrijednost će biti zadana stvar.
  885. // (3 boda)
  886. igrac [ uzmi(?predmet) ] :-
  887. igrac [ pozicija -> ?trenutna ],
  888. ?trenutna [ sadrzi -> ?predmet ],
  889. igrac [ ima -> ?stari_predmet ],
  890. delete { igrac [ ima -> ?stari_predmet ] },
  891. delete { ?trenutna [ sadrzi -> ?predmet ] },
  892. insert { igrac [ ima -> ?predmet ] }.
  893. igrac [ uzmi(?predmet) ] :-
  894. igrac [ pozicija -> ?trenutna ],
  895. ?trenutna [ sadrzi -> ?predmet ],
  896. delete { ?trenutna [ sadrzi -> ?predmet ] },
  897. insert { igrac [ ima -> ?predmet] }.
  898.  
  899. Zadana je baza znanja:
  900. a : cvor [b r i d −>{b, c, d } ].
  901. b : cvor [b r i d −>{c, e } ].
  902. c : cvor [b r i d −>{e, d } ].
  903. d : cvor [b r i d −>f].
  904. e : cvor [b r i d −>f].
  905. f : cvor .
  906. ________________________________________
  907. Implementirajte metodu put/0 klase cvor koja vraca sve cvorove kojima je trenutni cvor povezan usmjerenom putanjom.
  908. Primjeri korištenja:
  909. flora2 ?− c [ put −>?x ] .
  910. ?x = d
  911. ?x = e
  912. ?x = f
  913. 3 solution (s) in 0.0000 seconds
  914. Yes
  915. flora2 ?− a [ put −>?x ] .
  916. ?x = b
  917. ?x = c
  918. ?x = d
  919. ?x = e
  920. ?x = f
  921. Rj.:
  922. ?c:cvor[put->?x]:-?c[brid->?x].
  923. ?c:cvor[put->?x]:-?c[brid->?y],?y[put->?x]
  924. ________________________________________
  925. Implementirajte metodu duljina/1 klase cvor koja za primljeni cvor vraca sve udaljenosti od trenutnog cvora.
  926. Primjeri koristenja:
  927. flora2 ?− a [ duljina ( c )−>?x ] .
  928. ?x = 1
  929. ?x = 2
  930. 2 solution ( s ) in 0.0040 seconds
  931. Yes
  932. flora2 ?− a [duljina ( e )−>?x ] .
  933. ?x = 2
  934. Rj.:
  935. ?c:cvor[duljina(?x)->1]:-?c[brid->?x].
  936. ?c:cvor[duljina(?x)->?d]:-?c[brid->?y],?y[duljina(?x)->?d1],?d is ?d1+1.
  937. ________________________________________
  938. 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.
  939. Primjeri koristenja:
  940. flora2 ?− ?C : obojeni_cvor [boja−>?boja ,brid−>? brid] .
  941. ?C = x
  942. ? boja = zuta
  943. ? brid = a
  944. ?C = y
  945. ? boja = plava
  946. ? brid = b
  947. ?C = z
  948. ? boja = zelena
  949. ? brid = c
  950. Rj.:
  951. obojeni_cvor::cvor.
  952. x:obojeni_cvor[boja->zuta, brid->a].
  953. y:obojeni_cvor[boja->zelena, brid->b].
  954. z:obojeni_cvor[boja->zelena, brid->c].
  955. ________________________________________
  956. Izmjenite metodu put iz prvog zadatka tako da ona vrijedi samo za neobojene cvorove. Novu petodu nazovite put2/0.
  957. Primjeri koristenja:
  958. flora2 ?− x [ put −>?y ] .
  959. ?y = a
  960. ?y = b
  961. ?y = c
  962. ?y = d
  963. ?y = e
  964. ?y = f
  965. 6 solution (s) in 0.0000 seconds
  966. Yes
  967. flora2 ?− x [ put2 −>?y ] .
  968. No
  969. Rj.:
  970. ?c:cvor[put2->?x]:-?c[brid->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor).
  971. ?c:cvor[put2->?x]:-?c[brid->?y],?y[put2->?x],not(?c:obojeni_cvor),not(?x:obojeni_cvor),not(?y:obojeni_cvor).
  972.  
  973.  
  974.  
  975. Neka je zadana baza znanja:
  976. zaposlenik::osoba.
  977. kupac::osoba.
  978. menadzer::zaposlenik.
  979. direktor::menadzer.
  980. stefica:kupac.
  981. ivek:zaposlenik.
  982. joza:menadzer.
  983. bara:direktor.
  984. ivek[ placa->100 ].
  985. joza[ placa->200 ].
  986. bara[ placa->300 ].
  987. ________________________________________
  988. Implementirajte metodu ukupne_place koja će za zadanu klasu vratiti zbroj svih plaća objekata u toj klasi.
  989. Primjeri korištenja:
  990. flora2 ?- osoba[ ukupne_place->?p ].
  991. ?p = 600
  992. 1 solution(s) in 0.0100 seconds
  993. Yes
  994. flora2 ?- zaposlenik[ ukupne_place->?p ].
  995. ?p = 600
  996. 1 solution(s) in 0.0000 seconds
  997. Yes
  998. flora2 ?- menadzer[ ukupne_place->?p ].
  999. ?p = 500
  1000. 1 solution(s) in 0.0000 seconds
  1001. Yes
  1002. flora2 ?- direktor[ ukupne_place->?p ].
  1003. ?p = 300
  1004. 1 solution(s) in 0.0000 seconds
  1005. Yes
  1006. Rj.:
  1007. osoba[ukupne_place => integer].
  1008. zaposlenik::osoba[placa => integer].
  1009. ?osoba[ukupne_place -> ?ukupna_placa] :-
  1010. ?ukupna_placa = sum{? _ g | ? _ :?osoba[placa->?_g]}.
  1011. ________________________________________
  1012. Implementirajte meta-predikat (naziv/funktor predikata je varijabilan) koji će omogućiti vraćanje liste objekata koji su u
  1013. klasi zadanom nazivom predikata.
  1014. Primjeri korištenja:
  1015. flora2 ?- osoba( ?x ).
  1016. ?x = [bara, ivek, joza, stefica]
  1017. 1 solution(s) in 0.0100 seconds
  1018. Yes
  1019. flora2 ?- kupac( ?x ).
  1020. ?x = [stefica]
  1021. 1 solution(s) in 0.0000 seconds
  1022. Yes
  1023. flora2 ?- zaposlenik( ?x ).
  1024. ?x = [bara, ivek, joza]
  1025. 1 solution(s) in 0.0000 seconds
  1026. Yes
  1027. flora2 ?- menadzer( ?x ).
  1028. ?x = [bara, joza]
  1029. 1 solution(s) in 0.0000 seconds
  1030. Yes
  1031. flora2 ?- direktor( ?x ).
  1032. ?x = [bara]
  1033. 1 solution(s) in 0.0000 seconds
  1034. Yes
  1035. Rj.
  1036. ?predikat(?x) :- ?x = collectset{?_g| ?_g:?predikat}.
  1037.  
  1038.  
  1039.  
  1040. Neka je zadana sljedeća baza znanja u F-logici:
  1041. Joza:osoba[ roditelj->{ Stef, Bara }, spol->musko ].
  1042. Stef:osoba[ roditelj->{ Stefica, Ivek }, spol->musko ].
  1043. Bara:osoba[ roditelj->{ Slavek, Marica }, spol->zensko ].
  1044. Ivek:osoba[ spol->musko ].
  1045. Stefica:osoba[ spol->zensko ].
  1046. Slavek:osoba[ spol->musko ].
  1047. Marica:osoba[ spol->zensko ].
  1048. ________________________________________
  1049. Implementirajte metode baka i predak za klasu osoba. Primjeri korištenja:
  1050. flora2 ?- ?x[ baka->?y ].
  1051. ?x = Joza
  1052. ?y = Marica
  1053. ?x = Joza
  1054. ?y = Stefica
  1055. 2 solution(s) in 0.0000 seconds
  1056. Yes
  1057. flora2 ?- Joza[ predak->?y ].
  1058. ?y = Bara
  1059. ?y = Ivek
  1060. ?y = Marica
  1061. ?y = Slavek
  1062. ?y = Stef
  1063. ?y = Stefica
  1064. 6 solution(s) in 0.0000 seconds
  1065. Yes
  1066. flora2 ?-
  1067. Rj.:
  1068. osoba [ roditelj = > osoba, spol = > string, baka = > osoba, predak = > osoba ].
  1069. ?osoba[baka -> ?baka] :- ?osoba[roditelj->?roditelj], ?roditelj[roditelj->?baka], ?baka[spol->zensko].
  1070. ?osoba[predak -> ?predak] :- ?osoba[roditelj->?predak].
  1071. ?osoba[predak -> ?predak] :- ?osoba[predak -> ?x], ?x[roditelj->?predak].
  1072. Joza:osoba[ roditelj->{ Stef, Bara }, spol->musko ].
  1073. Stef:osoba[ roditelj->{ Stefica, Ivek }, spol->musko ].
  1074. Bara:osoba[ roditelj->{ Slavek, Marica }, spol->zensko ].
  1075. Ivek:osoba[ spol->musko ].
  1076. Stefica:osoba[ spol->zensko ].
  1077. Slavek:osoba[ spol->musko ].
  1078. Marica:osoba[ spol->zensko ].
  1079.  
  1080.  
  1081.  
  1082. Implementirajte sljedeći UML dijagram u F-logici:
  1083. http://arka.foi.hr/~mschatten/lp/uml_manageri.png
  1084. Metoda podređeni prima naziv odjela i vraća listu podređenih datog menadžera.
  1085. Primjerice neka je zadana sljedeća baza znanja:
  1086. ivek:zaposlenik[ ime->Ivan, prezime->Presvetli, nadredjeni->bara, odjel->Marketing ].
  1087. joza:zaposlenik[ ime->Josip, prezime->Prikratki, nadredjeni->bara, odjel->Marketing ].
  1088. bara:menadzer[ ime->Barica, prezime->Jambrek ].
  1089. Tada će se program ponašati na sljedeći način:
  1090. flora2 ?- bara[ podredjeni( Marketing ) -> ?x ].
  1091. ?x = [ivek, joza]
  1092. 1 solution(s) in 0.0000 seconds
  1093. Yes
  1094. Rj.:
  1095. zaposlenik [ ime => _string, prezime => _string, nadredjeni => menadzer, odjel => _string ].
  1096. menadzer::zaposlenik[podredjeni(_string)=>zaposlenik].
  1097. ?menadzer[podredjeni(?odjel)->?podredjeni] :-
  1098. ?podredjeni = collectset{?_g| ?_g:zaposlenik[nadredjeni->?menadzer, odjel-> ?odjel]}.
  1099. ivek:zaposlenik[ ime->Ivan, prezime->Presvetli, nadredjeni->bara, odjel->Marketing ].
  1100. joza:zaposlenik[ ime->Josip, prezime->Prikratki, nadredjeni->bara, odjel->Marketing ].
  1101. bara:menadzer[ ime->Barica, prezime->Jambrek ].
  1102.  
  1103.  
  1104.  
  1105. Neka je zadan modul kuca.flr koji definira objekte koji predstavljaju sobe u kući te trenutnu poziciju igrača.
  1106. hodnik[vrata−>’dnevni boravak’, vrata−>’spavaca soba’].
  1107. ’spavaca soba’[vrata−>kupaona].
  1108. ’dnevni boravak’ [vrata−>kuhinja].
  1109. kuhinja [sadrzi−>pizza].
  1110. igrac[pozicija−>hodnik].
  1111. ________________________________________
  1112. 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.
  1113. Primjer korištenja:
  1114. flora2 ?− kuhinja[vrata−>?soba].
  1115. ? soba = dnevni boravak
  1116. 1 solution (s) in 0.0000 seconds
  1117. Rj.:
  1118. ?x[vrata->?soba] :- ?soba[vrata->?x].
  1119. ________________________________________
  1120. 2.Potrebno je implementirati predikat put/2 koji ́ce provjeravati je li izmedu dvije sobe postoji put.
  1121. Primjer korištenja:
  1122. flora2 ?− put(hodnik, ?soba).
  1123. ? soba = dnevni boravak
  1124. ? soba = hodnik
  1125. ? soba = kuhinja
  1126. ? soba = kupaona
  1127. ? soba = spavaca soba
  1128. 5 solution(s) in 0.0000 seconds
  1129. Rj.:
  1130. put(?x,?soba):-?x[vrata->?soba1],?soba1[vrata->?soba].
  1131. put(?x,?soba):-?x[vrata->?soba],?soba[vrata->?soba1],?soba1[vrata->?soba].
  1132. ________________________________________
  1133. 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.
  1134. Primjeri korištenja:
  1135. flora2 ?− igrac [idi (kuhinja)].
  1136. Elapsed time 0.0000 seconds
  1137. Yes
  1138. flora2 ?− igrac [pozicija−>?soba].
  1139. ? soba = kuhinja
  1140. 1 solution(s) in 0.0000 seconds
  1141. Rj.:
  1142. ?i[idi(?soba)]:-?i[pozicija->?poz], ?poz[vrata->?soba], ?soba[vrata->?poz], delete{?i[pozicija->?poz]}, insert{?i[pozicija->?soba]},
  1143. refresh{?i[pozicija->?soba]}, ?i[pozicija->?soba].
  1144. ________________________________________
  1145. 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.
  1146. Primjeri korištenja:
  1147. flora2 ?− igrac [uzmi(pizza)].
  1148. Elapsed time 0.0000 seconds
  1149. Yes
  1150. flora2 ?− igrac [ima−>?stvar].
  1151. ?stvar = pizza
  1152. 1 solution(s) in 0.0000 seconds
  1153. Yes
  1154. flora2 ?− kuhinja [sadrzi−>?stvar].
  1155. No
  1156. Rj.:
  1157. ?i[uzmi(?stvar)] :- ?i[pozicija->?poz], ?poz[sadrzi->?stvar], delete{?poz[sadrzi->?stvar]}, insert{?i[ima->?stvar]}, refresh{?i[ima->?stvar]}, ?i[ima->?stvar].
  1158.  
  1159.  
  1160. Zadana je baza znaja o automobilima:
  1161. a1:vozilo[boja->plava,godina_proizvodnje->2005].
  1162. a2:vozilo[boja->zuta,godina_proizvodnje->1977].
  1163. a3:vozilo[boja->zelena,godina_proizvodnje->1980].
  1164. a4:vozilo[boja->crvena,godina_proizvodnje->2013].
  1165. a5:vozilo[boja->zuta,godina_proizvodnje->2014].
  1166. a6:vozilo[boja->plava,godina_proizvodnje->2002].
  1167. a7:vozilo[boja->zelena,godina_proizvodnje->1990].
  1168. a8:vozilo[boja->crvena,godina_proizvodnje->2003].
  1169. ________________________________________
  1170. 1. Potrebno je implementirati atribut je_oldtimer klase vozilo koji pokazuje je li neko vozilo starije od 30godina.
  1171. Primjer korištenja:
  1172. ?x[je_oldtimer].
  1173. ?x=a2
  1174. ?x=a3.
  1175. ?vozilo[je_oldtimer(?sada)->?je_oldtimer]:-?vozilo[godina_proizvodnje->?godina_proizvodnje],
  1176. ?je_oldtimer \is ?sada-?godina_proizvodnje.
  1177. ?x[je_oldtimer]:-?x:vozilo[je_oldtimer(2015)->?je_oldtimer], ?je_oldtimer>30.
  1178. ________________________________________
  1179. 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.
  1180. Primjeri korištenja:
  1181. ?x[opis->?o].
  1182. ?x=a1
  1183. ?o=plavo_vozilo
  1184. ?x=a2
  1185. ?o=zuto_vozilo
  1186. ?x=a3
  1187. ?o=zeleno_vozilo
  1188. ?x=a4
  1189. ?o=crveno_vozilo
  1190. ..
  1191. ?x[opis->?o]:-?x:vozilo[boja->?o].
  1192. ????????
  1193. ________________________________________
  1194. 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.
  1195. Primjeri korištenja:
  1196. vozila_prema_rasponu_godina(2000,2015,?v).
  1197. ?v=a1
  1198. ?v=a4
  1199. ?v=a5
  1200. ?v=a6
  1201. ?v=a8
  1202. vozila_prema_rasponu_godina(?x,?y,?v):-?v[godina_proizvodnje->?v1], ?prva \is ?x, ?druga \is ?y, ?v1>?prva, ?v1<?druga.
  1203. ________________________________________
  1204. 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.
  1205. Primjeri korištenja:
  1206. vozila_po_boji(plava,?v).
  1207. ?v=[v(a1,2005),v(a6,2002)]
  1208. vozila_po_boji(?_boja,?v):-?v=collectset{?v[?_boja]|?v:vozilo[boja->?_boja]}.
  1209.  
  1210.  
  1211. Potrebno je implementirati apstraktni tip podataka rjeˇcnik (asocijativni niz) u Flori-2. Obratite pozornost na to
  1212. da akcije ažuriranja trebaju biti transakcijske, kako bi se izbjegli neˇzeljeni rezultati (koriˇstenje prefiksa ’%’ kod metoda
  1213. objekta i metoda aˇzuriranja s prefiksom ’t ’).
  1214. 1. (2 boda) Implementirajte metodu dodaj/2 koja ́ce primati dva parametra (ključ i vrijednost) i dodavati odgo-
  1215. varaju ́ce vrijednosti u rijeˇcnik.
  1216. Primjeri koriˇstenja:
  1217. f l o r a 2 ?− i n s e r t { a : r j e c n i k } .
  1218. f l o r a 2 ?− a [ %d o d a j ( 1 , 2 ) ] .
  1219. Elapsed time 0.0000 seconds
  1220. Yes
  1221. f l o r a 2 ?− a [ ? x−>?y ] .
  1222. ?x = 1
  1223. ?y = 2
  1224. f l o r a 2 ?− a [ %d o d a j ( 1 , 3 ) ] .
  1225. No
  1226. f l o r a 2 ?− a [ ? x−>?y ] .
  1227. ?x = 1
  1228. ?y = 2
  1229. 1 s o l u t i o n ( s ) in 0.0000 seconds
  1230. Yes
  1231. f l o r a 2 ?− a [ %d o d a j ( 2 , 3 ) ] .
  1232. 1Elapsed time 0.0000 seconds
  1233. Yes
  1234. f l o r a 2 ?− a [ ? x−>?y ] .
  1235. ?x = 1
  1236. ?y = 2
  1237. ?x = 2
  1238. ?y = 3
  1239. 2 s o l u t i o n ( s ) in 0.0000 seconds
  1240. Yes
  1241. Rješenje:
  1242. ?r:rjecnik[%dodaj(?k,?v)]:-?r[not(?k->?_)],t_insert{?r[?k->?v]}.
  1243. ________________________________________
  1244. 1. (2 boda) Implementirajte metodu brisi/1 koja ́ce primati kljuˇc rijeˇcnika i obrisati vrijednost pod zadanim kljuˇcem.
  1245. Primjeri koriˇstenja:
  1246. f l o r a 2 ?− a [ %b r i s i ( 2 ) ] .
  1247. Elapsed time 0.0000 seconds
  1248. Yes
  1249. f l o r a 2 ?− a [ ? x−>?y ] .
  1250. ?x = 1
  1251. ?y = 2
  1252. Rješenje:
  1253. ?r:rijecnik[%brisi(?k)]:-t_delete{?r[?k->?_]}.
  1254. ________________________________________
  1255. 1. (3 boda) Implementirajte metodu azuriraj/2 koja ́ce primati postoje ́ci kljuˇci za njega promijeniti trenutnu
  1256. vrijednost na prosljedenu.
  1257. Primjeri koriˇstenja:
  1258. f l o r a 2 ?− a [ %a z u r i r a j ( 1 , 3 ) ] .
  1259. Elapsed time 0.0000 seconds
  1260. Yes
  1261. f l o r a 2 ?− a [ ? x−>?y ] .
  1262. ?x = 1
  1263. ?y = 3
  1264. 1 s o l u t i o n ( s ) in 0.0040 seconds
  1265. Yes
  1266. f l o r a 2 ?− a [ %a z u r i r a j ( 2 , 3 ) ] .
  1267. No
  1268. 2f l o r a 2 ?− a [ ? x−>?y ] .
  1269. ?x = 1
  1270. ?y = 3
  1271. Rješenje:
  1272. ?r:rijecnik[%azuriraj(?k,?v)]:-?r[%brisi(?k)],?r[%dodaj(?k,?v)].
  1273. ________________________________________
  1274. 1. (3 boda) Implementirajte metodu prikazi/1 koja ́ce prikazati sadrˇzaj rjeˇcnika.
  1275. Primjeri koriˇstenja:
  1276. f l o r a 2 ?− a [ %p r i k a z i ( ? x ) ] .
  1277. ?x = [ r (1 ,2)]
  1278. 1 s o l u t i o n ( s ) in 0.0040 seconds
  1279. Yes
  1280. f l o r a 2 ?− a [ %d o d a j ( 3 , 4 ) ] .
  1281. Elapsed time 0.0000 seconds
  1282. Yes
  1283. f l o r a 2 ?− a [ %p r i k a z i ( ? x ) ] .
  1284. ?x = [ r (1 ,2) , r (3 ,4)]
  1285. Rješenje:
  1286. ?r:rijecnik[%prikazi(?x)]:-?x=collectset{?z | ?r[?k->?v], ?z=r(?k->?v)}.
  1287.  
  1288.  
  1289. Neka je zadan modul s.flr koji daje interpretaciju za odredeni svijet (relacija I ) te de
  1290. niciju mogucnosnih relacija za agente A i B (relacija k).
  1291. I ( p1 ) .
  1292. I ( p2 ) .
  1293. A[ k􀀀>s1 , k􀀀>s2 ] .
  1294. B[ k􀀀>s2 ] .
  1295. 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
  1296. logickog programa za rezoniranje u Kripkeovim strukturama.
  1297. 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.
  1298. Primjer koristenja:
  1299. f l o r a 2 ?􀀀 [ a g e n t i ] .
  1300. . . . u c i t a v a n j e modula . . .
  1301. Yes
  1302. f l o r a 2 ?􀀀 A[ k􀀀>? v i d i ]@?u .
  1303. ? v i d i = s1
  1304. ?u = s1
  1305. ? v i d i = s1
  1306. ?u = s2
  1307. ? v i d i = s2
  1308. ?u = s1
  1309. ? v i d i = s2
  1310. ?u = s2
  1311. Rješenje:
  1312. ?- [s>>s1].
  1313. ?- [s>>s2].
  1314. ________________________________________
  1315. 1. Potrebno je azurirati bazu znanja tako da se u logicki modul s1 doda cinjenica:
  1316. B[ k􀀀>s1 ] .
  1317. te obrise cinjenica (iz istog modula s1):
  1318. I ( p1 ) .
  1319. Rješenje:
  1320. ?- insert { B[ k->s1 ]@s1 }.
  1321. ?- delete { I(p1)@s1 }.
  1322. Oba azuriranja treba provesti pri pokretanju glavnog modula agenti.flr
  1323. Primjeri koristenja:
  1324. fl o r a 2 ?􀀀 [ a g e n t i ] .
  1325. . . . u c i t a v a n j e modula . . .
  1326. Yes
  1327. f l o r a 2 ?􀀀 B[ k􀀀>? v i d i ]@?u .
  1328. ? v i d i = s1
  1329. ?u = s1
  1330. ? v i d i = s2
  1331. ?u = s1
  1332. ? v i d i = s2
  1333. ?u = s2
  1334. f l o r a 2 ?􀀀 I (? v r i j e d i )@?u .
  1335. ? v r i j e d i = p1
  1336. ?u = s2
  1337. ? v r i j e d i = p2
  1338. ?u = s1
  1339. ? v r i j e d i = p2
  1340. ?u = s2
  1341. ________________________________________
  1342. 1. Potrebno je implementirati predikat percipira( ?agent, ?svijet, ?svijetovi ) koji ce za zadanog agenta
  1343. i zadani svijet uz varijablu ?svijetovi vezati listu svih svijetova koje agent percipira putem svoje mogucnosne
  1344. relacije k u zadanom svijetu.
  1345. Primjeri koristenja:
  1346. f l o r a 2 ?􀀀 p e r c i p i r a ( A, s1 , ? s ) .
  1347. ? s = [ s1 , s2 ]
  1348. f l o r a 2 ?􀀀 p e r c i p i r a ( B, s2 , ? s ) .
  1349. ? s = [ s2 ]
  1350. Rješenje:
  1351. percipira( ?agent, ?svijet, ?svjetovi ) :-
  1352. ?svjetovi = setof { ?_vidi | ?agent[ k->?_vidi ]@?svijet }.
  1353. ________________________________________
  1354. 1. Potrebno je implementirati predikat zna( ?agent, ?propozicija, ?svijet ) koji ce za zadanog agenta,
  1355. zadanu propoziciju i zadani svijet provjeriti je li agent zna propoziciju u tom svijetu. (Agent zna propoziciju p
  1356. akko ne postoji niti jedan svijet koji agent percipira, a da u njemu p ne vrijedi).
  1357. Primjeri koristenja:
  1358. fl o r a 2 ?􀀀 zna ( A, p1 , s1 ) .
  1359. No
  1360. f l o r a 2 ?􀀀 zna ( A, p2 , s2 ) .
  1361. El aps ed time 0.0000 s e c onds
  1362. Yes
  1363. Rješenje:
  1364. vrijedi_u_svjetovima( ?_, [] ).
  1365. vrijedi_u_svjetovima( ?propozicija, [ ?svijet | ?r ] ) :-
  1366. I( ?propozicija )@?svijet,
  1367. vrijedi_u_svjetovima( ?propozicija, ?r ).
  1368. zna( ?agent, ?propozicija, ?svijet ) :-
  1369. percipira( ?agent, ?svijet, ?_svjetovi ),
  1370. vrijedi_u_svjetovima( ?propozicija, ?_svjetovi ).
  1371.  
  1372.  
  1373. Neka je zadan usmjereni graf kao na slici:
  1374. Predikat veza/2 koji ce upjevati ako postoji veza od cvora zadanog u prvom parametru do cvora
  1375. zadanog u drugom parametru.
  1376. Primjeri koristenja:
  1377. v e za ( a , X ) .
  1378. X = b ;
  1379. X = c ;
  1380. no
  1381. j ?􀀀 v e za ( Y, h ) .
  1382. Y = f ;
  1383. Y = g ;
  1384. no
  1385. j ?􀀀
  1386. Rješenje:
  1387. veza(a, b).
  1388. veza(a, c).
  1389. veza(b, d).
  1390. veza(b, c).
  1391. veza(c, e).
  1392. veza(c, f).
  1393. veza(d, g).
  1394. veza(e, d).
  1395. veza(e, g).
  1396. veza(f, h).
  1397. veza(g, h).
  1398. ________________________________________
  1399. 2.Predikat putanja/2 koji ce provjeravati je li postoji usmjerena putanja izmedu cvorova. Primjeri
  1400. koristenja:
  1401. p u t a n j a ( d , X ) .
  1402. X = g;
  1403. X = h ;
  1404. no
  1405. j ?􀀀 p u t a n j a ( c , X ) .
  1406. X = e ;
  1407. X = f ;
  1408. X = d ;
  1409. X = g ;
  1410. X = g ;
  1411. X = h ;
  1412. X = h ;
  1413. X = h ;
  1414. Rješenje:
  1415. putanja(A, B) :-
  1416. veza(A, B).
  1417. putanja(A, B) :-
  1418. veza(A, C),
  1419. putanja(C, B).
  1420. ________________________________________
  1421. 1. Predikat dostupno/2 koji ce vracati listu onih cvorova koji su dostupni iz zadanog cvora. Primjeri
  1422. koristenja
  1423. ?􀀀 dos tupno ( c , L ) .
  1424. L = [ d , e , f , g , h ] ;
  1425. Rješenje:
  1426. dostupno(A, L) :-
  1427. setof(_B, putanja(A, _B), L).
  1428. ________________________________________
  1429. 1. Predikat put od do/3 koji ce za zadane cvorove u listi vratiti putanju izmedu njih, ako ona postoji.
  1430. Radi mogucnoti beskonacne petlje, tablirajte predikat direktivom
  1431. :􀀀 t a b l e put od do / 3.
  1432. Primjeri korištenja:
  1433. put od do ( a , d , P ) .
  1434. P = [ a , c , e , d ] ;
  1435. P = [ a , b , d ] ;
  1436. P = [ a , b , c , e , d ] ;
  1437. Rješenje:
  1438. put_od_do(A, A, [A]).
  1439. put_od_do(A, B, [A, B]) :-
  1440. veza(A, B).
  1441. put_od_do(A, B, [A | Put]) :-
  1442. veza(A, C),
  1443. put_od_do(C, B, Put).
  1444. :- table put_od_do/3.
  1445.  
  1446.  
  1447. Neka je zadan obojeni, usmjereni graf s naznacenim pocetkom (cvor 1) i krajem (cvor 11) kao na slici:
  1448. 1.Implementrajte predikate pocetak/1 (pocetni cvor), kraj/1 (zavrsni cvor), boja/2 (boja cvora) i put/2
  1449. (veza izmedu dva cvora) koji ce imati sljedece ponasanje:
  1450. ?􀀀 poc e t ak ( P ) , k r a j ( K ) .
  1451. P = 1
  1452. K = 1 1 ;
  1453. no
  1454. j ?􀀀 bo j a ( 1 , X ) .
  1455. X = b i j e l a
  1456. y e s
  1457. j ?􀀀 bo j a ( 2 , X ) .
  1458. X = c rna
  1459. y e s
  1460. j ?􀀀 put ( 9 , X ) .
  1461. X = 1 0 ;
  1462. X = 1 1 ;
  1463. Rješenje:
  1464. boja(2, crna).
  1465. boja(6, crna).
  1466. boja(9, crna).
  1467. boja(_X, bijela) :-
  1468. not(boja(_X, crna)).
  1469. put(1, 2).
  1470. put(1, 3).
  1471. put(2, 3).
  1472. put(3, 4).
  1473. put(3, 7).
  1474. put(4, 5).
  1475. put(4, 6).
  1476. put(5, 8).
  1477. put(6, 7).
  1478. put(6, 8).
  1479. put(7, 9).
  1480. put(8,10).
  1481. put(9,10).
  1482. put(9,11).
  1483. put(10, 11).
  1484. ________________________________________
  1485. 1. Implementirajte predikat bijeli put/2 koji ce za dva cvora provjeriti jesu li oba bijela i povezana
  1486. putem. Primjer koristenja:
  1487. ?􀀀 b i j e l i p u t ( X, Y ) .
  1488. X = 1
  1489. Y = 3 ;
  1490. X = 3
  1491. Y = 4 ;
  1492. X = 3
  1493. Y = 7 ;
  1494. X = 4
  1495. Y = 5 ;
  1496. X = 5
  1497. Y = 8 ;
  1498. X = 8
  1499. Y = 1 0 ;
  1500. X = 10
  1501. Y = 1 1 ;
  1502. Rješenje:
  1503. bijeli_put(X, Y) :-
  1504. put(X, Y),
  1505. boja(X, bijela),
  1506. boja(Y, bijela).
  1507. ________________________________________
  1508. 1. Implementirajte predikat bijela_putanja/2 koji će provjeriti postoji li
  1509. izmedu dva čvora putanja u kojoj su svi među-čvorovi bijeli.
  1510. Primjeri korištenja:
  1511. ?􀀀 b i j e l a p u t a n j a ( 1 , X ) .
  1512. X = 3 ;
  1513. X = 4 ;
  1514. X = 7 ;
  1515. X = 5 ;
  1516. X = 8 ;
  1517. X = 1 0 ;
  1518. X = 1 1 ;
  1519. Rješnjje:
  1520. bijela_putanja(X, Y) :-
  1521. bijeli_put(X, Y).
  1522. bijela_putanja(X, Y) :-
  1523. bijeli_put(X, Z),
  1524. bijela_putanja(Z, Y).
  1525. ________________________________________
  1526. 4.Implementirajte predikat bijela putranja/3 koja ce se ponasati isto kao i predikat u predhodnom
  1527. zadatku uz nadopunu da ce u trecem argumentu prikupiti listu elemenata koji su na tom putu. Primjeri
  1528. koristenja:
  1529. b i j e l a p u t a n j a ( 1 , 11 , P ) .
  1530. P = [ 1 , 3 , 4 , 5 , 8 , 1 0 , 1 1 ]
  1531. y e s
  1532. j ?􀀀 b i j e l a p u t a n j a ( 7 , 11 , P ) .
  1533. no
  1534. Rješenje:
  1535. bijela_putanja(X, X, [ X ]) :-
  1536. boja(X, bijela).
  1537. bijela_putanja(X, Y, [ X, Y ]) :-
  1538. bijeli_put(X, Y).
  1539. bijela_putanja(X, Y, [ X | Putanja ]) :-
  1540. bijeli_put(X, Z),
  1541. bijela_putanja(Z, Y, Putanja).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement