Vorlesungsfolien

Werbung
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).
Zugehörige Unterlagen
Herunterladen