Studienreihe 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