Intelligente Systeme C Semantic Web und Wissensrepräsentation Prof. Dr. Wolfram Conen WS04/05, FH Gelsenkirchen Einführung „A new form of Web content that is meaningful to computers will unleash a revolution of new possibilities“, Tim Berners-Lee, James Hendler, Ora Lassila in The Semantic Web, Scientific American, May 2001 Überblick Wissen und Wissensrepräsentation Wissenbegriff/Wissensarten Logik Produktionsregeln Semantische Netze Frame-artige Repräsentationen Description Logic „Modernes“ (uncleveres?) Internet XML / XML-Schema / Webservices (WDSL, BPEL4WS, UDDI, SOAP) „Semantic Web“ RDF / OWL OWL-S Andere Möglichkeiten: Prolog, Datalog, F-Logik Anwendungen: Security and Trust, Clever-Search Ausblick / Grenzen Problem 1 In einer Firma arbeiten drei Freunde: ein C++Programmierer, ein Java-Programmierer und ein Pascal-Programmierer. Ihre Namen sind Otto, Paul und Kai. Der C++-Programmierer hat keine Geschwister; er ist der Jüngste der drei Freunde. Kai, der mit der Schwester von Otto verheiratet ist, ist älter als der Java-Programmierer. Wer programmiert in welcher Sprache? Lösen Sie das Problem! Problem 1 - Lösung In einer Firma arbeiten drei Freunde: ein C++-Programmierer, ein Java-Programmierer und ein Pascal-Programmierer. Ihre Namen sind Otto, Paul und Kai. Der C++-Programmierer hat keine Geschwister Der C++-Programmierer ist der Jüngste der drei Freunde. Kai ist mit der Schwester von Otto verheiratet. Kai ist älter als der Java-Programmierer. Wer programmiert in welcher Sprache? Notation: X = Y heißt: X „programmiert in“ Y: Aus D folgt: Aus B und D folgt: Aus E und F folgt: Aus C und A folgt: Aus G und H folgt: Kai ≠ Java Kai ≠ C++ Kai = Pascal Otto ≠ C++ Otto = Java Also programmiert Otto in Java und Kai in Pascal. Es folgt abschließend, dass Paul in C++ programmiert. (A) (B) (C) (D) (E) (F) (G) (H) (I) Towards your personal project... Vortragsthemen: Webservices XML und Konsorten: SOAP (Simple Object Access Protocol) WSDL, WS-Policy Registry/Discovery (UDDI, ebXML Registry) BPEL4WS XML/XLink/XPath XML-Schema XML-Query Security Role-Based-Acess-Control (Grundlagen, Anwendungsszenarien) Nahziel: Web-Services, XML-basierte Semantic-Web-Sprachen, Prolog kennenlernen Nächstes Ziel: Verteilte, semantische Zugriffskontrolle und verteiltes, semantisches Rechtemanagement mit einer Architektur für div. Anwendung konzipieren und implementieren! Wissensrepräsentation Def. Wissen: Def. Überzeugungen: Als das Wissen eines Wissensträgers definieren wir die Menge aller von ihm als wahr angenommenen Aussagen über die repräsentierte Welt, die tatsächlich wahr sind. Die Überzeugungen eines Wissensträgers sind alle Aussagen, von denen er glaubt, sie seien wahr. Beide Definitionen stammen aus von Ulrich Reimer aus „Einführung in die Wissensrepräsentation“, Teubner Verlag, 1991 Wissensrepräsentation Wie stellt man fest, über welches Wissen ein Wissensträger verfügt? Zitat aus dem Reimer-Buch: „... denn selbst Menschen sind nicht immer in der Lage mitzuteilen, was sie wissen ...“ Newell: Wissensträger sind Agent, Agenten verfolgen Ziele Agenten handeln rational: Agent A weiß, dass Handlung H zum Ziel Z führt – also führt A H aus Wissen ist dann alles, was sich dem Agenten zuschreiben lässt, damit sein Verhalten nach dem Rationalitätsprinzip berechnet oder erklärt werden kann Wissen wird so rein „funktional“ bestimmt, Trennung zwischen Wissen und Repräsentation (Strukturen/Prozessen) Def. Wissensebene, Symbolebene Als Wissensebene bezeichnen wir diejenige Ebene, auf der die Wissensinhalte zu sehen sind, aber nicht die internen Strukturen, in denen sich die Inhalte manifestieren; diese Strukturen werden erst auf der Symbolebene sichtbar. Wissensrepräsentation Wissensebene als abstrakter Datentyp: anfragen: Wissen x Anfrage → Ergebnis mitteilen: Wissen x Aussage → Wissen Wissenrepräsentation: Das Aufschreiben von Symbolen (Repräsentationsstrukturen), die in einer erkennbare Weise einem Ausschnitt der zu repräsentierenden Welt entsprechen Eine Repräsentation ist ein Modell für die repräsentierte Welt bzw. den Weltausschnitt, aber: (1) Eine Repräsentation erfasst einige Merkmale der repräsentierten Welt (2) Eine Repräsentation erfasst nicht zwangsläufig (in der Regel nie) alle Merkmale der repräsentierten Welt (3) Nicht alle Merkmale einer Repräsentation stehen zwangsläufig für Merkmale der repräsentierten Welt Wissensrepräsentation [Erläuterung zur vorigen Folie in ihrem Mitschrieb] Def. Repräsentation: Von einer Repräsentation sprechen wir, wenn zusätzlich zu einer Menge von Repräsentationsstrukturen Angaben dazu vorliegen, wie die Strukturen der Repräsentation auf die Merkmale der repräsentierten Welt abzubilden sind. Diese Angaben stellen die Interpretationsvorschrift dar. Wissensarten - Grundbegriffe Def. Konzept: Ein Konzept ist ein 3-Tupel (Konzeptname, Extension, Intension). Die Extension ist die Menge aller Objekte, die zu dem Konzept gehören. Die Intension gibt die Merkmale an, die ein Objekt aufweisen muß, um zu dem Konzept zu gehören (wir nennen diese Merkmale auch Konzeptmerkmale) Konzeptmerkmale sind z.B. Eigenschaften (z.B. Kai ist rot), es gibt auch Eigenschaftsklassen (Farbe) (Semantische) Beziehungen zu anderen Konzepten, z.B. Teilvon, kausale, zeitliche ... Die Unterscheidung zwischen den Begriffen Konzept, Eigenschaft und Beziehung ist einigermaßen „fuzzy“ (also „unscharf“) Wissensarten – Grundbegriffe Def. Konzeptklasse: Ein Konzept, dessen Extension mehr als ein Objekt enthält. Die Intension einer Konzeptklasse bezeichnen wir auch als (Konzept-)klassenbeschreibung. Def. Individualkonzept: Ein Konzept, dessen Extension genau ein Objekt enthält. Die Intension eines Individualkonzepts beschreibt die Merkmale dieses Objekts. Wissensarten – Grundbegriffe Individualkonzepte gehören zu Konzeptklassen: Def. Instanz-von-Beziehung: Zwischen einem Individualkonzept (N,E,I), dessen Extension, und einer Konzeptklasse (N‘,E‘,I‘) besteht die Instanz-vonBeziehung genau dann, wenn o ∈ E‘ (und somit I ⇒ I‘) Beispiel: Klassenkonzept: (Mensch, { „Kai“, „Bassam“}, kann-denken) Individualkonzept: (Ding_Kai, { „Kai“ }, kann_denken) Ding_Kai Instanz_von Mensch (Infixnotation) bzw. Instanz_von(Ding_Kai,Mensch) (Präfixnotation) Wissensarten – Grundbegriffe Klassenbeschreibung kann bestehen aus: Eigenschaften, die jedes Klassenelement besitzt (z.B. alle Klassenelemente sind rot) Eigenschaftsklassen, die für jedes Klassenelement definiert sind (z.B. alle Klassenelemente besitzen eine Farbe) Semantische Beziehungen zu anderen Konzeptklassen; jedes Klassenelement muß dann Beziehungen der angegebenen Art zu Elementen der betreffenden Konzeptklassen aufweisen (z.B. besteht für jeden Stamm eine Teil-von-Beziehung zu einem Baum) Semantische Beziehungen zu Individualkonzepten; hier weist jedes Klassenelement eine Beziehung des spezifizierten Typs zum angegebenen Individualkonzept ais (z.B. wenn alle Klassenelemente Produkt desselben Herstellers sind) Wissensarten – Grundbegriffe Es kann „speziellere“ Konzeptklassen geben: Def. Is-a-Beziehung (auch: Ober-/Unterbegriff oder Spezialisierungsbeziehung): Zwischen einer Konzeptklasse k=(N,E,I) und einer Konzeptklasse k‘=(N‘,E‘,I‘) besteht eine Is-a-Beziehung genau dann, wenn E ⊆ E‘ (und somit I ⇒ I‘). Die Konzeptklasse k heißt dann Unterbegriff der Konzeptklasse k‘ (die dann Oberbegriff von k heißt) Man sagt auch: k ist eine Spezialisierung von k‘ Beispiel: Tier is-a Organismus „Speziellere“ Objekte ererben Eigenschaften des Oberbegriffs Man kann nun Konzepthierarchien bauen Wissensarten – Grundbegriffe Konzeptklassen „höherer“ Ordnung „organisieren“ Konzeptklassen zu neuen Begriffen Def. Gruppenklasse: Eine Konzeptklasse (N,E,I), bei der E nur Konzeptklassen enthält. Beispiel: Seien Hund, Katze, Maus Konzeptklassen mit der naheliegenden Bedeutung, dann ist (Tierart,{Hund,Katze,Maus},Klassen_mit_Tieren_drin) eine Gruppenklasse Wissensarten – Grundbegriffe Eine wichtige „Sorte“ von Konzepten sind Ereignisse Def. Ereignisse: Unter einem Ereignis versteht man eine Zustandsänderung, für die es einen Ort und eine Zeitdauer oder einen Zeitpunkt gibt. Das Wissen um Ereignisse betrachten wir als eigene Wissensart Ereignisse, die durch ein belebtes Objekt absichtsvoll ausgelöst werden, nennen wir Handlungen Wissensarten – Grundbegriffe Def. Massenkonzept: Konzepte, die sich dadurch auszeichnen, dass sie nicht zählbar sind, heißen Massenkonzepte Def. Regelhafte Zusammenhänge: Wissen von der Art „wenn Faktum A zutrifft, dann gilt auch Faktum B“ bezeichnen wir als Wissen um regelhafte Zusammenhänge Eng damit verwandt ist das Wissen über einschränkende Bedingungen (kann man jeweils ineinander überführen) Def. Einschränkende Bedingung: Wissen über die Unzulässigkeit von Zuständen oder Zustandsänderungen bezeichnen wir als Wissen um einschränkende Bedingungen Wissensarten – Grundbegriffe Das Wissen kann einen Status (besser; eine Qualität) haben, z.B. kann es unvollständig sein („sie ist Studentin oder Schülerin“) unsicher („sie ist möglicherweise Studentin“) widersprüchlich („sie ist 8 Jahre und sie ist Studentin“) Wissen über Eigenschaft kann zudem ungenau sein („sie ist groß – aber wie groß genau?“) Ungenaue Eigenschaftsangaben können einen Bereich festlegen, aus dem der tatsächliche Wert stammt, dies kann mit Wahrscheinlichkeiten verbunden sein (diskrete Werte) bzw. einer Wahrscheinlichkeitsverteilung (kontinuierliche Werte) Wissensarten – Grundbegriffe Man kann Sachverhalte mit Modalitäten verbinden, man besitzt dann Wissen über Sachverhalte, die notwendig, möglich oder unmöglich sind (alethische Modalitäten) obligatorisch, geboten oder verboten sind (deontische Modaliäten) Wissen kann prototypisch (auch stereotypisch genannt). Das sind Aussagen, die „in der Regel“ zutreffen und als korrekt angenommen werden, solange kein gegenteiliges Wissen vorliegt (also Wissen, dass zu einem Widerspruch führen würde) Man nennt solche Aussagen Default-Aussagen Betreffen sie Konzepteigenschaften, dann heißen sie DefaultEigenschaften Besonders Konzeptklassenbeschreibungen sind häufig prototypisch, sie legt sozusagen einen idealen Vertreter der Elemente der Konzeptklasse fest, den Prototypen Wissensarten – Grundbegriffe Def. Prototypisches Wissen, Default-Aussage: Prototypisches Wissen besteht aus Default-Aussagen. Eine Aussage heißt Default-Aussage, wenn sie eine Angabe zu einem Sachverhalt macht, der in der Regel zutrifft, aber in Einzelfällen falsch sein kann Def. Definitorische vs. kontingente Aussagen: Eine definitorische Aussage zu einem Konzept betrifft den Konzeptinhalt, während dies für eine kontingente Aussage nicht zutrifft Beispiel: Eine definitorische Aussage, die zu einem Konzeptklasse K gehört, muß für ein gegebenes Individualkonzept i zutreffen, damit i zu K gehören kann. Z.B. ist die Aussage, dass der öffentliche Nahverkehr ausgebaut werden muß, kontingent für das Konzept Nahverkehr; die Aussage, dass alles Verkehrsaufkommen zur Überwindung von Entfernungen bis zu 20km als Nahverkehr gilt, ist hingegen definitorisch Wissensarten – Grundbegriffe Metawissen ist Wissen über Wissen, z.B. darüber, ob Wissen widersprüchlich, unsicher, unvollständig usw. ist. Allgemeinwissen („Commonsense Knowledge“) ist Wissen, das Menschen einsetzen, um alltägliche Probleme zu lösen. Fachwissen soll dann Wissen sein, das Experten einsetzen, um domänen-spezifische Probleme zu lösen Sehr viel ausführlichere Betrachtungen wären möglich, wir wollen aber vor dem Einsteig in die „Wissensverarbeitung“ mit Prolog bzw. im Semantic Web nur einen ersten Überblick gewinnen und dann „konkret“ werden. [Die Ausführungen stützen sich bis hier hin auf Uli Reimer, „Einführung in die Wissensrepräsentation“, Teubner, 1991] Kleiner Review: Aussagenlogik Eine Aussage ist eine sprachliche Formulierung, welcher man eindeutig einen Wahrheitswert zuordnen kann Unter Wahrheitswert verstehen wir wahr und falsch (wahr wird im folgenden mit 1, falsch mit 0 abgekürzt) „München liegt in Deutschland“ hat den Wahrheitswert 1 „Schwefel ist ein Metal“ den Wahrheitswert 0 Die (klassische) Aussagenlogik beschränkt sich auf die Betrachtung solcher Sprachgebilde, denen eindeutig ein Wahrheitswert zugeordnet werden kann Die Aussagenlogik beschäftigt sich damit, wie man solche Aussagen zu komplexeren sprachlichen Gebilden kombinieren kann und wie man den Wahrheitswert dieser komplexen Gebilde aus den Wahrheitswerten der in sie eingehenden einzelnen Aussagen (unter Anwendung logischer Prinzipien) bestimmen kann (sogar rein „mechanisch“!) Beispiel: „Wenn München in Deutschland liegt und Schwefel ein Metal ist, dann können Schweine fliegen“ Ist dieser Satz „wahr“ oder „falsch“? (mit den Vorgaben von oben) Kleiner Review: Aussagenlogik Wir abstrahieren im Weiteren von den eigentlichen Aussagen und setzen Platzhalter (Aussagenvariablen) an ihre Stelle, also A, B, C, ... usw. Die Platzhalter A,B,C,... repräsentieren atomare Aussagen Zur Kombination von atomaren Aussagen stehen uns Verbindungswörter zur Verfügung: und (∧), oder (∨), nicht (¬) (Syntax) Mit diesen können wir Formeln F,G,H... erstellen: Zunächst ist jede atomare Aussage eine Formel. Wenn wir zwei Formeln F und G haben, dann sind (F ∧ G), (F ∨ G), ¬ F und ¬ G Formeln. Nichts anderes ist eine aussagenlogische Formel (Semantik) Eine Formel H ist genau dann wahr, wenn sie entweder eine atomare Aussage ist und diese wahr ist oder, wenn H von der Form (F ∧ G) ist und sowohl F als auch G wahr sind oder, wenn H von der Form (F ∨ G) ist und mindestens eine der beiden Teilformeln F, G wahr sind oder, wenn H von der Form ¬ F ist und F falsch ist. Kleiner Review: Aussagenlogik Wahrheitswerte und ihre Bestimmung kann man hervorragend mit Wahrheitstafeln darstellen: ¬F F∧G F∨G F→G F↔G F⊕G F G 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 →, ↔ und ⊕ sind ableitbar aus den anderen Operatoren (sogenannter „Syntactic Sugar“ - man braucht auch einen Operator von ∨ bzw. ∧ nicht unbedingt: F ∨ G ≡ ¬( ¬ F ∧ ¬ G) bzw. F ∧ G ≡ ¬ (¬ F ∨ ¬ G) Kleiner Review: Aussagenlogik Eine Zuordnung von Wahrheitswerten zu den atomaren Aussagen in einer Formel, z.B. in F = A ∨ (¬ B ∧ ¬ A) nennt man „Belegung“, z.b. A/0, B/0. Aus einer solchen Belegung ergibt sich mit den semantischen Definitionen der Operatoren ein Wahrheitswert für F, hier eben 0 ∨ (¬ 0 ∧ ¬ 0) = 0 ∨ (1 ∧ 1) = 0 ∨ 1 = 1 (also ist F wahr) Für n atomare Aussagen gibt es 2n mögliche Belegungen Eine Formel F ist genau dann erfüllbar, wenn es mindestens EINE Belegung gibt, die sie wahr werden läßt. F ist genau dann gültig, wenn ALLE Belegungen, die zu ihr passen, sie wahr werden lassen (dann heißt F auch Tautologie) Eine Belegung passt zu einer Formel F, wenn die Belegung (mindestens) für alle atomaren Aussagen, die in F vorkommen, einen Wahrheitswert angibt F ist genau dann unerfüllbar (bzw. ungültig), wenn keine zu F passende Belegung F erfüllt. F ist genau dann gültig, wenn ¬ F unerfüllbar ist (d.h. wenn F gültig ist, dann ist ¬ F unerfüllbar und wenn ¬ F unerfüllbar ist, dann ist F gültig, denn die Äquivalenz setzt sich aus einer Konjunktion (=Ver-Undung) von zwei Implikationen (=Folgerungen) zusammen Kleiner Review: Aussagenlogik Die Erfüllbarkeit, Gültigkeit, Unerfüllbarkeit einer Formel F kann man gut mit Wahrheitstafeln bestimmen. Wenn die Spalte unter F nur Nullen enthält, dann und nur dann ist F unerfüllbar nur Einsen enthält, dann und nur dann ist F gültig (mindestens) eine Eins enthält, dann und nur dann ist F erfüllbar Allerdings hat eine Wahrheitstafel eben 2n Zeilen...der Aufwand zur Beantwortung einer Gütligkeits/Erfüllbarkeitsfrage ist also exponentiell zur Anzahl der Vorkommenden atomaren Aussagen! Aber genau diese Fragen will man sich natürlich stellen! Geht das denn besser? Kleiner Review: Aussagenlogik Nicht wirklich: Stephen Cook hat 1971 gezeigt, dass das Erfüllbarkeitsproblem (SAT) für aussagenlogische Formeln NPvollständig ist d.h. es ist kein deterministischer Algorithmus bekannt, der SAT-Problem generell „effizient“ ist (also einen Aufwand erfordert, der polynomiell zur Anzahl der atomaren Aussagen ist) Im zu erwartenden Mittel kann man aber etwas besser werden, als 2n, z.B. wenn man ein wenig „randomisiert“ (also den Zufall mitspielen läßt) und nur einen eingeschränkten Fall betrachtet, nämlich Formeln, die aus Konjunktionen von Disjunktionen bestehen (also in konjunktiver Normalform sind) und bei denen jede Disjunktion nur aus höchstens 3 Literalen besteht KNF: (A ∨ B ∨ C) ∧ (¬ A ∨ ¬ B), konjunktive Normalform DNF: (A ∧ B) ∨ (¬ A ∧ B), disjunktive Normalform Literal: atomare Aussage oder negierte atomare Aussage, z.B. A oder ¬ A Zu jeder Formel F existieren semantisch äquivalente Formeln in konjunktiver und disjunktiver Normalform Semantisch äquivalent: Gleicher Wahrheitswertverlauf Aber substantiell hilft das auch nicht weiter... weitere Details hierzu finden Sie z.B. Uwe Schöning, „Ideen der Informatik“, Oldenbourg, 2002 Kleiner Review: Aussagenlogik Beschränkt man sich allerdings auf Konjunktionen von sogenannten Hornformeln, dann gibt es einen sehr effizienten Algorithmus (Markierungsalgorithmus) Hornformeln sind Disjunktionen von Literalen, die nur höchstens ein positives Literal enthalten, eine Konjunktion solcher Formeln ist z.B. (¬ A ∨ B) ∧ (¬ B ∨ ¬ C ∨ D) ∧ (¬ B ∨ C) ∧ A ∧ ¬ E = F (A → B) ∧ ((B ∧ C) → D) ∧ (B → C) ∧ (1 → A) ∧ (E → 0) = F Jetzt wird alles markiert, was rechts von einer 1 steht (also alle As) Und dann alles, was rechts von einem Pfeil auftaucht auf dessen linker Seite alles markiert ist. Es werden jeweils alle Vorkommen markiert! Wenn etwas markiert wird, das links von einer 0 steht, dann ist die Formel unerfüllbar. Wenn das nicht passiert, dann ist sie erfüllbar (alles Markierte wird mit 1 belegt, alles andere mit 0, dann hat man eine erfüllende Belegung, diese wird auch MODELL genannt). [Suchen Sie nach einem Modell für F!] Wenn man untersuchen will, ob eine Formel F gültig ist, dann kann man den Markierungsalgo auf die Negation von F anwenden (falls ¬ F sich als Konjunktion von Hornformeln darstellen läßt) Kleiner Review: Aussagenlogik Es gibt noch eine generelle Alternative zur Wahrheitstafelmethode (die aber auch sehr teuer werden kann), die Herleitung einer leeren „Klausel“ mittels Resolution Gegeben ist eine Formel F in KNF. Diese bringen wir in „Klauselform“: jede Disjunktion schreiben wir als Menge von Literalen, solch eine Menge heißt Klausel Aus zwei Klauseln K1,K2 kann man einen Resolventen R bilden , wenn es ein Literal L gibt, das in einer Klausel positiv und in der anderen negativ vorkommt, z.B. {A,C} = K1 und {A,B,¬C} = K2. Der Resolvent R ergibt sich dann, indem die beiden gefunden „komplementären“ Literale entfernt und die jeweiligen Reste vereint, also oben R = {A,B} = {A,C} – {C} ∪ {A,B,¬C} – {¬C} Ergibt sich dabei auf irgendeinem Weg eine leere Klausel ¤ , dann ist F unerfüllbar! z.B. (A ∨ B ∨ ¬ C) wird zu {A,B,¬C} Warum? Sei F = ... ∧ A ∧ ¬ A ..., also F = {...,{A},{¬ A},...}. Dann lässt sich unmittelbar die leere Klausel, also ¤, ableiten, F ist also unerfüllbar – das ist auch „logisch“, denn unabhängig vom „Rest“ sind A und ¬ A natürlich widersprüchlich. Beim Hinzufügen von Resolventen bleibt die Formelmenge hinsichtlich der Unerfüllbarkeit äquivalent! (kann man sich auch einfach am abstrakten Beispiel überlegen) – wir „entdecken“ also nur den Widerspruch geschickt Wenn man solange Resolventen bildet, bis keine neuen Resolventen mehr gefunden werden können und dabei jeweils die neu hinzukommenden mit als mögliche Ausgangsklauseln K in Erwägung zieht, dann ist die Formel erfüllbar. Findet man bei diesem Prozeß hingegen die leere Klausel, dann ist die Formel unerfüllbar. Wenn man „geschickt“ ist, dann kann man die leere Klausel mit einer „minimalen“ Anzahl von Resolventenbildungen finden...aber auch das kann im Worst Case exponentiellen Aufwand verursachen... Kleiner Review: Aussagenlogik Weitere Details finden Sie in den INT A-Unterlagen oder z.B. in Schöning, Logik für Informatiker, 5. Aufl. Was haben wir also? Ein NP-vollständiges Problem für „volle“ Aussagenlogik mit zwei „Lösungsverfahren“ Wahrheitstafeln (immer teuer bei Unlösbarkeit) Resolution (manchmal günstig) (Vereinfachen geht auch noch manchmal) Eine Variante mit Hornformeln, die nicht alles ausdrücken kann, ... ... dafür mit einem effizienten Lösungsverfahren Ganz ähnlich ist die Situation in der Prädikatenlogik...(nur noch etwas „unangenehmer“, weil es „semi-entscheidbare“ Probleme gibt) Kleiner Review: Aussagenlogik Lösen Sie das folgende Problem: Inspektor Craig hat einen Fall zu lösen. Er hat 3 Personen in Verdacht, die Tat begangen zu haben. Als Täter kommen nur A,B oder C in Frage. Inspektor Craig hat folgende Informationen: Wenn A schuldig und B unschuldig sind, so ist C schuldig C arbeitet niemals allein A arbeitet niemals mit C Nur A, B oder C kommen als Täter in Frage Formulieren Sie die Informationen aussagenlogisch Bringen Sie die Formeln in KNF (also eine Konjunktion von Disjunktionen, eine reine Disjunktion ist auch in KNF ;-) Überprüfen Sie mittels Resolution die Vermutung Inspektor Craigs, dass B einer der Täter war (fügen Sie also ¬ B zur Formelmenge hinzu und suchen sie nach einem Widerspruch) Prädikatenlogik ultra-knapp Gibt es etwas, das die Aussagenlogik nicht so gut kann? Schauen wir uns nochmal unser erstes Problem an: In einer Firma arbeiten drei Freunde: ein C++Programmierer, ein Java-Programmierer und ein PascalProgrammierer. Ihre Namen sind Otto, Paul und Kai. Der C++-Programmierer hat keine Geschwister; er ist der Jüngste der drei Freunde. Kai, der mit der Schwester von Otto verheiratet ist, ist älter als der Java-Programmierer. Wer programmiert in welcher Sprache? Können Sie das mit Aussagenlogik formalisieren? Probieren Sie es mal! Prädikatenlogik ultra-knapp Der C++-Programmierer hat keine Geschwister. Vielleicht ist es Otto? Aber vielleicht ist es auch einer der anderen? cplusplus-programmierer_otto → keine_geschwister_otto cplusplus-programmierer_paul → keine_geschwister_paul cplusplus-programmierer_kai → keine_geschwister_kai Schlimmer wird es noch für die Aussage „Der C++-Programmierer ist der Jüngste“! Prädikatenlogik ultra-knapp Nochmal: Der C++-Programmierer hat keine Geschwister. Das heißt doch eigentlich: Wenn wir den mysteriösen Jemand mit einem Platzhalter, z.B. x, identifizieren und als Programmierer erkennen, dann können wir schreiben Wenn jemand C++-Programmierer ist, dann hat dieser jemand keine Geschwister Wenn ein Programmierer x c++ programmiert, dann hat x keine Schwester Programmierer(x) ∧ Programmiert(x, c++) → hat_keine_Geschwister(x) Das ist aber schäbig...man kann die Eigenschaft „hat_keine_Geschwister“ gar nicht mit der Eigenschaft „hat_Geschwister“ in Bezug setzen...besser: hat_keine_Geschwister(x) entspricht: es gibt kein y, so dass Geschwister(x,y) erfüllt wäre. In der Prädikatenlogik kann man dann schreiben: @ y Geschwister(x,y) bzw. ¬ ∃ y Geschwister(x,y) Insgesamt gilt für alle C++-programmierenden Personen: ∀ x (Programmierer(x) ∧ Programmiert(x, c++) → ¬ ∃ y Geschwister(x,y)) Prädikatenlogik ultra-knapp Programmierer(Kai). Programmierer(Otto). Programmierer(Paul). Language(C++). Language(Java). Language(Pascal): Geschwister(Otto,Karla). ∃ x (Programmierer(x) ∧ Programmiert(x,C++)). ∃ x (Programmierer(x) ∧ Programmiert(x,Java)). ∃ x (Programmierer(x) ∧ Programmiert(x,Pascal)). ∀ x (Programmierer(x) ∧ Programmiert(x,C++) → ¬ ∃ y Geschwister(x,y)) ∀ x (Programmierer(x) ∧ Programmiert(x,C++) ∧ (∀ y Programmierer(y) ∧ (∃ z Language(z) ∧ Programmiert(y,z) ∧ z ≠ C++) → Jünger(x,y))) ∀ x,y (Geschwister(x,y) → Geschwister(y,x)). ∃ x (Programmierer(x) ∧ Programmiert(x,Java) ∧ Jünger(x,Kai)). ∀ x,y Programmiert(x,y) ∧ @ z (Programmiert(x,z) ∧ z ≠ y) Prädikatenlogik ultra-knapp Operatoren ∨, ∧, →, ↔, ¬ wie in der Aussagenlogik. Wir können jetzt aber einzelne/alle Objekte anfassen. Es kommen also Quantoren hinzu: Außerdem können wir Beziehungen zwischen Objekten beschreiben mit Prädikaten: Existenzquantor: Es existiert ein x, so dass gilt...: ∃ x Allquantor: Für alle x gilt ...: ∀ x Für alle x ∈ N gilt: es existiert ein y ∈ N mit x “ist_kleiner_als” y ∀ x (N(x) → ∃ y (N(y) ∧ ist_kleiner_als(x,y))) Und wir können mit Objekten “rechnen”, also Funktionen in Prädikaten verwenden ∀ x ∀ y (N(x) ∧ N(y) → ∃ z (N(z) ∧ equals(z,x+y))) Prädikatenlogik ultra-knapp Def. Terme Jede Konstante ist ein Term (Konstanten sind 0-stellige Funktionssymbole) Jede Variable ist ein Term Sind t1,...,tn Terme und f ein n-stelliges Funktionssymbol, so ist auch f(t1,...,tn) ein Term. Def. Prädikatenlogische Formeln Ist p ein n-stelliges Prädikatssymbol und sind t1,...,tn Terme, dann ist p(t1,...,tn) eine atomare Formel. Sind F und G Formeln, dann sind auch (F ∧ G), (F ∨ G), (F → G), (F ↔ G) Formeln Statt einer Erläuterung der Semantik: Eine abgespeckte Prädikatenlogik „für Praktiker“ Prolog (s. Übungen/Folien/Tutorium auf unserer Webseite) Hervorzuhebende Aspekte: Prolog ist „fast“ Hornklausel-Logik (also eine „abgespeckte“ Variante von FOL (=first order logic), in der es in jeder Klausel nur höchstens ein positives Prädikat gibt) Prolog ist leider nicht vollständig „logisch“, denn seine „normale“ Abarbeitungsstrategie ist nicht vollständig (d.h., es findet manchmal keine Lösung, obwohl es eine gibt). Prolog besteht aus Fakten+Regeln+Anfragen. Alles in Prolog ist ein Term. Prolog verwendet eine Tiefensuche und Backtracking, um Anfragen zu beantworten. Hierbei verwendet es Unifikation (Variablen werden gleichgesetzt, z.B. X=Y, oder mit Termen identifiziert), um Bindungen an Variablen zu finden, die die betroffenen Regeln erfüllen Prolog kann auch in limitierter Weise mit Negation umgehen Prolog, einige Aspekte... Wichtige „Datenstruktur“ Listen im Grunde auch „klassische“ Terme: .(a(.(b,.(c,[]))) - Liste (a,b,c) (wird immer durch eine leere Liste abgeschlossen). Prolog bietet eine „schönere“ Notation als „Abkürzung“: [a,b,c] = [a |[b,c]] = [a,b|[c]] = [a,b,c|[]] Der senkrechte Strich trennt die Liste in Kopf | Restliste Kann man direkt in Anfragen verwenden: ?- [a,b,c,d,e] = [X|Y]. ?- [a,b,c,d,e] = [a,b|X]. ?- [a,b,c,d,e] = [_,_,_|X] Antwort: X=a, Y=[b,c,d,e] Antwort: X = [c,d,e] Antwort: X = [d,e] Prolog, einige Aspekte Gegeben: Kopf :- S1,S2,...,Sn „Logisch“/“Deklarativ“: Kopf ← S1 ∧ S2 ... ∧ Sn (Klausel C) (Klausel C) Äquivalent auch: Kopf ∨ ¬ S1 ∨ ... ∨ ¬ Sn Hier fehlen noch die Quantoren – es ist alles Allquantifiziert: ∀ X ∀ Y: C Ein Ziel Z ist erfüllt, wenn es eine Klausel C gibt, deren Kopf sich mit Z unifizieren läßt und alle Prädikate im „Körper“ von C (also S1,...,Sn) erfüllt sind (unter der gegebenen und gegebenenfalls zu erweiternden Variablensubstitution) Prolog findet aber leider nicht alle sinnvollen Substitutionen (es kann sich in unendliche Zweige verrennen, obwohl es eine sinnvolle Lösung gäbe). Warum? Prolog, einige Aspekte Folgende Aufgabe: Gegeben ist ein Graph G durch die Angabe aller Kanten: Gesucht ist ein Prädikat, dass die möglichen Wege zwischen zwei Knoten beschreibt „Logische“ Idee: kante(a,b). kante(b,c). kante(c,d). kante(d,a). kante(d,e). path(X,Y) :- path(X,Z),path(Z,Y). % Es gibt einen Weg von X nach Y, wenn es einen Zwischenhalt Z gibt, der von X erreichbar ist und von dem aus man Y erreicht. path(X,Y) ;- kante(X,Y). % Jede Kante ist ein Weg Das macht Prolog nervös, weil die erste Klausel zu einer Anfrage, z.B. ?- pfad(a,b), paßt und das erste Teilziel dann pfad(a,Z) ist ... und da wieder die erste Klausel paßt Prolog schaut sich den korrekten Lösungspfad im Baum der möglichen Lösungspfade einfach nicht an Prolog, einige Aspekte Hilft eine andere Reihenfolge der Klauseln? path(X,Y) ;- kante(X,Y). path(X,Y) :- path(X,Z),path(Z,Y). Fragen wir mal nach ?- pfad(a,b). In den Fakten war „kante(a,b).“ enthalten – Prolog antwortet korrekt. Neue Frage: ?- pfad(a,c). Die erste Klausel paßt, gibt aber nichts her. Die zweite Klausel paßt und führt zunächst zum „Aufruf“ von path(a,Z). Dazu liefert die erste Klausel eine Antwort: Z = b. Damit wird das zweite Subziel aufgerufen: path(b,c). Auch hierzu gibt es eine korrekte Antwort durch die erste Klausel, also Yes. Neue Frage: ?- pfad(a,a). Prolog, einige Aspekte Hilft eine andere Reihenfolge der Klauseln? path(X,Y) ;- kante(X,Y). path(X,Y) :- path(X,Z),path(Z,Y). Neue Frage: ?- pfad(a,a). Erste Klausel liefert nichts, zweite Klausel ruft erstes Teilziel auf: pfad(a,Z). Wir finden zunächst wie eben pfad(a,b) mit der ersten Klausel. Das führt zum Aufruf von pfad(b,a). Die erste Klausel failed, Aufruf der zweiten Klausel für pfad(b,a). Aufruf des ersten Teilziels: pfad(b,Z). Erste Klausel antwortet Z = c Aufruf des zweiten Teilziels: pfad(c,a) Erste Klausel failed Zweite Klausel ruft pfad(c,Z) auf, 2. Klausel antwortet Z = d pfad(d,a) wird aufgerufen, exit aus der ersten Klausel, exit zweites Teilziel Exit erstes Teilziel Exit pfad(b,a) Exit pfad(a,b) Antwort: YES Prolog, einige Aspekte Hilft eine andere Reihenfolge der Klauseln? ?- path(e,X). Die erste Klausel passt nicht (nie!) path(X,Y) ;- kante(X,Y). path(X,Y) :- path(X,Z),path(Z,Y). Das Path in der zweiten Klausel wird immer wieder aufgerufen, um Path zu beweisen ... Out-of-Stack! ?- path(a,f). Genauso...wir finden alle gangbaren Wege von a aus, aber dann... Übrigens: „fast“ alle gangbaren Wege von a aus erhalten sie über path(a,X). und wiederholte Eingabe von ; ... aber wenn sie nicht rechtzeitig aufhören, dann „out-of-Stack“ (wg. e) Übrigens gibt es unendlich viele gangbare Wege: a-b-c-d-a-b-c-d-a ... aber dieses „Problem“ sieht Prolog nicht, weil es soweit gar nicht kommt Prolog, einige Aspekte Wo liegt das Problem für path(e,X) und path(a,f)? path(X,Y) ;- kante(X,Y). path(X,Y) :- path(X,Z),path(Z,Y). Prolog „sieht“ nicht, dass es keinen Sinn macht, noch nach path(e,X) zu suchen, wenn es keine Kanten gibt, die von e ausgehen Man kann Prolog helfen, indem man den rekursiven Aufruf „grounded“ – man sorgt dafür, dass es einen „reale“ Ausgangspunkt wirklich gibt: path(X,Y) :- kante(X,_),path(X,Z),path(Z,Y). Dann liefert path(e,X) ein korrektes NO – aber noch nicht path(a,f). Also: path(X,Y) :- kante(X,_),kante(_,Y),path(X,Z),path(Z,Y). Jetzt gehen beide, aber path(a,X) liefert unendlich oft X=b als Antwort (warum?) Prolog, einige Aspekte Eine knappere Variante: path(X,Y) ;- kante(X,Y). path(X,Y) ;- kante(X,Z),path(Z,Y). Jetzt hat jeder Pfad einen „gegroundeten“ Anfang... path(a,X) funktioniert jetzt (und liefert unendlich viele Antworten) ...aber path(a,f) geht wieder nicht mehr...warum? Weil die Daten einen Kreis bilden...und es unendlich viele Wege gibt, die vielleicht einen Abzweig nach e haben könnten... Wie wäre es mit einer Kante als Abschluß? path(X,Y) :- kante(Z,Y), path(X,Z). Das geht bei path(e,X) gar nicht gut...(warum?) – auch nicht bei pfad(f,a) Prolog, einige Aspekte Also doch beides „grounden“ - geht alles? knoten(X) ;- kante(X,_). knoten(Y) :- kante(_,Y). path(X,Y) ;- kante(X,Y). path(X,Y) :- knoten(Y), kante(X,Z), path(Z,Y). path(a,f), path(f,a), pfad(e,X) funktionieren. Aber leider geht pfad(a,X) nicht komplett: liefert b, dann a und dann immer weiter a ... ... und wenn man knoten(f) (ein unverbundener Knoten) hinzufügt, dann geht auch path(a,f) nicht mehr! Vielleicht helfen ja Anfangs- und Abschlußkante. pfad(X,Y) :- kante(X,Y). pfad(X,Y) :- kante(X,Z), kante(Z,Y). pfad(X,Y) :- kante(X,Z1), pfad(Z1,Z2), kante(Z2,Y). Prolog, einige Aspekte Vielleicht helfen ja Anfangs- und Abschlußkante. Jetzt funktionieren pfad(a,X), pfad(e,X), pfad(f,a) Aber nicht pfad(a,f)... ...weil er wieder ewig im Kreis sucht – Prolog „sieht“ nicht, dass er mit Kante(Z2,f) sofort ein fail für die zweite Klausel erzeugen könnte. Vielleicht so? pfad(X,Y) :- kante(X,Y). pfad(X,Y) :- kante(X,Z), kante(Z,Y). pfad(X,Y) :- kante(X,Z1), pfad(Z1,Z2), kante(Z2,Y). pfad(X,Y) :- kante(X,Y). pfad(X,Y) :- kante(X,Z), kante(Z,Y). pfad(X,Y) :- kante(X,Z1), kante(Z2,Y), pfad(Z1,Z2). Jetzt liefert pfad(a,X) b;c;b;b;b;b;... suchen Sie nach einer besseren Lösung! Prolog, einige Aspekte Prolog findet aber leider nicht alle sinnvollen Lösungen bzw. Substitutionen (es kann sich in unendliche Zweige verrennen, obwohl es eine sinnvolle Lösung gäbe). ...und zwar, weil es eine bestimmte Reihenfolge in der „Abarbeitung“ von „passenden“ Klauseln einhält (von oben nach unten) und deshalb manche Möglichkeiten nicht verfolgt, sondern einer Spur nach unten zu lange treu bleibt ... und die Subziele in einer Klausel von links nach rechts abarbeitet (Probleme bei der Substitution, wenn links sehr viele, ev. unendlich viele Substitutionsmöglichkeiten auftreten, die man hätte „grounden“ (sprich: beschränken) können durch eine andere Reihenfolge Prolog, einige Aspekte: append/2 Spaß mit append: ?- append([1,2],[3,4],L). L = [1,2,3,4] ?- append([1|R1],[5,R2],[1,3,5,7]). append([],L,L). append([X|L1],L2,[X|L3]) :- append(L1,L2,L3). R1 = [3], R2 = [7] ?- append(L1,L2,[1,2,3]). L1 = [] L1 = [1] L1 = [1,2] L1 = [1,2,3] L2 = [1,2,3] ; L2 = [2,3] ; L2 = [3] ; L2 = [] ; no Prolog, einige Aspekte: Listen Element/2 Deklarative Interpretation: Jede Liste, die X als führendes Element enthält, erfüllt das Prädikat. Enthält eine Liste X, so enthält auch jede um ein Element erweiterte Liste X Prozedurale Interpretation element(X,[X|_]). element(X|[_|Y]) :- element(X,Y). Untersuche, ob das gesuchte Element das erste Element der Liste ist Wenn nein, untersuche, ob es in der Restliste vorkommt ?- element(X,[1,2,3]). X=1; X=2; X=3; no Prolog, einige Aspekte: Listen Delete/3 ?- append(X,[1,2,3], Rest). X=1 X=2 X=3 Rest = [2,3] ; Rest = [1,3] ; Rest = [1,2] ; no Anhängen eines einzelnen Elements delete(X,[X,T],T). delete(X,[Y|T],[Y|U]) :- delete(X,T,U). el_append(Element,L,LN) :- append(L,[Element],LN). Prüfen, ob eine Liste L1 Teilliste einer Liste L2 ist enthalten(L,SL) :- append(L1,L2,LS), append(L,_,L2) PS: nicht sehr effizient... Prolog, einige Aspekte: Akkumulator Umdrehen ohne Akkumulator umdrehen([],[]). umdrehen([K|Rest]) :- umdrehen(Rest,Y), append(Y,[K],X). Läuft endlos, wenn man nach zwei Lösungen für umdrehen(X,[a,b,c]) fragt. Umdrehen mit Akkumulator reverse(L1,L2) :- rev(L1,L2,[]). rev([],L2,L2) :- !. % Ein Cut rev([X|Xs],L2,Acc) :- rev(Xs,L2,[X|Acc]). Mit diesem Cut findet man nur die eine “richtige” Lösung, wenn man reverse(X,[a,b,c]) fragt. Wird er entfernt, läuft das Prädikat auch in eine Endlosschleife bei der Frage nach zwei Lösungen. Prolog, einige Aspekte: Akkumulator Akkumulator und Cut reverse(L1,L2) :- rev(L1,L2,[]). K1: rev([],L2,L2) :- !. K2: rev([X|Xs],L2,Acc) :- rev(Xs,L2,[X|Acc]). rev(L1,[a,b],[]) 1: K1 passt nicht, K2 rev([X1|Xs1],[a,b],Acc1 = []) :- rev(Xs1,[a,b],[X1|[]]) 2: K1 passt nicht, K2 rev(Xs1 = [X2|Xs2],[a,b],Acc2 = [X1|[]]) :- rev(Xs2,[a,b],[X2|[X1|[]]]) 3: K1 passt, Xs2 = [], X2 = a, X1 = b. exit 2back: rev(Xs1 = [a,[]],[a,b],Acc2 = [b|[]]) exit 1back: rev([b,[a,[]]],[a,b],[]). exit Antwort: L = [b,a] Wenn man ; eingibt, versucht Prolog, dass Subziel unter 2 nicht noch einmal zubeweisen. Wenn der Cut fehlt, wird die Regel K2 dann aufgerufen, um rev(Xs2,[a,b],[X2|[X1|[]]]) zu zeigen, dass führt zu rev(Xs2 = [X3|Xs3],[a,b],Acc3=[X2|[X1|[]]]) :- rev(Xs3,[a,b],[X3|[X2|[X1|[]]]]). ... usw., der Akkumulator ist dann zu lang, um [a,b] zu matchen – und wird immer länger! Prolog, einige Aspekte: Arithmetik, Rekursion Achtung: Arithmetik funktioniert nur wie erwartet, wenn die Variablen auf der rechten Seite gebunden sind (sonst operiert man mit nichtausgerechneten Termen bzw. erhält Fehler)! sumlist([H|T], Sum) :- sumlist(T,Sum1), Sum is Sum1 + H. Vertauschung der Reihenfolge der Subziele führt zu Fehlern (logisch betrachtet wäre die Reihenfolge aber „wurscht“) Berechnen Sie die Fakultät einer Zahl n rekursiv! Was ist falsch? fak(N, Fak) :- N1 ist N + 1, fak(N1, Fak1), Fak is Fak1 * N. fak(0,1). Anfrage: ?- fak(4,Fak). Korrekte Version fak(N, Fak) :- integer(N), N > 0, N1 ist N + 1, fak(N1, Fak1), Fak is Fak1 * N. fak(0,1).