Advertisement
kikakr

prolog

Sep 2nd, 2015
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.60 KB | None | 0 0
  1. :-import load_xml_structure/3 from sgml.
  2. :-import parse_xpath/4 from xpath.
  3. :-import ith/3 from basics.
  4. dio( sifra, naziv):-
  5. XmlSource = url('http://arka.foi.hr/~mschatten/lp/djelovi.xml'),
  6. parse_xpath(XmlSource, '/djelovi/dio/sifra',S,[]),
  7. parse_xpath(XmlSource, '/djelovi/dio/naziv', N, []),
  8. dohvati(S, N, sifra, naziv).
  9. get_element( element( _, _, [ X ] ), X ).
  10. dohvati(S,N,sifra,naziv):-
  11. load_xml_structure( string( S ), sifra_struct, _ ),
  12. load_xml_structure( string( N ), naziv_struct, _ ),
  13.  
  14. ith( S, sifra_struct, sifra_elem ),
  15. ith( N, naziv_struct, naziv_elem ),
  16.  
  17. get_element( sifra_elem, S ),
  18. get_element( naziv_elem, N ).
  19.  
  20.  
  21. Zadan je xml dokument na sljedecoj adresi: http://arka.foi.hr/~mschatten/lp/djelovi.xml
  22. Potrebno je implementirati predikat dio/2 koji iz zadanog dokumenta izvlaci sifru i naziv dijela. Pri tome je
  23. dopusteno koristiti ugradene predikate i tabliranje.
  24. :- auto_table.
  25.  
  26. :- import parse_xpath/4 from xpath.
  27. :- import load_xml_structure/3 from sgml.
  28. :- import member/2 from lists.
  29. :- import ith/3 from basics.
  30. :- import str_cat from string.
  31.  
  32. parse( X, R ) :-
  33. parse_xpath( file( '/home/markus/Dropbox/myCourses/Logicko programiranje
  34. (2014)/pismeni/djelovi.xml' ), X, R, [] ), !.
  35.  
  36. dio( Sifra, Naziv ) :-
  37. parse( '//dio/sifra', S ),
  38. parse( '//dio/naziv', N ),
  39. load_xml_structure( string( S ), SS, _ ),
  40. load_xml_structure( string( N ), SN, _ ),
  41. member( ES, SS ),
  42. ith( I, SS, ES ),
  43. ith( I, SN, EN ),
  44. get_element( ES, Sifra ),
  45. get_element( EN, Naziv ).
  46.  
  47. Potrebno je implementirati predikat ima/1 koji uspjeva ukoliko zadani dio ima poddijelova.
  48. Primjeri koristenja:
  49.  
  50. komponente( Dio, Kom ) :-
  51. findall( K, komponenta( Dio, K ), Kom ).
  52.  
  53. nema( Dio ) :-
  54. str_cat( '//dio[ naziv="', Dio, I1 ),
  55. str_cat( I1, '" ]/sastav', XPath ),
  56. parse( XPath, K ),
  57. load_xml_structure( string( K ), SK, _ ),
  58. member( EK, SK ),
  59. get_element( EK, '0' ).
  60.  
  61. ima( Dio ) :-
  62. not( nema( Dio ) ).
  63.  
  64. Potrebno je implementirati predikat komponenta/2 koji ce za zadani dio izlistati sve njegove kom-
  65. ponente, ako takve postoje. Ako ne postoje, predikat ne uspijeva.
  66.  
  67. komponenta( Dio, Kom ) :-
  68. ima( Dio ),
  69. str_cat( '//dio[ naziv="', Dio, I1 ),
  70. str_cat( I1, '" ]/sastav/komponenta', XPath ),
  71. parse( XPath, K ),
  72. load_xml_structure( string( K ), SK, _ ),
  73. member( EK, SK ),
  74. get_element( EK, Koma ),
  75. dio( Koma, Kom ).
  76.  
  77.  
  78. Potrebno je implementirati predikat komponente/2 koji ce za zadani dio vratiti listu svih njegovih
  79. komponenti. Ako dio nema komponenti, predikat vraca praznu listu.
  80.  
  81. komponenta( Dio, Kom ) :-
  82. ima( Dio ),
  83. komponenta( Dio, Kom1 ),
  84. komponenta( Kom1, Kom ).
  85.  
  86. get_element( element( _, _, [ X ] ), X ).
  87.  
  88. Zadan je xml dokument na sljedecoj adresi: http://arka.foi.hr/~mschatten/lp/rok.xml
  89. Potrebno je implementirati predikat rok/5 koji iz zadanog dokumenta izvlaci id, kolegij, datum, vrijeme i
  90. dvoranu roka. Pri tome je dopusteno koristiti ugradene predikate.
  91.  
  92. :-import load_xml_structure/3 from sgml.
  93. :-import parse_xpath/4 from xpath.
  94. :-import ith/3 from basics.
  95.  
  96. rok( Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
  97. XmlSource = url('http://arka.foi.hr/~mschatten/lp/rok.xml'),
  98. parse_xpath( XmlSource, '/rokovi/rok/id', Ids, [] ),
  99. parse_xpath( XmlSource, '/rokovi/rok/kolegij', Kolegiji, [] ),
  100. parse_xpath( XmlSource, '/rokovi/rok/datum', Datumi, [] ),
  101. parse_xpath( XmlSource, '/rokovi/rok/vrijeme', Vremena, [] ),
  102. parse_xpath( XmlSource, '/rokovi/rok/dvorana', Dvorane, [] ),
  103. dohvati_info(
  104. Ids, Kolegiji, Datumi, Vremena, Dvorane,
  105. Id, Kolegij, Datum, Vrijeme, Dvorana
  106. ).
  107.  
  108. get_element( element( _, _, [ X ] ), X ).
  109.  
  110. dohvati_info( Ids, Kolegiji, Datumi, Vremena, Dvorane,
  111. Id, Kolegij, Datum, Vrijeme, Dvorana ) :-
  112.  
  113. load_xml_structure( string( Ids ), Id_struct, _ ),
  114. load_xml_structure( string( Kolegiji ), Kolegij_struct, _ ),
  115. load_xml_structure( string( Datumi ), Datum_struct, _ ),
  116. load_xml_structure( string( Vremena ), Vrijeme_struct, _ ),
  117. load_xml_structure( string( Dvorane ), Dvorana_struct, _ ),
  118.  
  119. ith( I, Id_struct, Id_elem ),
  120. ith( I, Kolegij_struct, Kolegij_elem ),
  121. ith( I, Datum_struct, Datum_elem ),
  122. ith( I, Vrijeme_struct, Vrijeme_elem ),
  123. ith( I, Dvorana_struct, Dvorana_elem ),
  124.  
  125. get_element( Id_elem, Id ),
  126. get_element( Kolegij_elem, Kolegij ),
  127. get_element( Datum_elem, Datum ),
  128. get_element( Vrijeme_elem, Vrijeme ),
  129. get_element( Dvorana_elem, Dvorana ).
  130.  
  131.  
  132.  
  133. Rjesenje prethodnog zadatka pohranite u datoteku dohvat.P te ju koristite kao modul unutar
  134. ora-2
  135. stroja. Potrebno je implementirati klasu rok koja sadrzi atribute kolegij, datum, vrijeme i dvorana.
  136. ?- [dohvat].
  137.  
  138. load_rokovi :-
  139. rok( ?id, ?kolegij, ?datum, ?vrijeme, ?dvorana )@_prolog,
  140. insert { ?id : rok [
  141. kolegij -> ?kolegij,
  142. datum -> ?datum,
  143. vrijeme -> ?vrijeme,
  144. dvorana -> ?dvorana
  145. ] }.
  146. ?- load_rokovi.
  147.  
  148.  
  149. Implementirajte predikat rokovi prema dvoranama/2 koji ce uz svoje parametre vezati dvorane te
  150. odgovarajuce liste rokova koji se odrzavaju u toj dvorani.
  151.  
  152. rokovi_prema_dvoranama( ?dvorana, ?kolegiji ) :-
  153. ?_ : rok [ dvorana -> ?dvorana ],
  154. ?kolegiji = setof { ?_id | ?_id : rok [ dvorana -> ?dvorana ] }.
  155. Implementirajte predikat rokovi prema datumima/3 koji ce uz svoje parametre vezati datume, vre-
  156. mena i odgovarajuce liste rokova koji se odrzavaju u tim terminima.
  157. rokovi_prema_datumima( ?datum, ?vrijeme, ?rokovi ) :-
  158. ?_ : rok [ datum -> ?datum, vrijeme -> ?vrijeme ],
  159. ?rokovi = setof { ?_id | ?_id : rok [ datum -> ?datum, vrijeme -> ?vrijeme ] }.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement