6 SWI-Prolog/XPCE Semantic Web Library Dokumentation: http://www.swi-prolog.org/packages/semweb.html Tool: triple20 rdf reachable(?subject, +Predicate,?Object): gibt an, welche Objekte vom Subjekt über das Prädikat erreichbar sind. Module rdf db 81 83 Dokumentation: http://www.swi-prolog.org/packages/semweb.html speichert RDF Triples als 5-Tuple: {Subject Predicate Object File Line} elementares Prädikat: rdf(?subject,?predicate,?object): Subject, Predicate sind Atome (textuelle Repräsentaten von URIs) Object ist entweder Atom (repräsentiert eine Resource) oder literal(value) Beispiel:?- rdf(subject, Predicate, Object). Subject = http://www.w3.org/2000/01/rdf-schema#resource Predicate = http://www.w3.org/1999/02/22-rdf-syntax-ns#type Object = http://www.w3.org/2000/01/rdf-schema#class ; Subject = http://www.w3.org/2000/01/rdf-schema#resource Predicate = http://www.w3.org/2000/01/rdf-schema#label Object = literal(lang(en, Resource )) ; Subject = http://www.w3.org/2000/01/rdf-schema#resource Predicate = http://www.w3.org/2000/01/rdf-schema#comment Object = literal( The class resource, everything. ) ; 82 Datenbasis ändern rdf assert(+subject, +Predicate, +Object): fügt ein neues Triple hinzu rdf retractall(?subject,?predicate,?object): entfernt alle passenden Triples rdf update(+subject, +Predicate, +Object, +Action): Ersetzt eines der drei Felder des passenden Triples: subject(resource): Ändert das erste Feld des Triples predicate(resource): Ändert das zweite Feld des Triples object(object): Ändert das dritte Feld des Triples durch eine Resource oder ein literal(value). 84
Laden und Speichern von Dateien rdf load(+in): Lädt die Datei +In rdf unload(+spec): löscht alle Triples der Datei +Spec rdf save(+file): speichert alle Triples in der Datei +Datei rdf save(+file, +Options): speichert bestimmte Triples rdf make: lädt alle Dateien neu, die sich seit dem letzten Laden geändert haben. Modul RDFS rdfs subproperty of(?subproperty,?property): gibt an, ob es sich um eine Sub-Property handelt rdfs subclass of(?subclass,?class): gibt an, ob es sich um eine Sub Klasse handelt rdfs class property(+class,?property): gibt an, +Class in der Domain von?property liegt rdfs individual of(?resource,?class): gibt an, ob?resource von?class ist. 85 Collections und Containers 87 Namespace rdf db:ns(?ns,?resource): gibt definierte Namespaces an rdf register ns(+alias, +URL): definiert neuen Namespace (muss definiert sein, bevor Datei geladen wird, die Namespace benutzt) rdfs member(?resource, +Set): testet oder konstruiert eine Mitglieder eines Containers oder einer RDFS Liste (+Set) Beispiel: <rdf:list rdf:about="http://www.ba-horb.de/~pl#a_element"> <rdf:first rdf:resource="http://www.ba-horb.de/~pl#_1"/> <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/> </rdf:list>?- rdfs_member(resource, http://www.ba-horb.de/~pl#a_element ). Resource = http://www.ba-horb.de/~pl#_1 rdfs list to prolog list(+set, -List): übertragt die RDF Liste in eine prolog Liste. Beispiel:?- rdfs_list_to_prolog_list( http://www.ba-horb.de/~pl#a_element, List). List = [ http://www.ba-horb.de/~pl#_1 ] rdfs assert list(+list, -Resource): trägt eine prolog Liste in die RDF Datenbasis als RDF Liste ein. 86 88
Institution und Subklassen Beispiel Es soll an einem Tag eine Liste von Firmen besucht werden. Der Start ist um 8 Uhr in Horb. Das Prolog Programm soll die günstigste Reihenfolge bestimmen, in der die Firmen besucht werden sollen (früheste Endzeit). Der dadurch entstandene Terminkalender des Professors soll zunächst zur RDF Datenbasis im Prolog Laufzeitsystem hinzugefügt werden. Danach sollen die ergänzten Triple in eine RDF Datei rausgeschrieben werden. Als Grundlage dient die RDF Spezifikation von Folie 66. <rdfs:class rdf:about="&pl;institution" rdfs:label="institution"> <rdfs:subclassof rdf:resource="&rdfs;termin_beschreibung"/> <rdf:property rdf:about="&pl;anschrift" rdfs:label="anschrift"> <rdfs:domain rdf:resource="&pl;institution"/> <rdfs:range rdf:resource="&pl;adresse"/> <rdfs:class rdf:about="&pl;firma" rdfs:label="firma"> <rdfs:subclassof rdf:resource="&pl;institution"/> <rdf:property rdf:about="&pl;angestellt" rdfs:label="angestellt"> <rdfs:domain rdf:resource="&pl;firma"/> <rdfs:range rdf:resource="&pl;betreuer"/> <rdfs:class rdf:about="&pl;ba" rdfs:label="ba"> <rdfs:subclassof rdf:resource="&pl;institution"/> 89 Adresse 91 RDF Datei <?xml version= 1.0 encoding= ISO-8859-1?> <!DOCTYPE rdf:rdf [ <!ENTITY pl http://www.ba-horb.de/~pl# > <!ENTITY rdf http://www.w3.org/1999/02/22-rdf-syntax-ns# > <!ENTITY rdfs http://www.w3.org/2000/01/rdf-schema# > <!ENTITY xsd http://www.w3.org/2001/xmlschema# > ]> <rdf:rdf xmlns:pl="&pl;" xmlns:rdf="&rdf;" xmlns:rdfs="&rdfs;" xmlns:xsd="&xsd;" > <rdfs:class rdf:about="&pl;adresse" rdfs:label="adresse"/> <rdf:property rdf:about="&pl;strasse" rdfs:label="strasse"> <rdfs:domain rdf:resource="&pl;adresse"/> <rdfs:range rdf:resource="&rdfs;literal"/> <rdf:property rdf:about="&pl;plz" rdfs:label="plz"> <rdfs:domain rdf:resource="&pl;adresse"/> <rdfs:range rdf:resource="&xsd;int"/> <rdf:property rdf:about="&pl;ort" rdfs:label="ort"> <rdfs:domain rdf:resource="&pl;adresse"/> <rdfs:range rdf:resource="&rdfs;literal"/> 90 92
Diplomarbeit <rdfs:class rdf:about="&pl;diplomarbeit" rdfs:label="diplomarbeit"/> <rdf:property rdf:about="&pl;diplomand" rdfs:label="diplomand"> <rdfs:range rdf:resource="&pl;studierender"/> <rdf:property rdf:about="&pl;thema" rdfs:label="thema"> <rdfs:range rdf:resource="&rdfs;literal"/> <rdf:property rdf:about="&pl;betreuenderprof" rdfs:label="betreuenderprof"> <rdfs:range rdf:resource="&pl;prof"/> <rdf:property rdf:about="&pl;fa_betreuer" rdfs:label="fa-betreuer"> <rdfs:range rdf:resource="&pl;betreuer"/> Subklassen von Person: Professor/Studierender/Betreuer <rdfs:class rdf:about="&pl;prof" rdfs:comment="personenkreis der Professoren" rdfs:label="prof"> <rdfs:subclassof rdf:resource="&pl;person"/> <rdfs:class rdf:about="&pl;studierender" rdfs:comment="personenkreis der Studierenden" rdfs:label="studierender"> <rdfs:subclassof rdf:resource="&pl;person"/> <rdfs:class rdf:about="&pl;betreuer" rdfs:comment="personenkreis der Betreuer" rdfs:label="betreuer"> <rdfs:subclassof rdf:resource="&pl;person"/> 93 95 Terminkalender Person <rdfs:class rdf:about="&pl;person" rdfs:label="person"/> <rdf:property rdf:about="&pl;kalender" rdfs:label="kalender"> <rdfs:domain rdf:resource="&pl;person"/> <rdfs:range rdf:resource="&pl;terminkalender"/> <rdfs:class rdf:about="&pl;terminkalender" rdfs:label="terminkalender"/> <rdf:property rdf:about="&pl;terminliste" rdfs:label="terminliste"> <rdfs:domain rdf:resource="&pl;terminkalender"/> <rdfs:range rdf:resource="&rdf;list"/> <rdfs:range rdf:resource="&rdf;list"/> ist eine Liste von Elementen vom Typ &pl;termin. 94 96
Termin <rdfs:class rdf:about="&pl;termin" rdfs:label="termin"/> <rdf:property rdf:about="&pl;start" rdfs:label="start"> <rdfs:range rdf:resource="&pl;pair"/> <rdf:property rdf:about="&pl;ende" rdfs:label="ende"> <rdfs:range rdf:resource="&pl;pair"/> <rdf:property rdf:about="&pl;beschreibung" rdfs:label="beschreibung"> <rdfs:range rdf:resource="&rdfs;termin_beschreibung"/> Prolog Programm makedaytimetable(liste_der_firmen, Termine):- mitglied(mem, Liste_der_Firmen, [], Restliste_der_Firmen), nextvisits( http://www.ba-horb.de, zeit(08,00), Mem, Restliste_der_Firmen, Termine) Liste der Firmen: Liste der Firmen die besucht werden sollen Termine: Liste der berechneten Termine mitglied: bestimmt ein beliebiges Mitglied einer Liste nextvisits: berechnet die Liste der Termine. <rdfs:class rdf:about="&rdfs;termin_beschreibung" rdfs:label="termin_beschreibung"/> 97 99 Pair (von Stunden und Minuten) <rdf:property rdf:about="&pl;start" rdfs:label="start"> <rdfs:range rdf:resource="&pl;pair"/> <rdfs:class rdf:about="&pl;pair" rdfs:label="pair"/> <rdf:property rdf:about="&pl;fst" rdfs:label="first"> <rdfs:domain rdf:resource="&pl;pair"/> <rdfs:range rdf:resource="&xsd;int"/> mitglied %Mitglied, Liste, Hilfsliste, Liste ohne Mitglied %Mitglied kann mehrfach vorkommen. mitglied(m, [H T], Fstmems, X) :- (M = H, concat(fstmems, T, X)) ; mitglied(m, T, [H Fstmems], X). concat( [], L, L ). concat( [H T ], L, [H NeueListe] ) :- concat( T, L, NeueListe ). <rdf:property rdf:about="&pl;snd" rdfs:label="second"> <rdfs:domain rdf:resource="&pl;pair"/> <rdfs:range rdf:resource="&xsd;int"/> 98 100
nextvisits nextvisits(vorheriger, Vorh_endzeit, Naechster, [], [termin(start(naechster_start), ende(naechster_ende), beschreibung(naechster)) []]) :- fahrtzeit(vorheriger, Naechster, Fahrtzeit), addtime(vorh_endzeit, Fahrtzeit, Naechster_start), addtime(naechster_start, 60, Naechster_ende). nextvisits(vorheriger, Vorh_endzeit, Naechster, [Firma Liste_der_Firmen], [termin(start(naechster_start), ende(naechster_ende), beschreibung(naechster)) Termine]) :- fahrtzeit(vorheriger, Naechster, Fahrtzeit), addtime(vorh_endzeit, Fahrtzeit, Naechster_start), addtime(naechster_start, 60, Naechster_ende), mitglied(mem, [Firma Liste_der_Firmen], [], Restliste_der_Firmen), nextvisits(naechster, Naechster_ende, Mem, Restliste_der_Firmen, Termine). addtime: addiert Minuten zu einer Uhrzeit Aufgabe Schreiben Sie das Prädikat terminassert. terminassert([termin []], ThisListNode, Ausgabedatei) :- terminnode(termin, NTermin, Ausgabedatei), %muss noch %programmiert werden rdf_node(thislistnode), rdf_assert(thislistnode, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.w3.org/1999/02/22-rdf-syntax-ns#list, Ausgabedatei), rdf_assert(thislistnode, http://www.w3.org/1999/02/22-rdf-syntax-ns#first, NTermin, Ausgabedatei), rdf_assert(thislistnode, http://www.w3.org/1999/02/22-rdf-syntax-ns#rest, http://www.w3.org/1999/02/22-rdf-syntax-ns#nil, Ausgabedatei). terminassert([termin Termine], ThisListNode, Ausgabedatei) :-... 101 103 main main(liste, F, Node, Ausgabedatei) :- rdfs_list_to_prolog_list(liste, PListe), findall(x, makedaytimetable(pliste, X), [Fst Rest]), termin(start(_), ende(zeit(h, M)), beschreibung(_)) = Last, last(fst, Last), fruehzeit(rest, zeit(h,m), Fst, Liste_von_Terminen), terminassert(liste_von_terminen, Node, Ausgabedatei), rdf_save(ausgabedatei, Ausgabedatei). findall: bildet Liste aller Ergebnisse fruehzeit: berechnet die früheste Endzeit. terminassert: fügt die Triple des Terminkalenders zur Datenbasis hinzu rdf save: schreibt die Triple in die Datei Ausgabedatei Aufgabe Schreiben Sie eine RDF Liste von 4 zu besuchenden Firmen als Eingabe für main. Schreiben Sie für die 4 zu besuchenden Firmen das Prädikat fahrtzeit, in dem jedes mögliches Paar von Fahrtzeiten angegeben werden muss: fahrtzeit( http://www.ba-horb.de/~pl#homag, http://www.ba-horb.de/~pl#schuler, 10). fahrtzeit( http://www.ba-horb.de/~pl#schuler, http://www.ba-horb.de/~pl#homag, 10). fahrtzeit( http://www.ba-horb.de/~pl#homag, http://www.ba-horb.de/~pl#arburg, 30). fahrtzeit( http://www.ba-horb.de/~pl#arburg, http://www.ba-horb.de/~pl#homag, 30).. 102 104