Von der Wissensbasis zum Expertensystem

Transcrição

Von der Wissensbasis zum Expertensystem
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
Alfred Hermes
1
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
1. Vorbemerkungen....................................................................................................................3
1.1 Zum Thema ......................................................................................................................3
1.2 Lernziele...........................................................................................................................3
2. Lerneinheiten..........................................................................................................................4
2.1 Eine kleine Ahnentafel .....................................................................................................4
2.1.1 Zur Geschichte von Prolog........................................................................................4
2.1.2 Grundelemente von Prolog........................................................................................4
2.1.3 Backtracking als Methode zur Beantwortung von Fragen........................................8
2.2 Arithmetik - Rekursion...................................................................................................11
2.2.1 Die Türme von Hanoi..............................................................................................11
2.2.2 Weitere Beispiele ....................................................................................................12
2.2.3 Gewonnenes Wissen weiterverwenden...................................................................14
2.3 Musterorientierte Wissensrepräsentation (SII) ..............................................................15
2.3.1 Symbolisches Differenzieren ..................................................................................15
2.3.2 Konstanten und Operatoren.....................................................................................16
2.3.3 Termvereinfachung * ..............................................................................................17
2.4 Der Datentyp Liste .........................................................................................................19
2.4.1 Definition ................................................................................................................19
2.4.2 Grundoperationen....................................................................................................19
2.4.3 Sortieren ..................................................................................................................22
2.5 Erweiterte Verwendung von Listen ...............................................................................24
2.5.1 Listenoperationen - der funktionale Aspekt............................................................24
2.5.2 Listen als Fakten .....................................................................................................24
2.5.3 Terme als Listen, Operatoren als Argumente..........................................................25
2.6 Kontrollstrategien...........................................................................................................26
2.6.1 Rückwärtsverkettung...............................................................................................26
2.6.2 Vorwärtsverkettung.................................................................................................27
2.6.3 Schatzsuche .............................................................................................................29
2.6.4 Graph als Funktor* ..................................................................................................30
2.7 Ein einfacher Interpreter mustergesteuerter Programme* .............................................31
2.8 Expertensysteme.............................................................................................................34
2.8.1 Komponenten von Expertensystemen.....................................................................34
2.8.2 Diagnose von Fehlern am Auto...............................................................................36
2.9 Eine kleine Logelei* ......................................................................................................40
Glossar..................................................................................................................................42
Literaturverzeichnis..............................................................................................................43
2
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
1. Vorbemerkungen
1.1 Zum Thema
Expertensysteme und Künstliche Intelligenz sind Paradigmen „moderner“ Anwendungen von
Computern. In diesem Zusammenhang gilt Prolog als besonders praktisches und leicht handhabbares
Programmierwerkzeug. Während konventionelle Sprachen wie Pascal prozedural orientiert sind,
repräsentiert Prolog als sogenannte Sprache der fünften Generation eine deskriptive oder deklarative
Programmiersprache.
Obwohl es sich bei Prolog nicht um eine funktionale Programmiersprache handelt, sind funktionale
Aspekte doch indirekt präsent und z.B. bei Listenverarbeitung erkennbar. Gleichzeitig unterstützt
Prolog die Verwendung abstrakter Datentypen in generischer Form.
Aufgrund der genannten Aspekte, des prologeigenen Kontrollmechanismus der Rückverfolgung, des
äußerst leichten Zugangs zur Sprache und der einfachen Bedienung des Systems ist Prolog eine
interessante Alternative zu einer imperativen Sprache wie Pascal.
Das Heft behandelt Komponenten von Expertensystemen und führt gleichzeitig in die logische
Programmiersprache Prolog ein. Es wird ein Bogen von einer einfachen Datenbank am Beispiel einer
Ahnentafel bis zu Komponenten (Inferenzmaschine) eines kleinen Expertensystems gespannt.
Thematische Schwerpunkte der Reihe sind die Wissensdarstellung und logische Schlussfolgerungen
aus Wissen bei Verwendung von Prolog als Werkzeug. Als Leitgedanke spielt die Entwicklung von
Expertensystemen eine tragende Rolle.
Aspekte, wie die Behandlungen von Logeleien, die Verarbeitung natürlicher Sprache, Vertiefungen
von aussagenlogischen und prädikatenlogischen Problemen, sowie Tipps und Tricks in Prolog
werden nur aufgegriffen, wenn sie sich aus dem übergeordneten Thema ergeben.
Die Prolog-Beispiele aus der Unterrichtsreihe entsprechen dem „Quasi-Standard“ von DEC-Prolog,
das in „Programming in Prolog von Clocksin/Mellish, Springer-Verlag 1984“ verwandt wird.
1.2 Lernziele
Nach Bearbeitung des Materials sollt Ihr / sollten Sie
- Grundlagen der deklarativen Programmiersprache Prolog kennen,
- den Prozess der Rückverfolgung als Problemlösungsstrategie kennen,
- rekursive Prozesse in Prolog formulieren können,
- Wissen in musterorientierter Form formulieren und auswerten können,
- Kontrollstrategien wie Rückwärts- und Vorwärtsverkettung anwenden können,
- die Wissensbasis mit Hilfe des Arbeitsspeichers erweitern können,
- einen einfachen Interpreter für mustergesteuerte Programme kennen und verstehen,
- Probleme des Einsatzes von Expertensystemen kennen,
- Komponenten von Expertensystemen kennen und
- Teile einer Expertensystemschale in Prolog programmieren können.
3
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2. Lerneinheiten
2.1 Eine kleine Ahnentafel
2.1.1 Zur Geschichte von Prolog
Prolog (Programming in Logic) wurde 1972 von Alain Colmerauer und einer Gruppe von
Wissenschaftlern (Groupe d`Intelligence Artificielle de Luminy) an der Universität Marseille konzipiert
und erstmals implementiert. Durch die Wahl von Prolog als Sprache der sog. 5. Generation in einem
breit angelegten japanischen Forschungsvorhaben erhielt Prolog Weltgeltung in der Familie der
Sprachen der KI (Künstlichen Intelligenz). Prolog basiert auf Prinzipien der logischen Programmierung
und gehört zu den deklarativen Sprachen. "Deklarativ" bedeutet, dass dem Computer logische
Beziehungen deklariert werden können, wobei die Beziehungen bereits das Programm definieren. Es
stellt sich die Frage, was zu lösen ist, im Gegensatz zu prozeduralen Sprachen wie Pascal, wo
gefragt wird, wie etwas zu lösen ist.
Stichworte (engl.)
- progamming in logic
- declarative language
- fifth generation computer language
- AI = artificial intelligence
2.1.2 Grundelemente von Prolog
Fakten
Die folgende Skizze ([5]) zeigt einen Ausschnitt aus einer Ahnentafel
wilhelmine
elfriede
maria
fritz
anton
hugo
brunhilde
theresia
heinz
wilhelm
alfons
(Entnommen aus [5], M. Hanus, Titelseite)
Die Beschreibung der Ahnentafel erfolgt in der Prolog-Wissensbasis, auch Datenbasis genannt. Man
wähle den Prolog-Editor durch Eingabe von:
?- edit(ahnentafel).
/* Punkt Return */
Vergessen Sie nicht den Punkt am Ende der Eingabe, und schließen Sie jede Eingabe durch Drücken
der Returntaste ab!
Die in der Ahnentafel dargestellten Objekte lassen sich durch Eigenschaften, wie das Geschlecht
oder Beziehungen, wie das Verheiratetsein oder Muttersein beschreiben.
4
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Über Wilhelmine lässt sich z.B. sagen, dass sie weiblich ist und mit Fritz die Töchter Elfriede und
Theresia hat.
Zur Darstellungen solcher Informationen verwendet man in Prolog sog. Fakten, die aus Prädikaten
bzw. Relationsnamen (in Prolog: Funktoren) wie "weiblich" und verknüpften Objekten (in Prolog:
Argumente) wie den Namen bestehen:
Umgangssprache
Wilhelmine ist weiblich
Wilhelmine und Fritz sind
Eltern von Elfriede
Prolog - Fakten (in Form von Relationen)
weiblich(wilhelmine).
elternVon(fritz,wilhelmine,elfriede).
Man erkennt, dass die Namen der Prädikate (weiblich, elternVon) und der Objekte
(fritz,wilhelmine,elfriede) mit einem kleinen Buchstaben beginnen. Alle Fakten sind durch
einen Punkt abzuschließen:
weiblich(wilhelmine).
weiblich(brunhilde).
weiblich(elfriede).
weiblich(theresia).
weiblich(maria).
maennlich(fritz).
maennlich(heinz).
maennlich(anton).
maennlich(wilhelm).
maennlich(hugo).
maennlich(alfons).
elternVon(wilhelmine,fritz,elfriede).
elternVon(wilhelmine,fritz,theresia).
elternVon(brunhilde,heinz,wilhelm).
elternVon(elfriede,anton,maria).
elternVon(elfriede,anton,hugo).
elternVon(theresia,wilhelm,alfons).
Übung
Starten Sie das Prologsystem, und edieren Sie die vorbereitete Wissensbasis namens „Ahnentafel“.
Speichern Sie die Ahnentafel ab (F2) und geben Sie ein:
?- consult(ahnentafel).
Die Datei "Ahnentafel" wird als Wissensbasis herangezogen.
Fragen / Wiedergewinnung von Wissen / Prüfen von Fakten
Nun kann die Wissensbasis befragt werden:
?- elternVon(wilhelmine,fritz,theresia).
yes
Hier wird festgestellt, dass Wilhelmine und Fritz Eltern von Theresia sind.
5
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
?- maennlich(elfriede).
no
Hier handelt es sich offensichtlich um eine falsche Aussage.
Variablen / Abrufen von Fakten
Um herauszufinden, welche Kinder z.B. Wilhelmine und Fritz haben, fasst man das 3. Argument
(Objekt) zum Funktor (Prädikat) elternVon als Variable auf:
?- elternVon(wilhelmine,fritz,Kind).
Kind=elfiede
more(j/n)? j
Kind = theresia
o
Variablennamen beginnen mit einem großen Buchstaben.
Konjunktion / Disjunktion / Logisches Verknüpfen von Abfragen
Die Anfrage, ob Theresia und Elfriede dieselbe Mutter haben, lässt sich auf folgende Weise
ausdrücken: "Die beiden Mädchen haben dieselbe Mutter, wenn die Mutter von Theresia auch die
Mutter von Elfriede ist. Der Name des Vaters spielt hier keine Rolle:
?- elternVon(Mutter,_,theresia), elternVon(Mutter,_,elfriede).
Mutter = wilhelmine
o
o
o
o
Das Komma entspricht dem logischen "Und".
Ein Semikolon entspricht dem logischen "Oder".
Ein Unterstrich ist eine anonyme Variable, deren Name und Inhalt nicht benötigt wird.
Nur wenn alle Teilaussagen wahr sind, ergibt die Konjunktion eine wahre Aussage. Bei der
Disjunktion reicht eine wahre Teilaussage aus, um eine wahre Aussage zu erhalten.
Regeln (rules) / Definition neuer Relationen
Regeln werden auf Gruppen von Fakten angewendet. Die Regel istSchwesterVon lässt sich auf
folgende Weise beschreiben:
X ist Schwester von Y, falls X weiblich ist und X und Y dieselben Eltern haben.
In ProLog:
istSchwesterVon(X,Y) :weiblich(X),
elternVon(M,V,X),
elternVon(M,V,Y).
Die Regel ist in die ProLog-Wissensbasis zur Ahnentafel einzutragen.
(edit(ahnentafel). ..... reconsult(ahnentafel).)
?- istSchwesterVon(X,hugo).
X = maria.
o
Eine Regel ist eine Beschreibung der Beziehungen zwischen Objekten. Sie besteht aus
einem Kopf (Folgerung) und einem Rumpf (Voraussetzung). Kopf und Rumpf trennen das
Symbol :-, das als "wenn" oder "falls" ausgesprochen wird.
6
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
o
Regeln und Fakten fallen unter den Oberbegriff Klauseln (clauses).
o
Falls die Voraussetzungen im Regelrumpf eine Konjunktion (und) bilden, muss jeder Voraussetzungsteil bestätigt sein, damit die Regel gilt. Bei der Disjunktion (oder) genügt dafür die
Bestätigung mindestens einer Klausel im Rumpf.
Kommentare
/* Dies ist ein Kommentar */
% Dies ist auch ein Kommentar
Verneinung
Zur Verneinung existiert in Prolog der Operator bzw. das Prädikat not. Bei seiner Anwendung wird
aus dem Misslingen einer Abfrage das Gegenteil gefordert (negation as failure). not deckt sich nicht
mit der logischen Verneinung, wie folgendes Beispiel zeigt:
maennlich(hans).
weiblich(X) :- not maennlich(X).
/*bzw.:weiblich(X):-not (maennlich(X)).*/
?- weiblich(erna).
?- weiblich(anton).
?- weiblich(hans).
yes
yes
no
Die ersten beiden Antworten lauten jeweils yes, da die Argumente nicht in der Wissenbasis vorkommen.
Vergleich von Objekten
Nach der Regel “istSchwesterVon“ ist jede weibliche Person Schwester von sich selbst. In Prolog
lassen sich Variableninhalte nicht ohne weiteres vergleichen, wenn sie keine Zahlen sind. Falls die
Variablen allerdings einen Wert haben, mit dem die entsprechende Aussage überprüft werden kann,
darf das Gleichheitszeichen auch in Verbindung mit not verwendet werden. Die Regel
istSchwesterVon kann (allerdings erst am Schluss, denn erst dort sind X und Y mit Werten belegt)
wie folgt ergänzt werden:
istSchwesterVon(X,Y) :weiblich(X),
elternVon(M,V,X),
elternVon(M,V,Y),
not X=Y.
oder
istSchwesterVon(X,Y) :weiblich(X),
elternVon(M,V,X),
elternVon(M,V,Y),
not gleich(X,Y).
gleich(A,A).
Aufgabe 1
Es sind weitere Regeln zu definieren:
7
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
a)
istVaterVon(V,K)
b)
istElternteilVon(E,K)
c)
istTanteVon(T,K)
d)
istVorfahrVon(Vor,X).
INFORMATIK
a.hermes
Die Regel bezüglich der Vorfahren führt auf Rekursion: Vor ist ein Vorfahr von X, wenn Vor Elternteil
von X ist, oder wenn es eine Person gibt, deren Elternteil Vorfahr von X ist. Statt Verwendung des
Zeichens “;“für “oder“ können auch beide Regelteile mit gleichem Kopf und durch einen Punkt
getrennt aufgeführt werden.
2.1.3 Backtracking als Methode zur Beantwortung von Fragen
Betrachten Sie die folgende bekannte Wissenbasis und die sich daran anschließende Frage bzw.
Ziel (goal), das erreicht werden soll:
weiblich(wilhelmine).
weiblich(brunhilde).
weiblich(elfriede).
...
elternVon(wilhelmine,fritz,elfriede).
elternVon(wilhelmine,fritz,theresia).
elternVon(brunhilde,heinz,wilhelm).
elternVon(elfriede,anton,maria).
...
?- weiblich(X), elternVon(X,_,wilhelm); elternVon(_,X,wilhelm)).
Man entdeckt unschwer, daß hier nach der Mutter von Wilhelm gefragt ist. Wissensbasen sind
allgemein in Form von Fakten und Regeln deklarativ dargestellt. Wie Prolog allerdings neues Wissen
aus der Wissensbasis herleitet, ist prozedural zu beschreiben, denn bereits die Informationen über die
Reihenfolge der Klauseln innerhalb der Wissensbasis steuern den Herleitungsvorgang. Andere
prozedurale Elemente zeigten sich bereits bei der Negation, weitere, wie der CUT-Operator, werden
folgen.
Prolog durchforstet beim Beweisversuch eines Ziels die Wissensbasis nach der Strategie der
Tiefensuche von oben nach unten und innerhalb eines Regelrumpfes von links nach rechts. Der dafür
zuständige Interpreter geht von der gestellten Frage aus (rückwärtige Verkettungsrichtung) und sucht
in der Wissensbasis eine Klausel, in der die Frage als Kopf, d.h. eventuell als Folgerung erscheint
(weiblich, istSchwestervon :- .. ). Wenn die Voraussetzung erfüllt ist oder es sich lediglich
um einen Fakt handelt, wird die Frage bejaht und eine gegebene Variable zugeordnet bzw. an einen
Wert gebunden (hier z.B. wilhelmine). Der „Ort“ der Bindung, d.h. die entsprechende Klausel, ist
ein sogenannter „Backtrack-Punkt“, wenn zum gleichen Prädikat noch weitere Klauseln existieren,
die noch nicht abgearbeitet worden sind (hier z.B. weiblich(brunhilde)). Im Beispiel scheitern
die Versuche, die weiteren Voraussetzungen mit wilhemine zu beweisen. Nun beginnt eine
Rücksetzung (Backtracking) , die nach dem Misserfolg des Ziels alle Variablenbindungen bis zum
letzten Backtrack-Punkt löst und von da ab weitere Lösungsalternativen verfolgt.
Der Prologinterpreter verkettet rückwärts und sucht in die Tiefe. Rückwärtsverkettung bedeutet,
dass die Ableitung eines Ziels von der gestellten Frage bis zu den Fakten und Regeln der
8
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Wissensbasis führt. Die Suchstrategie ist die Tiefensuche (von links nach rechts und von oben nach
unten) in Verbindung mit Backtracking (Rücksetzung). Backtracking ist die Suche einer
gleichnamigen Klausel, nachdem sich der bisherige Weg als falsch erwiesen hat.
In Kapitel 2.6 wird die Strategie der Vorwärtsverkettung beschrieben. Zu weiteren Strategien, z.B.
Rückwärtsverkettung mit Breitensuche sei auf die Literatur (z.B. [1],[8]) verwiesen.
Betrachten Sie folgende Frage, bzw. Ziel (goal), das erreicht werden soll:
?- weiblich(X), (elternVon(X,_,wilhelm); elternVon(_,X,wilhelm)).
Das Bild auf der nächsten Seite demonstriert, wie Prolog Ziele auf ihre Erfüllbarkeit hin überprüft.
Vorsicht, Endlosschleifen!
Die Art der Interpretation von Prolog kann zu Endlosschleifen führen, obwohl eine Lösung existiert,
wie folgendes Beispiel zeigt:
wetter(schoen) :- gehtSchwimmen(helga).
gehtSchwimmen(helga) :- wetter(schoen).
wetter(schoen).
?- gehtSchwimmen(helga).
Es liegt am Programmentwickler, solche Fälle, evtl. durch Veränderung der Reihenfolge von Klauseln,
zu vermeiden.
9
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
?- weiblich(x), (elternVon(X,_,wilhelm); elternVon(_,X,wilhelm)).
1
weiblich(wilhelmine).
weiblich(brunhilde).
weiblich(elfriede).
......
elternVon(wilhelmine,fritz,elfriede).
elternVon(wilhelmine,fritz,theresia).
elternVon(brunhilde,heinz,wilhelm).
elternVon(elfriede,anton,maria).
......
1. Das erste Ziel ist erreicht (es paßt, engl. to match). X wird mit dem Wert "wilhelmine"
belegt.
2. Es wird versucht, das nächste Ziel zu erreichen (to satisfy the next goal).
?- weiblich(x), (elternVon(X,_,wilhelm);elternVon(_,X,wilhelm)).
1
2
3
weiblich(wilhelmine).
weiblich(brunhilde).
weiblich(elfriede).
......
elternVon(wilhelmine,fritz,elfriede).
elternVon(wilhelmine,fritz,theresia).
elternVon(brunhilde,heinz,wilhelm).
elternVon(elfriede,anton,maria).
......
3. Das zweite Ziel wird nicht erreicht ( engl. fail).
4. Es wird versucht, das dritte Ziel zu erreichen, was ebenfalls scheitert.
5. Backtracking: Durch Anwendung der nächsten Regel erhält X einen neuen Wert
?- weiblich(x), (elternVon(X,_,wilhelm);elternVon(_,X,wilhelm)).
1
weiblich(wilhelmine).
weiblich(brunhilde).
2
weiblich(elfriede).
......
elternVon(wilhelmine,fritz,elfriede).
elternVon(wilhelmine,fritz,theresia).
elternVon(brunhilde,heinz,wilhelm).
elternVon(elfriede,anton,maria).
......
6. Das erste Ziel ist erneut erreicht (es paßt, engl. to match). X wird mit dem Wert
"brunhilde" belegt.
7. Es wird erneut versucht, das zweite Ziel zu erreichen. Dies gelingt im 3. Fakt zum
Prädikat "elternVon".
Übung: Testen Sie die Klausel “istMutterVon“ , und prägen Sie sich die Begriffe wie Fakt, Regel,
Klausel, Backtracking, Tiefensuche und deren Bedeutungen ein!
10
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.2 Arithmetik - Rekursion
2.2.1 Die Türme von Hanoi
Das Problem der Türme von Hanoi wurde im 19. Jahrhundert auch unter dem Namen "Kaiser-Rätsel"
bekannt. Die Aufgabe wurde von einigen Priestern aus der asiatischen Stadt Hanoi erdacht. Um das
Rätsel rankt sich die Geschichte, dass mit seiner Lösung das Ende der Welt unmittelbar bevorstehe.
Das Problem:
Um drei Holzsäulen können goldene Scheiben wie Perlen aufgereiht werden. Zu Beginn sind 64
Scheiben mit absteigendem Durchmesser um Säule 1 gereiht, d.h., die größte Scheibe liegt unten.
Die Aufgabe besteht darin, den Scheibenturm von Säule1 zur 3. Säule unter Zuhilfenahme von Säule
2 zu transportieren. Die Transportbedingungen sind folgende:
- Es darf jeweils nur eine Scheibe zur gleichen Zeit transportiert werden.
- Eine Scheibe darf niemals auf eine kleinere gelegt werden.
Es lässt sich leicht nachweisen, dass zur Verlegung von n Scheiben 2n-1 Transporte einzelner
Scheiben erforderlich sind.
Säule 1
Säule 2
Säule 3
Die Lösung lässt sich umgangssprachlich auf folgende Weise formulieren:
- Das Problem ist gelöst, falls keine Scheibe umzusetzen ist.
- Andernfalls ist der Scheibenturm ohne die untere Scheibe auf den Hilfsplatz (Säule 2) zu verlegen,
die untere Scheibe ist zum Zielplatz zu transportieren und schließlich muss der auf dem Hilfsplatz
befindliche Turm zum Zielplatz gebracht werden.
Die Prolog-Version lautet:
hanoi(Anzahl) :- verlege(Anzahl, eins, zwei, drei).
verlege(0,A,H,Z) :- !.
verlege(K,A,H,Z) :K1 is K - 1,
verlege(K1,A,Z,H),
bewege(K,A,Z),
verlege(K1,H,A,Z).
/* Leerer Turm
--> fertig */
/* Wertzuweisung*/
bewege(N,Von,Nach) :nl, write('Bewege den Ring '), write(N),
11
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
write(' von Platz '), write(Von),
write(' nach Platz '), write(Nach).
Aufruf, z.B.: ?- hanoi(3).
Die erste Regel von verlege ist die Abbruchbedingung. Das Ausrufezeichen (!) unterstreicht den
Abbruch; man bezeichnet es als "CUT". Die Verwendung eines "Cuts" hat u .a. folgende Bedeutung:
Beim Erreichen von ! wird die Suche nach weiteren Alternativen unterbunden.
Die zweite Regel von verlege enthält K1 is K - 1. Das bedeutet: "Falls K1 den Wert von K - 1
hat, ...". Das Prädikat is ist partiell, d.h., dass bei seiner Verwendung das Argument rechts von is
einen Wert haben muss.
X is Ausdruck ist wahr, wenn X zum Wert des arithmetischen Ausdrucks passt (.. mit dem Wert
“matcht“).
In Verbindung mit ganzen Zahlen gelten u.a. folgende Operatoren:
Vergleichsoperatoren
X = Y
die Zahlen X und Y „matchen“
X \= Y
ungleich
X < Y
kleiner
X > Y
größer
X =< Y
kleiner oder gleich
X >= Y
größer oder gleich
Arithmetische Operatoren
X + Y
Summe
X - Y
Differenz
X * Y
Produkt
X / Y
Quotient, ganzzahlig
X mod Y
Modulo
is
wird belegt mit
(Bemerkung: Zur Überprüfung der Wertgleichheit bzw. -ungleichheit arithmetischer Ausdrücke
existieren die Operatoren =:= bzw. =\=)
2.2.2 Weitere Beispiele
Fakultät
faku(0,1) :- !.
/*
faku(N,Ergebnis) :/*
Nvor is N - 1,
/*
faku(Nvor,FakuVor),
/*
Ergebnis is N * FakuVor./*
0 Fakultät = 1, fertig */
Ergebnis gleich N-Fakultät, */
falls Nvor gleich N-1 ist und */
FakuVor gleich Nvor-Fakultät */
Ergebnis gleich N * FakuVor */
Quadratberechnung mit Eingabe (read)
quadrat :- write('Zahl (Ende = 0 ) : '),
read(Zahl), quadrat(Zahl).
quadrat(0) :- !.
quadrat(N) :Q is N * N,
write('Das Quadrat von '), write(N), write(' ist '),
write(Q), nl,
quadrat.
12
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Bemerkenswert ist, dass das Prädikat quadrat unterschiedlich verwandt wird, einerseits ohne,
andererseits mit Parametern. Das Argument 0 kann auch eine Zeichenfolge, z.B. ende oder ein
Zeichen sein.
o
Die Eingabe nach read ist mit einem Punkt abzuschließen.
?- quadrat.
Zahl (Ende = 0 ) : 2.
Das Quadrat von 2 ist 4
Zahl (Ende = 0 ) : 0.
yes
Quadratzahltest (siehe [5])
Eine Zahl Q ist eine Quadratzahl, wenn eine natürliche Zahl n zwischen 1 und Q existiert, deren
Quadrat gleich Q ist.
quadratzahl(Q) :- square(1,Q).
/*es ex. eine Zahl zw. 1 und Q, deren Quadrat = Q */
square(N,Q) :H is N * N,
H > Q, !, fail.
/* Q ist keine Quadratzahl, falls ..
*/
/* Abruch mit FALSE */
square(N,Q) :- Q is N * N.
/* siehe quadrat */
square(N,Q) :N1 is N+1,
square(N1,Q).
/* Test von N+1 */
Cut (!) in Verbindung mit fail signalisiert einen endgültigen Fehlschlag bezüglich des zugehörigen
Prädikats. fail erzwingt Backtracking.
Zählen (siehe [5])
Beim Problem des Zählens wird ein Prädikat gesucht, das als Suchraum eine Teilmenge der natürlichen Zahlen hat. Beginnend mit 1 wird bei jedem neuen Beweis das Argument mit der nächst höheren natürlichen Zahl durchgeführt:
zahl(1).
/* Zählen*/ ?- zahl(N). zahl(N) :zahl(Vor), N is Vor + 1.
N = 1;
N = 2;
....
Aufgabe 2
a) Der Rechner soll von A bis Z aufwärts zählen: zaehle(A,Z)
b) Eine Zahl N ist zu quadrieren: quadrat(N,Q)
c) Es sind Wurzelnachbarn von 0 an aufwärts zu bestimmen.
Wurzelnachbarn sind benachbarte natürliche Zahlen, deren Quadratsummen wieder ein Quadrat
ergeben: n*n + (n+1)*(n+1) = Quadratzahl.
Orientieren Sie sich an den Beispielen Quadratzahltest und Zählen.
13
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.2.3 Gewonnenes Wissen weiterverwenden
Beispiel: Fibonacci
Die ersten Fibonacci-Zahlen lauten: 1 1 2 3 5 8 13 21 34 55 ...
Die ersten beiden Fibonacci-Zahlen sind 1. Die n-te Fibonacci-Zahl ist die Summe ihrer beiden
Vorgängerzahlen.
Eine zweimalige rekursive Bestimmung der Vorgänger führt laufend zur Berechnung von
Zwischenresultaten, die in einem früheren Durchgang bereits berechnet worden sind. Nichts liegt
näher, als die Zwischenergebnisse am Anfang der Wissensbasis als abgeleitete Fakten aufzunehmen, so dass eine erneute Berechnung überflüssig wird.
Das Programm versucht, zunächst die während des Durchgangs gespeicherte Fakten oder Regeln
über die Relation fib heranzuziehen, ehe es zu Klauseln der ursprünglichen Basis greift. Nach
Beendigung des Programms kann man sich mit dem Befehl listing die hinzugewonnenen Fakten
ansehen.
fib(1,1).
fib(2,1).
fib(N,Fib) :N > 2,
N1 is N - 1, fib(N1,Fib1),
N2 is N - 2, fib(N2,Fib2),
Fib is Fib1 + Fib2,
asserta(fib(N,Fib)).
/* besser: asserta(fib(N,Fib) :- !). warum? */
Befehle zur Wissensverwaltung
Mit Hilfe von asserta(Klausel) wird eine Klausel am Anfang der Datenbasis eingefügt,
assertz(Klausel) fügt am Ende ein. assert(Klausel) fügt irgendwo ein, retract(Klausel)
löscht eine Klausel.
Speichern einer Klausel
im Arbeitsspeicher
Auflisten des Programms
listing.
Löschen einer Klausel
retract(Name(Argumente)).
(z.B. retract(fib(_,_)).)
Löschen aller Klauseln zum Namen
retractall(Name(Variablennamen))
assert(Klausel).
Aufgabe 3
Bekanntlich ist 2 die kleinste Primzahl (prim(2)). Eine größere Zahl als zwei ist Primzahl, wenn sie
durch keine kleinere ohne Rest teilbar ist (Rest is Zahl mod Teiler). Entwickeln Sie
entsprechend dieser Definition ein Programm zur Ausgabe aller Primzahlen bis zu einer
vorgegebenen Zahl.
14
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.3 Musterorientierte Wissensrepräsentation (SII)
2.3.1 Symbolisches Differenzieren
Es soll ein Prädikat definiert werden, das genau dann wahr ist, wenn DF die Ableitung von F nach x
ist. In der Mathematik kennt man die Schreibweise dF/dx = f', in Worten: dF nach dx gleich f Strich.
So ist z.B. d(x2-2*x) / dx = 2*x - 2. Im Folgenden gelte die Vereinbarung, dass immer nach der
Variablen x abgeleitet werde. In Prolog müssen die Bezeichnungen von Termen ein wenig anders
gewählt werden als in der Mathematik:
Mathematischer Term
Konstante c
x
f+g
f-g
f*g
f/g
(f hoch Konstante)
fc
Prolog-Term
k(c)
x
F + G
F - G
F * G
F / G
ln(f)
hoch(F, k(c))
ln(F)
exp(f)
exp(f)
DF = df / dx (f nach x abgeleitet)
(DF = f')
dx(F, DF)
Konstanten müssen zur Unterscheidung von sonstigen Termen als Funktionen (k) gekennzeichnet
werden. Die mathematischen Ableitungsregeln werden in Prolog in folgender Weise als Klauseln
formuliert:
15
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Mathematische Regeln
Prolog-Klauseln
c' = dc/dx = 0
dx(k(C),k(0)).
x' = dx/dx = 1
dx(x,k(1)).
(f+g)' = f'+g'
dx(F + G, DF + DG) :- dx(F,DF),dx(G,DG).
(f-g)' = f'-g'
dx(F - G, DF - DG) :- dx(F,DF),dx(G,DG).
(c*f)' = c * f'
dx(k(C) * F, k(C) * DF) :- dx(F,DF).
(f*g)' = f*g' + g*f'
dx(F * G,F * DG + G * DF) :- dx(F,DF),dx(G,DG).
(f/g)' = (f'*g-f*g')/g2
dx(F / G,(DF * G - F * DG) / hoch(G,k(2))) :dx(F,DF), dx(G,DG).
(fc)' = c*fc-1*f'
dx(hoch(F,k(C)),k(C) * hoch(F,k(C -1)) * DF)
:- dx(F,DF).
ln'(f) = (1/f)*f'
dx(ln(F), hoch(F,k(-1)) * DF) :- dx(F,DF).
exp'(f) = exp(f) * f'
dx(exp(F), exp(F) * DF) :- dx(F,DF).
Musterorientierung bedeutet in diesem Zusammenhang, dass die Köpfe der Klauseln bereits die
Muster enthalten, nach denen sie bearbeitet werden. Auf diese Weise wird hier wird „Backtracking“
vermieden.
Ein Aufruf zur Berechnung der Ableitung von z.B. 5x2 lautet:
?- dx(k(5) * hoch(x,k(2)), DF).
Prolog gibt das Ergebnis 10*x = 10 * (x*1) in folgender Form aus:
DF = k(5) * (k(2) * hoch(x,k(2 - 1)) * k(1))
2.3.2 Konstanten und Operatoren
Das Beispiel ist in mancher Hinsicht noch unbefriedigend und kann möglicherweise in der
Konstantennotation, der Notation bei Potenzen und in der Termvereinfachung verbessert werden
(siehe z.B. W.Hanus, Problemlösen mit Prolog, Teubner , Seite 198).
Konstanten - Das Prädikat integer
Die Aussage integer(C) ist wahr, wenn C eine ganze Zahl repräsentiert. Die Prolog-Klauseln zum
Differenzieren lassen sich auf folgende Art ändern:
dx(k(C),k(0)).
k(C-1)...
==>
==>
dx(C,0) :- integer(C).
C1 ....
:- integer(C), C1 is C-1.
Definition von Operatoren - op
Die prozedurale Schreibweise hoch(A,C) ist gewöhnungsbedürftig. Angenehmer erscheint die
alternative Verwendung eines dyadischen Operators, z.B. ^, dessen linker Operand die Basis und
dessen rechter den Exponenten darstellen: A^C für A hoch C. Die Festlegung erfolgt zu Beginn in
Form eines Ziels:
?- op(100,yfx,'^').
Die Zahl 100 gibt den Rang im Vergleich zu anderen Operatoren an. Der Rang von “+“ ist z.B. 500,
der von “*“ ist 400. Da das Potenzieren stärker bindet als die Multiplikation, ist der entsprechende
Operator mit einer niedrigeren Rangzahl zu belegen.
16
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
yfx steht für Linksassoziativität, d.h. a ^ b ^ c wird interpretiert als (a ^ b) ^ c.
Das Operatorzeichen bildet das dritte Argument von op.
Manche Prologversionen erlauben auch die Definition von Operationen in der Datenbasis, z.B.
:- op(100,yfx,'^').
Aufgabe 4
Führen Sie im Programm “Symbolisches Differenzieren“ die Operatornotation “^“ zur Kennzeichnung
von Exponenten ein, und testen Sie das Programm:
?- op(100,yfx,'^').
?- dx(x ^2,H).
H = 2 * x ^ 1 * 1
?- dx(-x,Dx).
no
(Für -x fehlt eine Regel, sie soll hier auch nicht formuliert zu werden.)
2.3.3 Termvereinfachung *
Die Vereinfachung von Termen kann nur sehr bescheiden ausfallen, wenn nicht die Termstruktur
samt Vorrangregeln, z.B. unter Verwendung eines Strukturbaumes, einfließt. Gewisse
Vereinfachungen, etwa durch Anwendung von Assoziativgesetzen, lassen sich allerdings auch ohne
Verwendung von Bäumen realisieren, wie folgender Ansatz zeigt:
vereinfache(F + G,E) :- vereinfache(F,Fneu),
wendeRegelan(Fneu +
vereinfache(F - G,E) :- vereinfache(F,Fneu),
wendeRegelan(Fneu vereinfache(F * G,E) :- vereinfache(F,Fneu),
wendeRegelan(Fneu *
vereinfache(F / G,E) :- vereinfache(F,Fneu),
wendeRegelan(Fneu /
vereinfache(F ^ G,E) :- vereinfache(F,Fneu),
wendeRegelan(Fneu ^
vereinfache(F,F).
vereinfache(G,Gneu),
Gneu,E).
vereinfache(G,Gneu),
Gneu,E).
vereinfache(G,Gneu),
Gneu,E).
vereinfache(G,Gneu),
Gneu,E).
vereinfache(G,Gneu),
Gneu,E).
wendeRegelan(F,E) :- regel(F,H), vereinfache(H,E).
wendeRegelan(F,F).
regel(C * (K * F), E) :- /* Assoziativgesetz für die Multiplikation */
integer(C), integer(K), H is C * K, wendeRegelan(H * F,E).
regel(F * 1,F) :- !. regel(F * 0,0) :- !. regel(F + 0,F) :- !.
regel(F - 0,F) :- !. regel(F / 1,F) :- !.
regel(F ^ 1,F). regel(F ^ 0,1).
regel(C1 + C2, C) :- integer(C1), integer(C2), C is C1 + C2.
regel(C1 - C2, C) :- integer(C1), integer(C2), C is C1 - C2.
regel(C1 * C2, C) :- integer(C1), integer(C2), C is C1 * C2.
regel(C1 / C2, C) :- integer(C1), integer(C2), C is C1 / C2.
?- vereinfache(3 * 5 * 10, E).
E = 150
17
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
?- dx(x ^ 1 + 2 * x ^ 2 + 3,H), vereinfache(H,E).
H = 1 * x ^ 0 * 1 + 2 * (2 * x ^ 1 * 1) + 0,
E = 1 + 4 * x
Schwächen und Grenzen der Lösung
Die Einbringung von Assoziativgesetzen (s. o.), Kommutativ- und Distributivgesetzen führt lediglich
unter günstigen Voraussetzungen zu verkürzten Termen. Die Vereinfachungen und Ableitungsregeln
funktionieren nicht, wenn Vorzeichen verwendet werden (z.B. dx(-x,T)), da für diesen Fall keine
Ableitungsregeln formuliert sind. Es wird nicht immer nur eine Lösung ausgegeben. Die
Vereinfachungsregeln können beliebig erweitert werden, erwarten Sie von dem Lösungsansatz aber
keine Wunder!
18
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.4 Der Datentyp Liste
a
[
b
head
c
d
e
f
g
| ---------------------------- tail --------------------------------- ]
2.4.1 Definition
Listen sind Datenstrukturen, die umgangssprachlich als Folgen von Objekten beschrieben werden
können. Listen spielen eine fundamentale Bedeutung im Bereich der abstrakten Datentypen. Eine
Möglichkeit der Definition einer Liste in Prolog ist folgende:
Eine Liste ist
- die leere Liste, dargestellt durch das Atom [] oder
- eine Struktur mit den zwei Komponenten „Head“ und „Tail“:
Head ist das erste Element der Liste (kann auch eine Liste sein),
Tail ist der Rest der Liste, muss eine Liste sein.
Äußere Erscheinungsbilder von Listen haben folgende Formen:
- [Element1, Element2, ...]
- [Element1 | Restliste]
- [Element1, Element2,....| Restliste]
Listenkopf und -rest werden durch einen senkrechten Strich (ASCII 124) getrennt, Listenelemente
durch ein Komma.
Beispiele: [a,b,c] = [a|[b,c]] = [a,b|[c]] = [a,b,c|[]]
2.4.2 Grundoperationen
1. Mitgliedschaft
Ein Element X ist in einer Liste L enthalten, wenn
(1) X der Kopf der Liste ist oder
(2) X im Rest der Liste vorkommt.
enthalten(X,[X|L]).
enthalten(X,[Y|R]) :enthalten(X,R).
/* enthalten(X,[X|_]).
/* enthalten(X,[_|R]) :/*
enthalten(X,R).
*/
*/
*/
?- enthalten(X,[a,b,c,d]).
X = a
more?
2. Ein Element anhängen
19
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
haengean(X,[],[X]).
haengean(X,[Y|Rest],[Y|Rest_mit_x]) :haengean(X,Rest,Rest_mit_x).
?- haengean(a,[d,c,b],Neu), haengean(x,Neu,L).
Neu = [d,c,b,a]
L = [d,c,b,a,x]
3. Zwei Listen verketten
(1) Falls die erste Liste leer ist, ist das Ergebnis der Verkettung die zweite Liste,
(2) andernfalls hat die erste Liste einen Kopf X und einen Rest R.
Das Ergebnis der Verkettung hat ebenfalls X als Kopf. Der Rest E besteht aus der Verkettung des
Restes der ersten Liste und der zweiten Liste.
verkette([],L,L).
verkette([X|Rest],L,[X|E] ):verkette(Rest,L,E).
?- verkette([a,b],[a,1,2],X).
?- verkette([a,b],[a,[auto],1,[],2],X).
X = [a,b,a,1,2]
X= [a,b,a,[auto],1,[],2]
4. Ein Element löschen
Das Prädikat loesche enthält die drei Argumente: das zu entfernende Element, die zu bearbeitende
Liste und die Ergebnisliste. Folgende Fälle sind zu unterscheiden:
(1) Aus einer leeren Liste ist nichts zu löschen
(2) Ist das Element der Kopf der Liste, bleibt der Rest
(3) Anderenfalls ist das Element im Rest zu löschen
loesche(X,[],[]).
/* loesche(_,[],[]). */
loesche(X,[X|Tail],Tail) :- !.
loesche(X,[Head|Tail],[Head|Result]):!,loesche(X,Tail,Result).
Aufgrund der Cuts wird nur das erste gefundene Exemplar des zu löschenden Elementes aus der
Liste entfernt. Bei fehlenden Ausrufezeichen wird „Backtracking“ nicht verhindert, man erhält
alternative Lösungen, z.B.:
?- loesche(a,[a,b,a],Z).
Z = [b,a];
Z = [a,b];
no
/* ohne ! */
?- loesche(a,L,[1,2]).
L = [a,1,2];
L = [1,a,2];
....
Auf diese Weise kann das Löschen zum Einfügen umdefiniert werden:
20
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
fuegeein(X,L,LmitX) :- loesche(X,LmitX,L).
Zur Vermeidung von Nebeneffekten empfiehlt sich allerdings folgende Definition:
fuegeein(X,[],[X].
fuegeein(X,L,[X|L]).
Aufgabe 5
a) Es sind Prädikate zu definieren
- zum Löschen aller Erscheinungen eines Elementes in einer Liste
- zur Bestimmung der Anzahl der Listenelemente
- zur Umkehrung der Reihenfolge der Listenelemente
- zur Erzeugung von Permutationen mit Hilfe von Backtracking:
?- permutation([a,b,c],P).
P = [a,b,c];
P = [a,c,b];
P = [b,a,c];
....
b) X ist Element einer Liste, wenn X gelöscht werden kann. Ma erstelle ein entsprechendes
alternatives Prädikat istElement.
c) Man implementiere die Menge mit folgenden Operationen:
- empty(M)
leere Menge, Erzeugung und Abfrage
- memb(X,Menge)
ist X in der Menge enthalten?
- insert(X,M,R)
R = M vereinigt {X}
- delete(X,M,R)
R = M \ {X}
- union(M,N,R)
R = M vereinigt N
- intersect(M,N,R)
R = M geschnitten N
Zu Aufgabe 5 c:
Die Eingabe einer Menge kann z.B. auf folgende Weise organisiert werden:
ein(N,M,S) :write(N),
write('. Element: '), read(A),
A \= 0,
insert(A,M,R),
N1 is N + 1,
ein(N1,R,S), !.
ein(_,M,M).
getset(S) :write('Mengeneingabe (0 = Ende)'),nl,
empty(X),
21
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
ein(1,X,S).
?- getset(Menge).
Mengeneingabe (0 = Ende)
1. Element: 1.
2. Element: a.
3. Element: 2.
4. Element: 0.
Menge = [2,a,1]
2.4.3 Sortieren
Beispiel: Sortieren durch Mischen
Von imperativen Programmiersprachen, wie Pascal, ist man gewohnt, zur Lösung eines Problems
diejenigen Operationen zu finden, die nacheinander auszuführen sind. Das folgende Bild demonstriert
das Lösungsverfahren an einem kleinen Beispiel :
7
5
3
1
2
Sortieren
Teilen
5
3
7
1
Sortieren
2
Sortieren
Teilen
Nicht
ausgeführt
7
2
Mischen
1
3
2
5
7
Mischen
1
2
3
5
7
Diesem Ansatz folgend lautet die Lösungsbeschreibung:
1) Teile die Liste L in zwei Teillisten etwa gleicher Größe
2) Sortiere die beiden Teillisten L1 und L2 mit den Ergebnissen S1 und S2
3) Mische S1 und S2 nach vorgegebenem Ordnungskriterium mit dem Ergebnis L
Im deklarativen Sinne (von Prolog) genügt folgende Aussage:
Eine Folge gilt als sortiert, wenn sie als eine nach einem Ordnungskriterium gemischte Liste zweier
sortierter Teilfolgen (am besten etwa gleicher Länge) aufgefasst werden kann. Leere und
einelementige Folgen gelten als sortiert.
22
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Beim Teilen orientiere man sich an dem Verfahren kleiner Kinder zum Aufteilen z.B. von Murmeln: „
Eine für mich, eine für dich, eine für mich, eine für dich ...“ Der Lösungsansatz lautet in Prolog:
mischsort([],[]). /* Leere Listen gelten als sortiert */
mischsort([X],[X]).
/* Einelementige Listen sin sortiert */
mischsort(L,Sortiert) :geteilt(L1,L2,L),
mischsort(L1,S1),
mischsort(L2,S2),
gemischt(S1,S2,Sortiert).
/* Aufgabe 6a*/
geteilt([],[],[]).
geteilt([X],[],[X]).
geteilt([X|L1],[Y|L2],[X,Y|L]) :- geteilt(L1,L2,L).
Eingabebeispiel:
?- mischsort([3,9,6,1,4,5,3],M).
M = [1,3,3,4,5,6,9]
Aufgabe 6
a) Vervollständige die Beschreibung des Mischsortierens um das Prädikat gemischt!
Eingabebeispiel:
?- gemischt([1,5,5,6,8],[3,4],M).
M = [1,3,4,5,5,6,8]
b (SII)) Das folgende Programm sortiert entsprechend dem bekannten Quicksortverfahren
Zahlenfolgen in aufsteigender Form. Beschreiben Sie das Verfahren in Anlehnung an das
Prologprogramm in Worten, so dass es sich rekonstruieren läßt.
quicksort(Folge, Sortiert) :- quicksort(Folge, Sortiert,[]).
quicksort([V|Rest],Sortiert, Teil) :zerlege(V,Rest,F1,F2), quicksort(F2,R1,Teil),
quicksort(F1,Sortiert,[V|R1]).
quicksort([],F,F).
zerlege(V,[X|L],[X|L1],L2) :- X =< V, !, zerlege(V,L,L1,L2).
zerlege(V,[X|L],L1,[X|L2]) :- zerlege(V,L,L1,L2).
zerlege(_,[],[],[]).
sort(A)
:- quicksort([5,6,1,0,8,2,1,9,3,2,6,4],A),nl.
23
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.5 Erweiterte Verwendung von Listen
2.5.1 Listenoperationen - der funktionale Aspekt
Bei der Anwendung von Operationen auf Listen entstehen jeweils neue Listen mit neuen Namen, wie
z.B. fuegean(alpha,L1,L). Der Versuch eines Beweises der Form fuegean(alpha,X,X) führt
zur Antwort no, denn X kann nicht gleichzeitig mit verschiedenen Werten belegt sein.
Mit Blick auf die Programmiersprache Pascal findet man in der funktionalen Definition von
Datenstrukturen eine äquivalente Form zu fuegean(alpha,L1,L), etwa
L := fuegean ('alpha',L1) mit L, L1 vom Typ Liste.
Der Typ Liste ist beispielsweise als Zeiger auf einen Speicherbereich zu definieren.
2.5.2 Listen als Fakten
Listen können bereits in der Datenbasis in Form von Fakten vorliegen, z.B. mit den Prädikatsnamen
l1 und l2.
l1([2,23,45]).
l2([1,2,merkur]).
insert(X,[],[X]).
insert(X,L,[X|L]).
?- l1(X),insert(hermes,X,Liste),assert(l3(Liste)).
X = [2,23,45]
Liste = [hermes,2,23,45]
?- l3(Z).
Z = [hermes,2,23,45]
Die Wissensbasis ist um das Prädikat l3([hermes,2,23,45]) ergänzt worden, wie man sich
auch durch den Aufruf „listing“ überzeugen kann.
24
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.5.3 Terme als Listen, Operatoren als Argumente
Terme können mit Hilfe von read eingelesen und in eine Liste umgewandelt werden. Der
Hauptfunktor steht im Listenkopf, die beiden Argumente folgen in der richtigen Reihenfolge. Als
Vergleichszeichen dient =..
?- read(Term), Term =.. Liste.
2 + 3 * a.
Term = 2 + 3 * a
Liste = [+, 2, 3*a]
Ein in einer Liste abgelegter Ausdruck läßt sich beweisen. Der Aktivierung dient das Prädikat call.
?- Ausdruck =.. [is,Y,3*5], call(Ausdruck).
Ausdruck = 15 is 3 * 5
Y = 15
Übung (Selbsttest)
Die Anwendung eines beliebigen zweistelligen Operators auf alle Elemente einer Liste (engl.
mapping) führt zu einer zweiten Liste: wendean(Operator,Liste1,Liste2). Die zweite Liste
enthalte beispielsweise die Beträge (abs) oder Quadrate (quadrat) aller Zahlen der ersten Liste,
wenn es sich um Zahlen handelt, ansonsten unterscheide sie sich nicht von der ersten.
Im Falle der Liste liste([3,4,merkur,-2,0]) seien folgende Anfragen mit den entsprechenden
Antworten möglich:
?- liste(X), wendean(abs,X,A), wendean(quadrat,X,Q).
X = [3,-4,merkur,-2,0]
A = [3,4,merkur,2,0]
Q = [9,16,merkur,4,0]
Teillösung
liste([3,-4,merkur,-2,0]).
abs(X,Y) :- X < Y, Y is -X, !.
abs(X,X).
/* X < 0, Y is -X, !. */
quadrat(X,X) :- not integer(X).
quadrat(X,Y) :- Y is X * X.
wendean(Op,[],[]).
wendean(Op,[X|R1],[Y|R2]):T =.. [Op,X,Y],
......................
/*T = X Op Y */
Aufgabe 7
a) Vervollständigen Sie die Klausel wendean (s.o), und testen Sie das Programm!
25
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
b) Die Funktion filter entfernt alle Elemente einer Liste, die nicht einem bestimmten Prädikat P (z.B.
„ist eine Zahl“) genügen. Die rekursive Definition lautet in funktionaler Schreibweise:
filter(P,[])
= []
filter(P,[X|Xs] = [X| filter(P,Xs)], falls P(X) erfüllt ist
= filter[P,Xs], sonst.
Leiten Sie ein entsprechendes Prädikat filter in Prolog her!
2.6 Kontrollstrategien
Man versteht unter einer Inferenzmaschine ein Modell zur Simulation menschlichen Schließens bzw.
zur Darstellung des Prozesses des logischen Folgerns. Inferenz- (Schließ-) und Kontrollstrategien
basieren auf dem Ansatz der Trennung von Information und dem Mechanismus des Schließens.
Typische Kontrollstrategien sind die Rückwärts- und Vorwärtsverkettung. In Prolog ist die
Rückwärtsverkettung (backtracking) als Beweisstrategie bereits eingebaut, beginnend mit der
Behauptung arbeitet sich das System rückwärts durch die untergeordneten Ziele durch. Am Beispiel
“Wegesuche in Graphen“ lassen sich beide Verfahren gegenüberstellen:
D
F
C
B
E
A
kante(a,c).kante(a,b).kante(c,b).kante(b,d).kante(d,f).kante(d,e).
2.6.1 Rückwärtsverkettung
Die Strategie lautet:
Falls es keinen direkten Weg vom Start- zum Zielpunkt (A,Z) gibt, wähle man einen Zwischenpunkt
H, von dem aus ein Weg zum Ziel führt und suche einen Weg zum Zwischenpunkt.
Folgendes Bild verdeutlicht das Verfahren:
A
H
Z
Die entsprechende Strategie formuliert sich in Prolog auf folgende Weise:
weg(A,Z) :kante(A,Z),
write('Fahre von '), write(A),
write(' nach '), write(Z),nl.
weg(A,Z) :-
26
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
kante(H,Z), weg(A,H),
write( ' und von '), write(H),
write(' nach '), write(Z),nl.
Die vorliegende Lösung bietet grundsätzlich keinen Schutz vor unendlichen Zyklen. Im folgenden
Lösungsansatz wird dieser Nachteil durch Verwendung der Prolog-Datenbasis als „Merkzettel“
behoben.
2.6.2 Vorwärtsverkettung
Die Strategie lautet:
Man gehe zu einen geeigneten Nachbarn des Startpunktes, und suche das Ziel von dort aus!
Der Algorithmus schützt nicht vor Zyklen, also davor, immer im Kreis zu gehen.
Um Zyklen zu vermeiden, werden beim Suchvorgang alle beschrittenen Wege in der Wissensbasis
aufgenommen.
Die Suche beginnt mit dem Aufruf des Prädikats run(a,e). Nach erfolgreicher Suche lässt sich mit
Hilfe von listing lässt sich nachsehen, welche Routen in die Wissensbasis eingetragen worden sind.
Das folgende Bild veranschaulicht das Suchverfahren:
A
H
Z
Das entsprechende Prologprogramm lautet:
versucht(x,x).
/* Initialisierung */
weg(A,Z) :kante(A,Z),
asserta(route(A,Z)). /* Speichern des Wegstückes*/
weg(A,Z) :weg(A,H),
not versucht(A,H),
assertz(versucht(A,H)), /* Speichern des Versuchs */
weg(H,Z).
wegausgabe(A,Z) :route(A,Z),
write('Von '),write(A),
write(' nach '), write(Z), nl.
wegausgabe(A,Z) :route(A,H),
27
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
write('Von '), write(A),
write(' nach '), write(H),nl,
wegausgabe(H,Z).
run(A,Z) :weg(A,Z), wegausgabe(A,Z).
Übung
Analysieren und teste das Programm!
Bemerkung: Durch Erweiterung des Programms um das Prädikat loesche
Wissensbasis wieder in den Urzustand überführen:
lässt sich die
loesche :repeat, ((retract(versucht(_,_)),fail) ; !),
repeat, ((retract(route(_,_)), fail); !).
28
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.6.3 Schatzsuche
Circus
Garten
Eingang
Dom
Schlangengrube
Quelle
Drachen
Ausgang
Schatz
In einem Höhlensystem ist ein Schatz verborgen. Dieser ist vom Eingang aus zu suchen und zum
Ausgang zu transportieren. Es gibt zwei gefährliche Plätze namens „Drachen“ und „Schlangengrube“.
Diese müssen unter allen Umständen gemieden werden. Falls der Ausgang ohne erfolgreiche
Schatzsuche erreicht wird, ist von dort aus erneut zu suchen. Es sind a) ein b) alle möglichen Wege
zu bestimmen. Um Kreise zu vermeiden, sind bereits besuchte Höhlenräume im Gedächtnis zu
behalten, das mit Hilfe einer Liste zu realisieren ist.
Lösungsidee
Das Höhlensystem lässt sich durch die Angabe der Verbindungen und der zu vermeidenden Räume
charkterisieren. Man beachte, dass eine Verbindung keine Einbahnstraße ist.
(1) Verbindungen sind als Fakten mit dem Prädikatsnamen verbindung darzustellen.
(2) Plätze oder Hallen liegen benachbart (benachbart(X,Y)), wenn eine Verbindung zwischen
ihnen besteht.
(3) Drachen und Schlangengrube sind zu vermeiden:
meide([drachen, schlangengrube]).
(4) Bei der Wegesuche sind Kreise zu vermeiden. Zur Vorsorge wird eine Liste bereits besuchter
Plätze angelegt, dazu gehört auf alle Fälle der jeweilige Startpunkt. Die richtige “Route“ ist
diejenige, welche den Startpunkt nicht mehrmals enthält (gehe(Von,Nach)
:weg(Von,Nach,[Von]).).
Die Abfrage beginnt mit : ?- gehe(eingang,ausgang).
(5) Das Erreichen des Ausgangs ist erfolgreich, wenn die Schatzkammer auf der Liste der
besichtigten Räumen steht (weg(ausgang,ausgang,Raumliste) :- ...). Nun kann die
Liste der besuchten Plätze bzw. Räume ausgegeben werden.
29
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
(6) In allen anderen Fällen führt der Weg über einen Nachbarraum, der nicht zu den gefährlichen
Räumen gehört, die zu meiden sind und noch nicht besucht worden ist (weg(Platz, Ausgang,
Raumliste) :- ...).
(7) Ein Element ist in einer Liste enthalten, wenn es mit dem Listenkopf übereinstimmt oder im Rest
der Liste enthalten ist (enthalten).
(8) Bei der Ausgabe der Raumliste ist zu beachten, dass sie umgekehrt ausgegeben werden muss,
das Ziel steht am Anfang (zeigeliste(L) ...)!
Lösungsanfang
verbindung(eingang,dom).
verbindung(eingang,drachen). /*1 */
verbindung(dom,circus). verbindung(dom,garten).
verbindung(dom,quelle). verbindung(dom,schlangengrube).
verbindung(drachen,schatz). verbindung(quelle,schatz).
verbindung(schatz,ausgang). verbindung(garten,schlangengrube).
verbindung(garten,schatz).
verbindung(garten,ausgang).
verbindung(schlangengrube,ausgang).
benachbart(X,Y) :- verbindung(X,Y) ; verbindung(Y,X). /* 2 */
Aufgabe 8
Löse die Schatzsuche in Anlehnung an das beschriebene Verfahren.
2.6.4 Graph als Funktor*
Ein Graph kann als Paar von zwei Mengen beschrieben werden, der Menge von Knoten und der
Menge von Kanten. In gewichteten Graphen werden den Kanten Bewertungen (Kosten) zugeordnet.
Alternativ zur Definition durch Fakten besteht die Möglichkeit, den Graph mit Hilfe eines Funktors wie
z.B. graph zu spezifizieren.
Beispiel:
graph([a,b,c,d,e,f],[k(a,c,3),k(a,b,6),k(c,b,4),k(b,d,3),k(d,f,4,
k(d,e,5),k(e,f,3)]).
4
D
C
4
3
A
3
B
6
F
3
5
E
Es ergeben sich Aufgabenstellungen, wie die Suche nach Verbindungen mit minimalen Kosten
zwischen zwei Knoten oder kürzeste Wege in Graphen.
30
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
2.7 Ein einfacher Interpreter mustergesteuerter Programme*
Von Pascal her ist das Verfahren bekannt, dass sich Module oder Prozeduren gemäß einer explizit
festgelegten Vorschrift bzw. eines vordefinierten Schemas aufrufen. Jedes Modul entscheidet,
welches andere es aufruft. Der entsprechende Kontrollfluss ist deterministisch, d.h. zu jeder
Programm- und Speichersituation gibt es (höchstens) genau eine Folgesituation.
Mustergesteuerte Programme zeichnen sich einerseits durch einen möglichen Nichtdeterminismus
aus, die Besonderheit liegt aber vor allem im Mechanismus des Aufrufs von Programm-Modulen, die
nicht direkt, sondern aufgrund von Prädikatsmustern im aktuellen Datenraum (z.B. der Wissensbasis)
aktiviert werden. Das Beispiel “Symbolisches Differenzieren“ vermittelte einen Eindruck von
musterorientierter Wissensrepräsentation, ähnlich lassen sich Bedingungsmuster (Wenn-Dann-Bedingungen) definieren.
Die entsprechenden Regeln sind charakterisiert durch:
(1) ein Vorbedingungsmuster und
(2) eine Aktionsfolge, die ausgeführt wird, wenn das Muster passt bzw. die Vorbedingung erfüllt ist.
Beispiel GGT
(siehe auch [1], Bratro, Seiten 424 ff)
Der größte gemeinsame Teiler zweier Zahlen a und b ggt(a,b) ist nach Euklid gleich
ggt(a,b) =
ggt(b,a) , falls a < b,
ggt(a - b, b)
, falls a > b,
a
sonst.
Der entsprechende mustergesteuerte Ansatz lautet:
Regel 1
Bedingung:
Aktion:
Die Wissensbasis enthält zwei Zahlen a und b, mit a > b
Ersetze in der Wissensbasis a durch a-b
Regel 2
Bedingung:
Aktion:
Die Wissensbasis enthält eine Zahl
Gib die Zahl aus und beende alle Aktionen
Hier tritt aufgrund eines scheinbaren Nichtdeterminismus deutlich ein Konflikt zutage, denn jedes Mal,
wenn die Bedingung in Regel 1 erfüllt ist, trifft dies auch für Regel 2 zu. Für eine Konfliktlösung sorgt
die Kontrollregel, dass Regel 1 immer Regel 2 vorgezogen wird, d.h. in Prolog ist die Reihenfolge der
Definitionen entscheidend.
31
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Die Kontrolle des Programmierers reduziert sich in diesem sehr einfachen Fall auf die Anordnung der
Regel. Das Prologsystem verwendet als Kontrollmechanismus die Rückwärtsverkettung, also die
Technik, die Behauptung durch rückwärtiges Beweisen der Teilziele (subgoals) zu beweisen.
Für die Auswahl des Kontrollmechanismus ist der sog. “Planer“ (Scheduler) zuständig. Er bildet
zusammen mit dem Regelinterpretierer das Kernstück einer Inferenzmaschine, einer Maschine zur
Simulation von menschlichen Denkprozessen bei der Lösung abstrakter Probleme.
Beispiel: Die Wissensbasis enthalte die Zahlen 18, 12 und 21.
18
6
6
6
6
3
12
12
6
6
6
6
21
21
21
3
3
Die Zahlen in Konturschrift weisen auf die jeweiligen Änderungen in der Wissensbasis hin. Die
Wissensbasis enthält am Schluss dreimal die gleiche Zahl, den ggT. Das Beispiel demonstriert wie
der Lösungsansatz nicht nur den größten gemeinsamen Teiler zweier Zahlen, sondern beliebig vieler
Zahlen bestimmt.
Am Anfang enthält die Wissensbasis die Fakten:
zahl(18).
zahl(12).
zahl(21).
Prolog bietet die Möglichkeit, Fakten oder Regeln in einer Liste zu sammeln und sie der Reihe nach
zu beweisen oder auch “aufzurufen“ (call(Klausel), s.u.). Man packe also die jeweiligen Bedingungen
in eine Liste, ebenso die resultierenden Aktionen. Eine Liste von Bedingungen impliziert eine
Aktionsliste und damit eine Menge von Zielen, die erfüllt werden, wenn die Vorbedingungen stimmen.
Als Folgerungszeichen verwende man “==>“.
Allgemein:
Bedingungsteil ==> Aktionsteil
wird überführt in:
[1.Bedingung, 2.Bedingung ...] ==> [1.Aktion, 2.Aktion,...]
In Worten: Falls alle in der Liste vermerkten Bedingungen erfüllt sind, werden sämtlichen Aktionen
ausgeführt.
Produktionsregeln zum Finden des ggT:
[zahl(A),zahl(B),A > B] ==>[C is A - B,ersetze(zahl(A),zahl(C))].
[zahl(A)]
==>[write('ggt = '),write(A), nl, ende].
Prädikate, wie ersetze oder das Atom ende seien dem Regelinterpretierer des mustergesteuerten
Programms vorbehalten. Seine Aufgabe ist der Prozess des Schließens (Inferierens) auf Basis der
formalen Logik. Durch Anwendung einfacher “Wenn-Dann-Regeln“ auf bekannte Fakten führt er die in
32
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
den Regeln festgelegten Aktionen aus. Dabei hat er die Möglichkeit des Zugriffs und der Manipulation
der Daten- und der Wissensbasis.
:- op(800, xfx, ==>).
/*In Fix-Prolog nur als Ziel eingeben: ?- op(800, xfx, ==>). */
interpretiere :Bedingung ==> Aktionsfolge,
pruefe( Bedingung),
veranlasse( Aktionsfolge).
pruefe([]).
/*die leere Bedingung ist immer erfüllt*/
pruefe([Bed1 | Weitere]) :/* konjunktive Bedingungen*/
call(Bed1),
/* prüfe Bed1 */
pruefe(Weitere).
veranlasse([ende]) :- !.
/* Ende der Ausführungen */
veranlasse([]) :interpretiere.
/* keine Aktion, nächste Regel */
veranlasse( [Aktion1 | Rest]) :call(Aktion1),
/* Aktiviere Aktion1 */
veranlasse( Rest).
/* Manipulationsmöglichkeit(en) der Datenbasis */
ersetze( A,B) :retract( A),
!,
/*! heißt: nur ein Element löschen */
assert(B).
Klauseln, die in Programmen aufgerufen werden, müssen in vielen Prolog-Implementationen mit Hilfe
des Prädikats call aktiviert werden: call(Klausel).
Analyse des Beispiels
Prinzipiell könnten auch mehrere Module aufgrund eines Vorbedingungsmusters gleichzeitig aktiviert
werden. Es handelt sich hier also um ein natürliches Modell paralleler Prozesse. Es ist sogar
grundsätzlich möglich, einige Module zu entfernen oder nachträglich hinzuzufügen, ohne dass das
System zusammenbricht, lediglich die Art des Problemlösens könnte sich ändern, denn die Module
ändern nicht die Steuerung, nicht die dafür zuständigen Muster.
Bei Systemen mit komplexen Wissensbasen lassen sich kaum von vornherein alle möglichen
Interaktionen zwischen den einzelnen Wissenteilen vorhersagen. Es erweist sich als günstiger,
“Wenn-Dann-Regeln“ selbst als mustergesteuerte Module zu betrachten.
Bei paralleler Verarbeitung ergibt sich folgender Zyklus:
33
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
(1) Suche in der Wissensbasis alle Fakten, welche ein Bedingungsmuster erfüllen. Die Menge aller
daraus resultierenden Aktionen bilden die Konfliktmenge. Man nennt den Vorgang “Pattern
Matching“ (Prüfen, ob das Muster passt).
(2) Alle Aktionen sind auszuführen, d.h. die entsprechenden Module sind zu aktivieren.
Bei Systemen mit traditionellen, sequentiell arbeitenden Prozessoren muss vor Ausführung der
Aktionen eine sog. Konfliktauflösung stattfinden. Die Zuständigkeit hat eine Steuerkomponente,
welche die Auswahl von Modulen übernimmt. Prolog löst den Konflikt durch jeweilige Wahl des zuerst
auftretenden Moduls. Der Nichtdeterminismus äußert sich darin, dass prinzipiell irgendein passender
Modul aufgerufen werden kann.
Man verwechsle Determinismus nicht mit Determinierung, bzw. dem selbständigen Abbruch einer
Anweisungsfolge nach endlich vielen Schritten.
Aufgabe 9
a) Füge im Beispiel ggT (siehe Seite 24) zwischen den Regeln 1 und 2 folgende Regel 1-2 ein,
erläutere die Bedeutung, und teste das entsprechende Prologprogramm:
Regel 1-2
Bedingung:
Aktion:
Die Wissensbasis enthält zwei gleichgroße Zahlen
Lösche eine der Zahlen aus der Wissensbasis
b) (zur Wiederholung von Rekursion)
Schreibe Klauseln zur Bestimmung des größten gemeinsamen Teilers zweier Zahlen, allerdings ohne
Verwendung eines Regelinterpreters.
2.8 Expertensysteme
2.8.1 Komponenten von Expertensystemen
Expertensysteme sind Programme, die in einem begrenzten Problembereich die Denkprozesse und
Schlussfolgerungen menschlicher Experten nachbilden können. Sie stellen Fragen (Interaktion mit
dem Benutzer) , folgern aufgrund von Wissensbasen (Inferenzkomponente) und durch Interpretation
von Regeln (Regelinterpreter), erklären Folgerungsprozesse (Erklärungskomponente, Wie und
34
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Warum), erwerben neues Wissen und können mit Unsicherheiten und unvollständigem Wissen umgehen.
Die folgende Abbildung stellt die Komponenten eines Expertensystems dar:
Wissensbasis
- Fakten
Inferenzmaschine
- Regeln
Benutzerschnittstelle
Benutzer
- evtl. Ideen
Expertensystem-Shell
Die Komponenten von Expertensystemen sind
(1) eine Wissensbasis
- Fakten
- Regeln
(2) eine Inferenzmaschine
- Regelinterpreter
- Scheduler (Planer)
- Wie-Prozessor
(Wie wurde ein Ergebnis gefunden, anhand welcher Regeln und Fakten?)
- Warum-Prozessor (Warum wird eine bestimmte Frage an den Benutzer gestellt?)
- Unbestimmtheitsprozessor (Wie sicher sind die Schüsse?)
- Schnittstelle zur Wissensbasis
(3) eine Benutzerschnittstelle
Festlegung der Wissensbasis durch Fakten und Produktionsregeln
Eine einfache Technik zur Darstellung von Wissen sind bedingte Anweisungen, die auch Wenn-DannRegeln oder Produktionsregeln genannt werden. Die Technik erweist sich für kleine Expertensysteme
als durchaus leistungsfähig. Weitere Stichpunkte zur Wissensrepräsentation sind Frames, Scripts und
semantische Netzwerke, die hier allerdings nicht problematisiert werden. Produktionsregeln lassen
sich unterschiedlich interpretieren, z.B.
- wenn Vorbedingungen erfüllt sind, dann sind Folgerungen zu ziehen
- wenn eine Situation vorliegt, dann sind Aktionen auszuführen
- wenn bestimmte Bedingungen gelten, dann sind eventuell weitere erfüllt
Beispiel aus der Medizin
Wenn es sich bei einer erkrankten Person um ein Kind handelt, keine stark erhöhte Temperatur
vorliegt und der Körper schwachroten Ausschlag zeigt, können Röteln vorliegen.
Die allgemeine Struktur ist gegeben durch
Wenn Bedingung B, dann Folgerung F mit Sicherheit W.
Das Beispiel demonstriert einen äußerst sensiblen und gesellschaftsrelevanten Bereich. Wer möchte
sich schon alleine auf die Diagnose eines Computers verlassen? Die Ausdrucksweise, dass Röteln
35
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
vorliegen können, schließt kategorische Fragen, d.h. Fragen, die ausschließlich mit ja oder nein
beantwortet werden können, aus. Die medizinische Diagnose ist ein typisches nichtkategorisches
Expertengebiet.
Das folgende Beispiel entstammt den Bereichen der Diagnose und Reparatur. Die Wissensbasis ist
äußerst klein, nichtsdestoweniger eignet sie sich zur Demonstration der Schlussweise und des
Verhaltens von mächtigeren Expertensystemen. Solche Systeme ähneln in der Wissensstruktur den
Diagnosesystemen, sie bieten allerdings häufig die zusätzliche Fähigkeit, Entscheidungen zu planen
und zu koordinieren. Ein typisches Beispiel ist die Computerwartung.
2.8.2 Diagnose von Fehlern am Auto
Angenommen, Ihr Wagen springt nicht an. Sie rufen bei Ihrer Werkstatt an und schildern das
Problem. Sie werden mit einem Experten der Werkstatt verbunden, der durch gezielte Fragestellung
die Ursache des Defektes einzugrenzen versucht. Er versucht herauszufinden, ob er Treibstoff
mitbringen soll oder Überbrückungskabel für die Batterie, oder ob er z.B. beim Defekt der Glühkerzen
den Wagen zur Werkstatt schleppen muss.
Die wesentlichen Fragen und Antworten bei dem Gespräch könnten z.B. sein:
(K = Kunde, E = Experte)
K: „Mein Wagen springt nicht an, können Sie mir bitte helfen?“
E: „Funktioniert das Licht?“
K: „Ja, das Licht funktioniert.“ (Die Batterie ist also in Ordnung!)
E: „Ist kein Treibstoff vorhanden? Schauen Sie bei eingeschalteter Zündung auf die Tankanzeige!“
K: „Die Tankanzeige meldet genügend Treibstoff.“
E: „Ist der Wagen ein Dieselfahrzeug?“
K: „Ja.“
E: „Möglicherweise sind die Glühkerzen defekt.“
Der Experte rät, den Wagen zur Werkstatt abzuschleppen, um den Schaden dort zu beheben.
Von einem Expertensystem erwartet man ein ähnliches Frage- und Schlussfolgerungsverhalten wie
von einem menschlichen Experten. Im „Gespräch“ mit dem Computer erweitert das System aufgrund
Ihrer Antworten seine Wissensbasis. Die Antworten sind Fakten, die das System zur eventuellen
späteren Verwendung bei Schlussfolgerungen im Arbeitsspeicher zwischenlagert.
Lösungsansatz in Prolog
Die oben beschriebene Fragefolge und die Schlussfolgerung könnten aufgrund folgender Regel
entstanden sein:
regel(3,hat(defekteGluehkerzen,ja),
[ist(diesel,ja),
hat(defekteBatterie, nein), /* Hier steckt die Frage nach dem Licht */
hat(treibstoff, ja),
reagiert(springtan, nein)]).
36
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Die Regel repräsentiert Wissen und steuert gleichzeitig durch einen Bedingungsteil ein Fragemuster
zur Überprüfung der Bedingungen.
Der folgende Ansatz versucht eine Trennung der Komponenten eines Expertensystems, soweit sie in
dem kleinen Rahmen möglich sind. Regeln erhalten ein einheitliches Format.
Den Kopf bildet das Prädikat namens regel. Es enthält u. a. als Argument die Regelnummer, die zur
Beantwortung von Wie-Fragen nützlich sein kann. Es folgt ein Prädikat zur Beschreibung eines
Defektgrundes und eine Liste von Folgerungen, die ein solcher Defekt hervorruft. Die Folgerungen
werden vom Kunden abgefragt und sind aufgrund der Antworten als Fakten mit dem Prädikatsnamen
fakt in die Wissensbasis im Arbeitsspeicher aufzunehmen. Der Behandlung von Verneinung dient
bei Fakten das Wort „nein“ während „ja“ das Gegenteil beschreibt.
hat(defekteBatterie,nein) bedeutet, dass die Batterie in Ordnung ist. Falls dies nicht bestätigt
werden kann, schließt das System auf das Gegenteil (negation as failure), also darauf, dass die
Batterie defekt ist.
Wie im Fragebeispiel demonstriert, fragt der Experte allerdings nicht, ob die Batterie defekt ist,
sondern, ob das Licht funktioniert und zieht daraus seinen Schluss auf die Qualität der Batterie. Er
stuft die direkte Frage nach der Beschaffenheit der Batterie offensichtlich als nicht zumutbar bzw.
nicht direkt entscheidbar für die Kundin oder den Kunden ein.
Die Wissensbasis des Expertensystems lautet:
fakt(f(a,a)).
/*Form von Fakten im Arbeitsspeicher, z.B. fakt(hat(licht,ja)).*/
regel(1, hat(treibstoff, nein),
[reagiert(springtan, nein),
hat(licht, ja),
zeigt(tankleer, ja)]).
regel(2,hat(defekteBatterie,ja),
[hat(licht, nein),
reagiert(springtan, nein)]).
regel(3,hat(defekteGluehkerzen,ja),
[ist(diesel,ja),
hat(defekteBatterie, nein), /*alternativ: hat(licht, ja) */
hat(treibstoff, ja),
reagiert(springtan, nein)]).
regel(4,hat(defekteZuendkerzen,ja),
[ist(diesel, nein),
hat(defekteBatterie, nein),
hat(treibstoff, ja),
reagiert(springtan, nein)]).
Die Wissensbasis soll sich einerseits nach Gründen für das Auftreten von Defekten befragen lassen,
andererseits soll man sich vermutete Gründe bestätigen lassen können. Die Ziele nenneGrund und
beweise dienen der Befragung.
37
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Mögliche Kommunikationsbeispiele
?- nenneGrund(reagiert(springtan,nein),Grund).
Funktioniert das Licht? (ja/nein.) ja.
Zeigt die Tankanzeige einen leeren Tank an? (ja/nein.) nein.
Ist der Wagen ein Diesel? (ja/nein.) ja.
Grund = hat(defekteGluehkerzen,ja)
Vor der nächsten Befragung ist die Wissensbasis neu zu initialisieren:
reconsult(meinFile).
?- beweise(hat(defekteZuendkerzen,ja)).
Ist der Wagen ein Diesel? (ja/nein.) nein.
Funktioniert das Licht? (ja/nein.) ja.
Springt der Wagen an? (ja/nein.) nein.
Zeigt die Tankanzeige einen leeren Tank an? (ja/nein.) nein.
bestätigt
yes
Die Ziele „nenneGrund“ und „beweise“ sind wie folgt charakterisiert:
nenneGrund(Fakt, Warum) :asserta(fakt(Fakt)),
/* Fakt speichern */
regel(RegelNr,Warum,Bedingungen), /* Regel aufrufen */
enthalten(Fakt,Bedingungen),
/* Falls der Fakt Teil der Bedingungen, */
pruefe(RegelNr,Bedingungen),
/* sind die Bedingungen zu testen */
!.
beweise(Defekt) :regel(Nr,Defekt,Bedingungen),
/* Suche entsprechende Regel */
pruefe(Nr,Bedingungen), write('bestätigt').
/* Überprüfe die Bedingungen */
Das Prädikat enthalten überprüft, ob ein Fakt in einer Liste von Bedingungen einer Regel enthalten
ist:
enthalten(Fakt,[]) :- !, fail.
enthalten(Fakt,[Fakt|R]) :-!.
enthalten(Fakt,[B|R]) :enthalten(Fakt,R).
/* enthalten(Fakt,[_,R] :- */
Das Ziel pruefe ist erfüllt, wenn alle Fakten oder auch Regeln im Bedingungsteil einer Regel
bestätigt werden können:
/* Prüfe, ob alle Bedingungen der Liste erfüllt sind */
pruefe(RegelNr,[]).
pruefe(RegelNr,[F1|Fakten]) :F1 =.. L,
38
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
bestaetige(RegelNr,L),!,
pruefe(RegelNr,Fakten).
Es existieren drei Arten von zu bestätigenden Bedingungen:
1) Fakten, die bereits im Arbeitsspeicher mit dem Prädikatsnamen fakt vermerkt sind,
2) Fakten, die vom Benutzer des Systems erfragt werden müssen,
3) Regeln, die selbst wieder zu bestätigen sind.
zu 1)
Falls eine Frage bereits beantwortet worden ist, befindet sich das Ergebnis im Arbeitsspeicher als
Fakt, z.B. fakt(hat(licht,nein)). Das System erkennt das Vorliegen eines Faktes, wenn
Prädikat (hat) und Objekt (licht) übereinstimmen. Bei Übereinstimmung der ja-nein-Komponente
mit der Antwort ist das Ziel erfüllt, sonst nicht. In jedem Fall ist zu verhindern, dass die nächste
Klausel gleichen Namens getestet wird. Der Klauselkopf hat die Form:
bestaetige(Nr,[P,Frage,B]) :....
/* liegt bereits als Fakt vor */
zu 2)
Die Schnittstelle zum Benutzer ist ein Katalog von Fragen zur Überprüfung gewisser Fakten:
fragbar(springtan, 'Springt der Wagen an').
fragbar(licht, 'Funktioniert das Licht').
fragbar(tankleer, 'Zeigt die Tankanzeige einen leeren Tank an').
fragbar(diesel, 'Ist der Wagen ein Diesel').
Die zweite Klausel zu bestätige stellt zu einem Objekt gegebenenfalls die entsprechende Frage
und trägt das Ergebnis in den Arbeitsspeicher ein. Das ursprüngliche Ziel gilt als erfüllt, wenn die
Antwort mit der jeweiligen Hypothese übereinstimmt:
bestaetige(RegelNr,[P,Frage,B]) :- /* es soll gefragt werden */
fragbar(Frage, Text),!,
.....
zu 3)
Den dritten Fall beschreiben folgende Klauseln:
/* Bestätige, dass eine Bedingung erfüllt ist oder auch nicht */
bestaetige(_,[P,Frage,B]) :/* Regelueberpruefung */
T1 =.. [P,Frage,Bool],
/* Bestätigung pos/neg*/
regel(Nr,T1,Liste),
asserta(fakt(T1)),
pruefe(Nr,Liste),!,
gleich(B,Bool).
bestaetige(_,[P,Frage,B]) :T1 =.. [P,Frage,Bool],
fakt(T1),
retract(fakt(T1)),
kontra(Bool,Bk),
T2 =.. [P,Frage,Bk],
/* Regelueberpruefung */
/* Fehlschlag */
39
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
asserta(fakt(T2)), gleich(Bk,B).
gleich(A,A).
kontra(ja,nein).
kontra(nein,ja).
/* Testaufrufe: */
go(X) :- nenneGrund(reagiert(springtan,nein),X).
do :- beweise(hat(defekteZuendkerzen,ja)).
Aufgabe 10
a) Vervollständige das Programm durch die Fälle 1) und 2), und testen Sie die Aufrufe go(Grund)
und do. Nach dem Aufruf von go(Grund) muss reconsult eingegeben werden.
b) Erweitere das Expertensystem um einen „Warum-Prozessor“, der bei Eingabe von wieso. angibt,
warum die jeweilige Frage an den Benutzer gestellt wird. Der Grund ergibt sich aus dem zweiten
Argument der jeweiligen Regel. Weisen Sie andere Benutzereingaben als ja, nein oder wieso
zurück!
c) Erweitere das Expertensystem um einen „Wie-Prozessor“, der begründet, warum ein
diagnostizierter Defektgrund gilt. Der Einfachheit halber soll lediglich der Bedingungsteil (das ist eine
Liste) der entsprechenden Regel ausgegeben werden.
2.9 Eine kleine Logelei*
„Meiers werden uns heute Abend besuchen“, kündigt Herr Müller an. „Die ganze Familie, also Herr
und Frau Meier nebst ihren drei Söhnen Rainer, Stefan und Thomas?“ fragt Frau Müller bestürzt.
Darauf Herr Müller: „ Nein, ich will es dir so erklären: Wenn Vater Meier kommt, dann bringt er auch
seine Frau mit. Mindestens einer der beiden Söhne Stefan und Thomas kommt. Entweder kommt
Frau Meier oder Rainer. Entweder kommen Rainer und Stefan oder beide nicht. Wenn Thomas
kommt, dann auch Stefan und Herr Meier. So, jetzt weißt du, wer uns heute Abend besuchen wird.“
(Entnommen aus [7], Jehle, Seite 106, Aufgabe 5)
Folgende Bedingungen sind zu erfüllen:
1) Falls Herr Meier kommt, kommt auch Frau Meier
falls(HerrMeierKommt, FrauMeierKommt)
2) Mindestens einer der beiden Söhne Stefan oder Thomas kommen
oder(StefanKommt, ThomasKommt)
3) Entweder kommt Frau Meier oder Rainer
entwederOder(FrauMeierKommt, RainerKommt)
4) Entweder kommen Rainer und Stefan oder beide nicht
RainerKommt = StefanKommt
5) Wenn Thomas kommt, dann auch Stefan und Herr Meier
falls(ThomasKommt, und(StefanKommt, HerrMeierKommt))
40
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Lösung in Prolog:
und(wahr,wahr).
oder(wahr,wahr).
oder(wahr,falsch).
oder(falsch,wahr).
falls(wahr,wahr).
falls(falsch,_).
entwederOder(A,B) :oder(A,B),
not(und(A,B)).
zuBesuch(HerrMeierKommt,FrauMeierKommt,RainerKommt,
StefanKommt,ThomasKommt) :falls(HerrMeierKommt, FrauMeierKommt),
oder(StefanKommt, ThomasKommt),
entwederOder(FrauMeierKommt, RainerKommt),
RainerKommt = StefanKommt,
falls(ThomasKommt, und(StefanKommt, HerrMeierKommt)).
?- zuBesuch(V,M,R,S,T).
V = falsch, M = falsch, R = wahr, S = wahr, T = falsch
Es kommen demnach lediglich Rainer und Stefan.
41
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Glossar
Anonyme Variable (_) eine =>Variable, deren Wert nicht zugreifbar ist
assert(K) fügt eine Klausel K in die Datenbasis ein (Prolog, asserta, assertz)
Aussagenlogik Formales logisches System zur Darstellung und Verknüpfung von Aussagen über
Objekte. Aussagenlogik verwendet keine Variablensymbole. Sie ist vor allem in der Schaltalgebra von
praktischer Bedeutung.
Backtracking Eine von Prolog verwandte Kontrollstrategie. Nach dem Misserfolg eines Ziels löst sie
alle Variablenbindungen bis zu dem Ziel, das als letztes abgearbeitet worden ist und für das noch
Klauseln existieren, die möglicherweise zu einer alternativen Lösung des Ziels führen.
Binden Zuweisung eines Wertes an eine Variable
call(P) Aufruf einer => Prozedur (Prolog)
CUT (!) Ein Operator zur Unterbindung von Rückverfolgung beim Beweis von Klauseln
consult(D) liest eine Datei D von Prozeduren in die Datenbasis ein
Datenbasis => Wissensbasis von Prolog
Deklarative Sprache Eine Programmiersprache, bei der durch Angabe von Fakten und Regeln
festgelegt wird, was zu lösen ist, nicht wie etwas zu lösen ist.
Diagnosesystem Ein Expertensystem zur Lösung diagnostischer Probleme
Expertensystem Computerprogramme, die in Schlussfolgerung und Wissensanwendung
menschliches Denkverhalten simulieren.
Expertensystemschale (auch Expertensystemshell) Ein Werkzeug zur Erzeugung von
Expertensystemen ohne Wissensbasis. Sie besteht aus einer Inferenzmaschine mitSchnittstellen zur
Wissensbasis und zum Benutzer.
fail Ein Standardoperator von Prolog zur Erzwingung von Rückverfolgung
Fakt Eine wahre Aussage über ein oder mehrere Objekte
Goal (Ziel) Ein in Prolog zu lösendes Problem
Inferenz Prozess des Schließens aus Fakten und Regeln
Inferenzmaschine Komponente (Folgerungsmechanismus) eines Expertensystems
integer(X) Ein Ziel, das wahr ist, wenn X eine ganze Zahl repräsentiert (Prolog)
X is A bestimmt den Wert des Ausdrucks a und => unifiziert ihn mit X (Zuweisung)
Klausel => Fakt oder => Regel, lexikalischer Geltungsbereich von Variablennamen
Prozedur in Prolog eine Menge von Klauseln mit gleichem Prädikatsnamen
read(T) liest einen Term T von der Eingabe ein. Der Term wird lexikalisch und syntaktisch analysiert.
Die Eingabe ist mit einem Punkt zu schließen.
reconsult(D) liest eine Datei D von Prozeduren in die Datenbasis ein und löscht vorher alle
Prozeduren mit gleichen Namen und Stelligkeiten
Regel Eine Klausel, die Beziehungen zwischen Fakten darstellt
42
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
retract(K) löscht die erste mit K identifizierbare( unifizierbare) Klausel K der Datenbasis
Rückwärtsverkettung Kontrollstrategie, die vom Zielzustand aus ein Ziel zu beweisen versucht
Unifizieren Ersetzen, Terme zur Übereinstimmung bringen bzw. identisch machen
Variable Ein Name, dem ein Wert zugeordnet werden kann
Vorwärtsverkettung Kontrollstrategie, die von einer Annahme beginnend ein Ziel zu beweisen
versucht
Wissensbasis in Prolog (Datenbasis) Zusammenfassung von Fakten und Regeln
write(T) gibt einen Term an der Ausgabeeinheit aus
Ziel => Goal
Literaturverzeichnis
[1] W.F.Clocksin C.S.Mellish
Programming in Prolog
Springer-Verlag
Berlin, Heidelberg, New York, Tokio 1984
[2] Fevzi Belli
Einführung in die logische Programmierung mit Prolog
BI-Hochschultaschenbücher
Mannheim,Wien,Zürich 1986
[3] Ivan Bratko
PROLOG
PROGRAMMIERUNG FÜR KÜNSTLICHE INTELLIGENZ
Addison-Wesley
Wokingham 1986
[4] F.Giannesini/H.Kanoui/R.Pasero/M.van Caneghem
Prolog
Addison-Wesley
Paris 1985
[5] M. Hanus
Problemlösen mit PROLOG
B.G.Teubner Stuttgart 1986
[6] Keith Weiskamp, Terry Hengl
KI-Programmierung mit Turbo Prolog
McGrawHill, Hamburg 1989
[7] Franz Jehle
43
Von der Wissensbasis zum Expertensystem
Eine Einführung mit Prolog
INFORMATIK
a.hermes
Boolesche Algebra
BSV
München 1973
[8] Markus Lusti
Wissensbasierte Systeme
Algorithmen, Datenstrukturen und Werkzeuge
BI-Wissenschaftsverlag
Mannheim. Wien, Zürich 1990
Prolog-Version
Die Prolog-Version entspricht dem Standard von
[1] W.F.Clocksin C.S.Mellish
Die Unterrichtsreihe lehnt sich an die 1992 von Alfred Hermes in INORMATIK Betrifft Uns beim
Bergmoser Höller-Verlag veröffentlichte Arbeit an.
44
PROLOG-Arbeitsheft
Von der Datenbank zum Expertensystem
Index
Ahnentafel 3
Aktionsteil 26
Arithmetik 9
assert 12
Ausdruck 10
Backtracking 6,7
Bedingungsteil 26
Benutzerschnittstelle 28, 32
call 20, 26
cut 7,9, 11
deklarativ 3, 6,18
Determinismus 24
Diagnose 29
Disjunktion 5
Erklärungskomponente 28
Expertensysteme 28
Expertensystemshell 28
fail 8,11
Fakten 3, 19, 28
Fakultät 10
Fibonacci 11
filter 20
Fragen 4
Fragen, kategorische 29
funktional 19
Funktor 4, 24
GGT 25, 27
goal 6
Graph 24
imperativ 18
Inferenzmaschine 21, 28
integer 13
Interpreter 24
is 10
Klausel (clause) 5
Kommentare 5
INFORMATIK
BETRIFFT UNS
Konfliktlösung 25
Konfliktmenge 27
Konjunktion 5
Konstanten 13
Kontrollregel 25
Kontrollstrategien 21
Kopf 5
Künstliche Intelligenz 2,3
Liste 15, 19
Listenoperationen 15, 16, 19
listing 11, 19
Logelei 33
Logische Programmierung 3
mapping 20
match 8,10
Menge 17
mustergesteuert 24, 25
Musterorientierung 12,13
Nichtdeterminismus 25, 27
Objekt 4
op 13
Operatoren 10, 13, 20
Parallele Prozesse 27
passen 8,10
Permutation 17
Planer 25
Prädikat 4
Primzahlen 12
Produktionsregeln 28
Prolog 2,3
prozedural 2, 3,6
Quadrat 10, 11
Quicksort 19
read 10
Regelinterpretierer 25
Regeln 5
45
PROLOG-Arbeitsheft
Von der Datenbank zum Expertensystem
INFORMATIK
BETRIFFT UNS
Rekursion 9
retract 12
Rückwärtsverkettung 7,21
Rumpf 5
Schatzsuche 24
Scheduler 26
Sortieren durch Mischen 19
Symbolisches Differenzieren 11
Teilziele 26
Terme 21
Termvereinfachung 15
Tiefensuche 7
Türme von Hanoi 10
Variablen 4
Vergleich 6
Vorwärtsverkettung 23
Wenn-Dann-Regeln 26
Wissensbasis 3,4, 26, 28, 30
Wurzelnachbarn 11
Zählen 11
Ziel (goal) 6
46