Table Of ContentStudienreihe Informatik
Herausgegeben von W. Brauer und G. Goos
Herbert Stoyan
Progranrurrriernaethoden
der
Kiinstlichen Intelligenz
Band 1
Springer-Verlag
Berlin Heidelberg New York
London Paris Tokyo
Herbert Stoyan
Inforrnationswissenschaften
Universitat Konstanz
Postfach 5560, 7750 Konstanz
ISBN 978-3-540-19418-7 ISBN 978-3-642-87954-8 (eBook)
DOl 10.1007/978-3-642-87954-8
Dieses Werk ist urheberrechtlich geschlitzt. Die dadurch begrlindeten Rechte, insbe
sondere die der Ubersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbil
dungen und Tabellen, der Funksendung, der Mikroverfilmung oder der VervielfaJti
gung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben,
auch bei nur auszugsweiser Verwertung, vorbehalten. Eine VervieWiltigung dieses
Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der
gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutsch
land vom 9. September 1965 in der Fassung vom 24.1uni 1985 zulassig. Sie ist grund
satzlich verglitungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen
des Urheberrechtsgesetzes.
© Springer-Verlag Berlin Heidelberg 1988
Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in
dies em Werk berechtigen auch ohne besondere Kennzeichnung nicht zu der Annahme,
daB solche Namen im Sinne der Warenzeichen-und Markenschutz-Gesetzgebung als
frei zu betrachten waren und daher von jederrnann benutzt werden dlirften.
2145/3140-543210 Gedruckt auf saurefreiem Papier
Vorwort
Dieses Buch fiihrt in die Programmiermethoden der Kiinstlichen Intelligenz
(KI) ein. Es basiert auf der Grundidee, daB dazu das Implementieren von Pro
grammiersprachen gehort. Das erforderliche Wissen hieriiber deckt sich nun
keineswegs mit dem, das in einem Kurs iiber Compiler in der konventionel
len Informatik gelehrt wird. Auf Fragen der Syntaxanalyse wird hier in der
KI-Programmierung gar nicht eingegangen. Dagegen stehen die Probleme der
Interpretation, der Transformation der Programmiersprache hoherer Ordnung
in eine niederer Ordnung, und dariiber hinaus der Speicherverwaltung im Mit
telpunkt der Betrachtung.
Vollig anders als in der konventionellen Informatik sind die Beziehungen der
(KI)-Programmiersprachen auf den verschiedenen Ebenen. Das bekannte Scha
lenmodell (Problem-orientierte Maschine, Betriebssystem-Maschine, Assembler
Maschine, Microcode-Maschine) geht von einer Hierarchie abstrakter aber
strukturell iihnlicher Maschinen aus, die sich in der Miichtigkeit der primitiven
Operationen. unterscheiden, und bei denen eine Maschine niederen Niveaus zur
Realisierung der Maschine des niichsthoheren Niveaus verwendet wird. Diese
Maschinen sind strukturell iihnlich, weil aIle auf dem von-Neumann-Modell ba
sieren: Sie verarbeiten Ketten von primitiven Operationen iiber einen Speicher
von Datenobjekten. In der KI gibt es keine einzige festgelegte Hierarchie. Je
nach Anwendungsproblem wird der Programmierer eine Hierarchie von Maschi
nen aufbauen, die ihm passend erscheint. Die Maschinen unterscheiden sich da
bei fundamental. Die einen beruhen auf der Vereinfachung von Termen, andere
verarbeiten Problembeschreibungen, und wieder andere verarbeiten (beweisen)
logische Formeln. Zwar konnen auch konventionelle Informatiker diese abstrak
ten Maschinen verwenden - und im FaIle der Compilerprogrammierung sind sie
auch entsprechend vorgegangen - aber in der KI ist diese Methode durchweg
und seit Anbeginn anzutreffen. Wer KI-Programmierung studieren will, so lIte
lernen, die bisher verwendeten Arten abstrakter Maschinen (Verarbeitungsmo
delle) zu kennen und zu realisieren.
Mit den Mitteln einer abstrakten Maschine wird die hierarchisch niichste
realisiert oder ein Anwendungsproblem angegangen. Es ist dabei zu beriicksich
tigen, daB das Programmieren von abstrakten Maschinen, die sich so sehr von
der klassischen von-Neumann-Maschine (und untereinander!) unterscheiden,
jeweils ein Umdenken erfordert. Die Denkhaltung beim Programmieren einer
VI Vorwort
von-Neumann-Maschine (etwa mit FORTRAN) ist vollig von der verschieden,
die man beim Programmieren einer Beweismaschine (etwa mit PROLOG) ein
zunehmen hat. Diese Verschiedenheit beruht nicht aIle in auf der Betonung des
Prozeduralen im einen FaIle und des Deklarativen im anderen FaIle. Es gibt
verschiedene Auspragungen prozeduraler und deklarativer Sprachen, die sich
untereinander kaum gleichen. In diesem Buch wird der Versuch unternommen,
die bestimmenden Elemente der Programmierstile in den verschiedenen Fallen
herauszustellen.
KI-Programmierung kann man nicht durch Lesen allein lernen. Eigene Pra
xis ist erforderlich. Die verschiedenen Programmierstile werden an Beispielen
demonstriert. Urn den Vergleich zu ermoglichen, wird eine Aufgabe in allen
Kapiteln durchgehend behandelt. Dies kann - wegen des Umfanges des Bu
ches - nur bruchstiickhaft erfolgen. Der Leser wird erst dann einen vollen
Nutzen durch die Buchlektiire erreichen, wenn er die Beispiele ausbaut und
vervollstandigt.
Natiirlich ist das durchgehende Beispiel auch in gewisser Weise widersinnig.
Die verschiedenen Programmierstile sind gewohnlich fUr unterschiedliche An
wendungsbereiche besonders giinstig, wenn namlich das Verarbeitungsmodell
innere Strukturen des Anwendungsproblems besonders gut widerspiegelt. Eine
Liicke im vorliegenden Buch besteht sicher im Aufzeigen dieser angemessenen
Anwendungen. Doch macht auch das Fehlen dieser Anwendungsempfehlungen
Sinn: Der Programmierer soUte sich vor dem allzu schnellen Festlegen des Pro
grammierformalismus hiiten und statt dessen die inneren Charakteristika seines
Problems aufspiiren.
KI-Programmierung bedeutet ja nicht, unter allen Umstanden ein Regelpro
gramm zu schreiben. Die Mode einer bestimmten Klasse von Expertensyste
men hat es leider mit sich gebracht, daB schon bei der Problemanalyse nach
den Regeln gefragt wird. Der Experte, in den der KI-Programmierer (der sich
Knowledge Engineer nennen laBt) Regeln hineinprojiziert, obwohl jener viel
leicht ganz anders vorgeht oder sich sein Vorgehen bewuBt macht, wird stark
verunsichert und produziert verfalschtes Wissen.
Nun sind wir beim Thema Wissensreprasentation angelangt. Dieses Buch
ist von der Position aus geschrieben, daB die Besonderheiten der KI-Program
mierung in den Eigenschaften der verwendeten Denkmodelle liegen, die auf
abstrakte Maschinen bezogen sind, und nicht darin, daB Wissen reprasentiert
wird. Jeder Programmierer reprasentiert - oder besser: rekonstruiert - Wissen.
Der KI-Programmierer macht dies nur anders. Neu ist natiirlich auch die Tat
sache, daB das in den verschiedenen Programmkomponenten reprasentierte
Wissen im Rechner so dargestellt wird, daB es von anderen Programmen als
dem Interpreter und Compiler verarbeitet werden kann. Das vorliegende Buch
ist demzufolge auch ein Buch iiber Wissensreprasentation, wenn man diesen
Terminus gar nicht beiseitelegen mag. In den verschiedenen Kapiteln werden
WR-Formalismen dargestellt, ihre Verwendung und Verarbeitung aufgezeigt.
Der Umfang des Buches macht deutlich, daB die Aufgabe Platz erfordert.
Die Tour durch wesentliche Verarbeitungsmodelle der KI muBte in zwei Etap-
Vorwort VII
pen aufgeteilt werden. Dieser erste Band stellt neben dem einfiihrenden Ma
terial Problemloser und logische Programmierung dar. Der zweite Band wird
Relationenmodelle, Regelmodelle, objekt-orientierte Modelle und einige andere
spezielle Modelle darstellen.
Das Manuskript dieses Buches wurde mit LATEX bzw. TEX gesetzt. Nicht
jedes Detail ist dabei ideal geworden. Insbesondere mag dies fiir die vie len Pro
gramme gelten. Sie reprasentieren lauffahigen Code, der allerdings - wie ich
durch eigene leidvolle Erfahrungen weifi - in den verschiedenen CommonLISP
Dialekten etwas unterschiedlich zu behandeln ist (insbesondere beziiglich der
Deklaration der globalen Variablen). Der Code konnte nicht vollstandig wieder
gegeben werden - manchem Leser wird es schon so zuviel sein. Der interessierte
Leser kann auf Anfrage yom Autor eine Diskette mit allen Programmen erhal
ten.
Wegen der Schreib-, Programmier-, Test- und Setzarbeit hat sich die Fer
tigstellung des Manuskripts sehr verzogert. Die Urspriinge gehen auf Skripten
einer Vorlesung zuriick, die ich im Wintersemester 1983/84 in Erlangen gehalten
habe. Zwei Kurse auf der KI-Friihjahrsschule halfen der Vervollkommnung.
Die Materialfiille mufite in zwei Bande aufgeteilt werden. Der erste Band
enthiilt neben dem Einfiihrungsteil Problemloser und Variant en der logik
orientierten Programmierung, der zweite Band wird relationen-orientierte, regel
orientierte und objekt-orientierte Programmierung enthalten, sowie weitere spe
zielle Modelle (Netze und ATNs).
Eine Reihe von Kollegen hat die Entstehung dieses Buches mit Ermuti
gung und Ungeduld begleitet. Unter ihnen ist H. Wedekind hervorzuheben. H.
Schafer hat verschiedene Manuskript-Variant en gelesen und viele wichtige Ver
besserungsvorschliige gemacht. F. Simon studierte ebenfalls das Manuskript
und hat mit Korrekturen und Verbesserungen geholfen. Anregungen kamen
auch von G. Gorz, F. diPrimio, T. Christaller, C. Beckstein und T. Tielemann.
Eine Abschlufidurchsicht wurde freundlicherweise von H. Schneider vorgenom
men, so dafi die Schreibfehler weitgehend beseitigt sind. Ihnen allen gebiihrt
mein Dank.
Ein kleines Schreibproblem wurde in der Schlufiphase der Herstellung des
vorliegenden Textes diskutiert: die Schreibweise der Koppelworter auf orientiert
bzw. basiert. Ich habe mich aus Griinden der Lesbarkeit dafiir entschieden,
diese mit Bindestrich zu schreiben.
Ich wiinsche dem Leser, dafi er aus der Lektiire Nutzen ziehen moge. Wenn
er beim Konstruieren von KI-Systemen in Zukunft Zwischensprachen benutzt
und zugeordnete Verarbeitungsmodelle implementiert, oder wenn er nicht nur
in Regeln das wahre Ausdrucksmittel der KI-Programmierung (Wissensreprii
sentation) sieht, ist schon viel erreicht.
Konstanz, im Marz 1988 Herbert Stoyan
Inhaltsverzeichnis Band 1
1 Einleitung ................................................... . 1
1.1 Was sind Methoden der Kiinstlichen Intelligenz? ............. . 1
1.2 Eine Arbeitsmethode fiir die KI .............................. . 4
1.3 Literatur ..................................................... . 7
2 Programmierstile - Verarbeitungsmodelle - Programmier-
sprachen ..................................................... . 11
2.1 Programmiermethoden ....................................... . 11
2.2 ProgrammierstiIe ............................................ . 12
2.3 Verarbeitungsmodelle ........................................ . 16
2.4 Programmiersprachen ........................................ . 19
2.5 Ubersicht .................................................... . 21
2.6 Literatur ..................................................... . 23
3 Ein Beispielproblem: Krypto-arithmetische Ritsel ........... . 25
3.1 Einfache Grundtatsachen und methodisches Expertenwissen .. . 26
3.2 Grundwissen iiber Additionsgleichungen ...................... . 27
3.3 Expertenwissen iiber Additionsgleichungen ................... . 27
3.3.1 Kombinationen gleicher oder ungleicher Ziffernsymbole ....... . 27
3.3.2 Ungleichungen ............................................... . 29
3.3.3 Einbeziehung konkreter Werte ................................ . 29
3.4 Grundwissen iiber Multiplikationsgleichungen ................. . 29
3.5 Expertenwissen iiber Multiplikationsgleichungen .............. . 30
3.5.1 Kombinationen gleicher oder ungleicher Ziffern ............... . 30
3.5.2 Ungleichungen ............................................... . 31
3.5.3 Ausnutzen spezieller Werte ................................... . 31
3.6 Ein Beispiel .................................................. . 32
3.7 Ubungsaufgaben ............................................. . 33
3.8 Literatur ..................................................... . 35
4 Funktionale Programmierung - Der funktions-orientierte
Programmierstil ............................................. . 37
4.1 Programmieren mit Funktionen .............................. . 37
4.2 Verarbeitungsmodelle, ProgrammierstiIe, Programmier-
sprachen ..................................................... . 37
x Inhaltsverzeichnis Band 1
4.2.1 Funktionale Verarbeitungsmodelle ............................ . 37
4.2.1.1 Das konventionelle Verarbeitungsmodell ...................... . 38
4.2.1.2 Reduktionsmodelle ........................................... . 39
4.2.1.3 Die "platonische" Maschine (Das Verarbeitungsmodell 3. Art) 41
4.2.2 Der funktions-orientierte Programmierstil .................... . 41
4.2.3 Eine funktions-basierte Programmiersprache .................. . 42
4.3 Funktions-orientiertes Programmieren ........................ . 47
4.3.1 Einfache Beispiele ............................................ . 47
4.3.2 Ein funktions-orientiertes Programm fUr das krypto-
arithmetische Problem ....................................... . 50
4.4 Implementation einer funktions-basierten Programmiersprache 54
4.5 Historische Anmerkungen .................................... . 68
4.6 Ubungsaufgaben ............................................. . 76
4.7 Literatur ..................................................... . 77
5 Programmieren mit Mustern ................................. . 81
5.1 EinfUhrung in die Grundbegriffe des Mustervergleichs ......... . 81
5.2 Mustervergleich: Verarbeitungsmodell, Programmierstil,
Programmiersprache ......................................... . 82
5.2.1 Das Verarbeitungsmodell ..................................... . 82
5.2.2 Der muster-orientierte Programmierstil ....................... . 82
5.2.3 Eine Musterbeschreibungssprache ............................ . 83
5.3 Programmieren mit Mustern ................................. . 84
5.3.1 Einfache Beispiele ............................................ . 84
5.3.2 Ein Musterprogramm fUr das krypto-arithmetische Problem .. . 84
5.4 Implementation eines Mustervergleichers ..................... . 86
5.5 Historische Anmerkungen .................................... . 93
5.6 Ubungsaufgaben ............................................. . 98
5.7 Literatur ..................................................... . 99
6 Die Logic Theory Machine als Interpreter einer
nichtexistenten Programmiersprache - Der operator-
orientierte Programmierstil .................................. . 103
6.1 Die Logic Theory Machine ................................... . 103
6.2 Verarbeitungsmodell, Programmierstil und Programmier-
sprache ...................................................... . 105
6.2.1 Das operator-orientierte Verarbeitungsmodell ................. . 105
6.2.2 Der operator-orientierte Programmstil ........................ . 106
6.2.3 Eine operator-orientierte Programmiersprache ................ . 108
6.3 Programmieren mit der operator-orientierten Programmier-
sprache ...................................................... . 109
6.3.1 Einfache Beispiele ............................................ . 109
6.3.2 Eine operator-orientiertes Programm fur das krypto-
arithmetische Problem ....................................... . 110
InhaItsverzeichnis Band 1 XI
6.4 Implementation der operator-basierten Programmiersprache .. . 114
6.5 Ubungsaufgaben ............................................. . 124
6.6 Literatur ..................................................... . 125
7 GPS: Modifizierte operator-orientierte Programmierung ...... . 127
7.1 Das allgemeine Problemlosungssystem GPS ................... . 127
7.2 Verarbeitungsmodell, Programmierstil und Programmier-
sprache ...................................................... . 129
7.2.1 Das Verarbeitungsmodell der Zweck-Mittel-Analyse ........... . 129
7.2.2 Der modifizierte operator-orientierte Programmierstil ......... . 130
7.2.3 Die GPS-Problemformulierungssprache ....................... . 131
7.2.3.1 Die origin ale Problemformulierungssprache ................... . 131
7.2.3.2 Eine rekonstruierte Problemformulierungssprache ............. . 136
7.3 Programmieren in GPS ...................................... . 139
7.3.1 Ein Beispiel - Parsen einfacher Satze ......................... . 140
7.3.2 Ein GPS-Programm fUr das krypto-arithmetische Problem .... . 146
7.4 Implementation von GPS .................................... . 150
7.4.1 Die GPS-Methodenbeschreibungssprache ..................... . 150
7.4.2 Der Methodeninterpreter ..................................... . 163
7.4.3 Syntaktische Verarbeitung von Problembeschreibungen ....... . 188
7.5 Ubungsaufgaben ............................................. . 190
7.6 Literatur ..................................................... . 191
8 Der Advice Taker als Interpreter fUr Programme im
Priidikatenkalkiil - Logik-orientierte Programmierung (1) .... . 193
8.1 Der Advice Taker ............................................ . 193
8.2 Logik-orientierte Programmierung: Verarbeitungsmodell,
Programmierstil und Programmiersprache .................... . 194
8.2.1 Ein fruhes Verarbeitungsmodell .............................. . 198
8.2.2 Programmieren mit einem Gemisch von Logik und
Anweisungen ................................................. . 198
8.2.3 Eingehendere Analyse des McCarthyschen Verarbeitungs-
modells ...................................................... . 200
8.2.4 Die Programmiersprache fur den Advice Taker -
Implikationen und Regeln .................................... . 203
8.3 Programmieren fUr den Advice Taker ......................... . 204
8.3.1 Einfache Beispiele ............................................ . 204
8.3.2 Ein logisches Programm fur das krypto-arithmetische Problem 205
8.4 Implementation des Advice Takers ........................... . 206
8.4.1 Der vorwarts arbeitende "Interpreter" ........................ . 206
8.4.2 Der ruckwarts arbeitende "Interpreter" ....................... . 214
8.5 Ubungsaufgaben ............................................. . 230
8.6 Literatur ..................................................... . 231
XII InhaItsverzeichnis Band 1
9 PLANNER: Ziel-orientierte Programrnierung als
Variante der logik-orientierten Programrnierung (2) . . . . . . . . .. 233
9.1 PLANNER-Einfiihrung: Riickwartsarbeit als ziel-orientierte
Implikationsauswahl . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
9.2 Ziel-orientierte Programmierung: Verarbeitungsmodell,
Prograrnmierstil und Programmiersprache . . . . . . . . . . . . . . . . . . .. 236
9.2.1 Das PLANNER-Verarbeitungsmodell .. . . . . . . . . . . . . . . . . . . . . . .. 236
9.2.2 Ziel-orientiertes Programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 236
9.2.3 Eine ziel-basierte Programmiersprache .. . . . . . . . . . . . . . . . . . . . . .. 237
9.3 Prograrnmieren in MicroPLANNER . . . . . . . . . . . . . . . . . . . . . . . . .. 242
9.3.1 Ein einfaches Beispiel: Das Flughafen-Problem . . . . . . . . . . . . . . . 243
9.3.2 Ein PLANNER-Programm fiir krypto-arithmetische Probleme 245
9.4 MicroPLANNER - Eine Implementation von PLANNER 255
9.5 Die Geschichte von PLANNER - Ein Versuch . . . . . . . . . . . . . . . . 276
9.5.1 PLANNER 1967 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
9.5.2 PLANNER 1969 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 284
9.5.3 PLANNER 1971 ............................................. 287
9.5.4 MicroPLANNER .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 289
9.5.5 Das Ende von PLANNER.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 290
9.6 Ubungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
9.7 Literatur ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 293
10 PROLOG - Logik-orientierte Programmierung (3) . .......... 297
10.1 PROLOG.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 297
10.2 PROLOG: Verarbeitungsmodelle, Programmierstil und
Prograrnmiersprache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 299
10.2.1 Logische und prozedurale Verarbeitungsmodelle . . . . . . . . . . . . . . 300
10.2.1.1 Resolutionsbeweiser.......................................... 300
10.2.1.2 Ziel-orientierte Formulierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
10.2.1.3 Beschreibung von Clocksin und Mellish .......... . . . . . . . . . . . .. 302
10.2.1.4 Unifikation in PROLOG. .................................... 303
10.2.1.5 Die "prozentuale" Beschreibung von Kowalski. ............... 303
10.2.2 Logik-orientierter Programmierstil in PROLOG. ............. 305
10.2.3 PROLOG als Notation fUr die Horn-Logik .. . . . . . . . . . . . .. .. . .. 307
10.3 Prograrnmieren in PROLOG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
10.3.1 Einfache Beispiele .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 313
10.3.2 Ein PROLOG-Programm fiir das krypto-arithmetische
Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
10.4 Implementation von PROLOG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
10.5 Ubungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
10.6 Literatur ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 331
Sachverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Personenverzeichnis ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 338
Funktionsverzeichnis .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340