/* file prolog per caricare rdf e rdfs*/
:-[library(sgml)].

:-use_module(library('semweb\\rdf_db.pl')).
:-use_module(library('semweb\\rdfs.pl')).

:-use_module(library('semweb\\rdf_edit.pl')).


/* questo file permette di memorizzare le triple nel database Prolog */
/* :-['rdf_db.pl']. */ 

/* un esempio per il parse di un file XML */
parse_xml :- parse_xml('Prova.xml').
parse_xml(File):- load_xml_file(File,X), write(X),w_list_elem(X).

/* pretti print per le strutture XML */
w_list_elem(X) :- nl,nl, w_list_elem(X,-7),nl,nl.
w_list_elem([],_):- write(']'),nl. 
w_list_elem(['\n'|C],Tab):- w_list_elem(C,Tab).
w_list_elem(['\n'],_Tab):- write(']'),nl.
w_list_elem([' '|C],Tab):- w_list_elem(C,Tab).
w_list_elem(element(X,Y,Z),Tab):- Tab1 is Tab + 7,nl,
    tab(Tab1), write('element('), write(X), nl,
    tab(Tab1), write('['), w_list_elem(Y,Tab1),
    tab(Tab1), write('['), w_list_elem(Z,Tab1),
    tab(Tab1),write(')'),nl,tab(Tab1). 
w_list_elem(X,_Tab):- \+ is_list(X), write(X) .
w_list_elem([T|[]],Tab):-w_list_elem(T,Tab), write(']'),nl.
w_list_elem([T|C],Tab):-w_list_elem(T,Tab),
        write(','), tab(1), w_list_elem(C,Tab).


/*
   esempio load di rdfs/rdf
   load_rdf produce una lista di triple.
*/

libri1:-load_rdf('c:/Documents and Settings/Administrator/Documenti/Copia di Prolog-RDF/Libri.rdfs',X),write_list_rdf(X).
libri2:-load_rdf('c:/Documents and Settings/Administrator/Documenti/Copia di Prolog-RDF/Libri.rdf',X),write_list_rdf(X).


/* 
   stampa gli elememnti della lista prodotta da load_rdf
   ciascun elemento su una riga.
*/
write_list_rdf([]).
write_list_rdf([rdf(X,Y,Z)|Resto]) :-
  write(X),nl,
  write(Y),nl,
  write(Z),nl,nl,
  write_list_rdf(Resto).

/* esempio di uso di  'rdf_db.pl'
   rdf_register_ns serve a memorizzare dei namespace 
   rdf_load legge un file di rdf/rdfs e memorizza nel db_prolog
   le triple sono recuperabili con rdf/3 */

libri_ns:-  
  retract(rdf_db:ns(rdf,_)),
  retract(rdf_db:ns(rdfs,_)),
  rdf_register_ns(rdf,'http://www.w3.org/1999/02/22-rdf-syntax-ns#'),
  rdf_register_ns(rdfs,'http://www.w3.org/TR/1999/PR-rdf-schema-19990303#'),
  rdf_register_ns(a,'http://protege.stanford.edu/system#'),
  rdf_register_ns(lib,'http://protege.stanford.edu/Libri#').

libri:-  rdf_load('c:/Documents and Settings/Administrator/Documenti/Copia di Prolog-RDF/Libri.rdfs'),
         rdf_load('c:/Documents and Settings/Administrator/Documenti/Copia di Prolog-RDF/Libri.rdf').

/* alcuni esempi di inferenza con le rdf */

sottoclasse(S,C) :- rdf(S,'rdfs':'subClassOf',C).
sottoclasse(S,C) :- rdf(S,rdfs:subClassOf,X),sottoclasse(X,C).

slot(Classe,Slot) :- rdf(Slot,rdfs:domain,Classe),write(Slot),nl.
slot(Classe,Slot) :- sottoclasse(Classe,SuperC),
       rdf(Slot,rdfs:domain,SuperC),
       write(Slot),write(' ereditata da '),write(SuperC), nl.

slots(Classe,L) :- bagof(S,slot(Classe,S),L).


descrivi(Ns:Ist) :- !,
                     rdf_db:ns(Ns,Esteso),
                     name(Esteso,L1),name(Ist,L2),
                     append(L1,L2,L3),name(Istanza,L3),
                     descrivi(Istanza). 

descrivi(Istanza) :- rdf(Istanza,rdf:type,Classe),
                     rdf(Classe, rdf:type, rdfs:'Class'), 
                     instance_slots(Istanza,ListaSlots),
                     write(istanza->Istanza),nl,
                     write(classe->Classe),nl,
                     write(slots->ListaSlots), nl.  
                  

descrivi(Oggetto) :- rdf(Oggetto, rdf:type, rdfs:'Class') ,
     write(classe -> Oggetto),nl,
     bagof(SuperC,sottoclasse(Oggetto,SuperC),ListaSuperC),
     write(superClassi -> ListaSuperC), nl,
     slots(Oggetto,ListaSlot),  
     write(slots -> ListaSlot),nl. 


descrivi(Slot) :- rdf(Slot,rdf:type,rdf:'Property'),
                  write(slot->Slot), nl,
                  rdf(Slot,rdfs:'domain',Dom),
                  write(dominio->Dom),nl,
                  rdf(Slot,rdfs:'range',Ran),
                  write(range->Ran),nl.
 

istanza(Istanza,Classe):- rdf(Istanza,rdf:type,Classe).
istanza(Istanza,SuperClasse):- 
                               sottoclasse(Classe,SuperClasse),
                               rdf(Istanza,rdf:type,Classe).

instance_slot(Istanza,Slot->Val) :- rdf(Istanza,Slot,Val),
                                   rdf(Slot,rdf:type,rdf:'Property').   

instance_slots(Istanza,ListaSlot) :- bagof(Slot->Val,instance_slot(Istanza,Slot->Val),ListaSlot).                              


/* inserisce il namespace se c'e' un nome esteso */
converti(A:B,NS:B) :- rdf_db:ns(NS,A),!. /* gia` nella forma con namespace. */
converti(Esteso,NS:Corto) :- rdf_db:ns(NS,Prefisso),
                             name(Esteso,LEst),
                             name(Prefisso,LPref),
                             append(LPref,LCorto,LEst),
                             name(Corto,LCorto), ! .
converti(X,X).

  



/*     USO del modulo RDFS

10 ?- rdfs_individual_of(X,lib:libro).

X = 'http://protege.stanford.edu/Libri#KB_3181_00028' ;

X = 'http://protege.stanford.edu/Libri#KB_3181_00021' ;

X = 'http://protege.stanford.edu/Libri#KB_3181_00025' ;

X = 'http://protege.stanford.edu/Libri#KB_3181_00027' ;

No
11 ?- rdfs_subclass_of(X,lib:libro).

X = 'http://protege.stanford.edu/Libri#libro' ;

X = 'http://protege.stanford.edu/Libri#manuale' ;

X = 'http://protege.stanford.edu/Libri#romanzo' ;

No
12 ?- rdfs_class_property_of(lib:libro,X).
ERROR: Undefined procedure: rdfs_class_property_of/2
13 ?- rdfs_class_property(lib:libro,X).

X = 'http://protege.stanford.edu/Libri#autore' ;

X = 'http://protege.stanford.edu/Libri#editore' ;

X = 'http://protege.stanford.edu/Libri#titolo' ;

No
14 ?- rdf(X,lib:autore,Y).

X = 'http://protege.stanford.edu/Libri#KB_3181_00021'
Y = 'http://protege.stanford.edu/Libri#KB_3181_00014' 


*/