Lisp und Prolog auf dem Schneider CPC

Künstliche Intelligenz ist zur Zeit das aktuelle Thema. So finden die »alten« Programmiersprachen der KI erst jetzt Würdigung. Wir haben uns für Sie zwei Interpreter der Sprachen Lisp und Prolog genau angesehen.

Unter dem Schlagwort »Künstliche Intelligenz« läßt sich alles zusammenfassen, das den Computer in irgendeiner Form aus seiner angeborenen »Dummheit« heraushebt. Das tun beispielsweise Expertensysteme, die ein enormes Wissen über ein Fachgebiet gespeichert haben und Anfragen des Benutzers durch Kombination der Wissenselemente beantworten. Im Endziel soll das in ferner Zukunft sogar mit natürlicher Sprache geschehen. Manche Softwarehäuser glauben, hier eine Marktlücke entdeckt zu haben und bieten Programme unter dem Schlagwort »Künstliche Intelligenz« an, die absolut nichts damit zu tun haben. Man kann sagen, daß es bis heute noch kein KI-Programm gibt, das diesem großen Wort »Intelligenz« wirklich gerecht wird, auch wenn einige auf verschiedene KI-Techniken zurückgreifen.

Aber wie es schon seit den Urzeiten der Computer ist: Wenn aus der kommerziellen Ecke keine geeignete Software kommt, sind wieder die Gelegenheits-, Feierabends- und Wochenendprogrammierer gefragt. Falls Sie also Lust verspüren, einmal zu zeigen, wie man künstliche Intelligenz einsetzt, müssen Sie sich die entsprechenden Hilfsmittel Hilfsmittel - sprich Programmiersprachen - beschaffen. Mit Basic, Pascal oder C ist die KI-Programmierung etwas kompliziert. Besser geeignet sind Lisp und Prolog.

Bislang waren die Interpreter beider Sprachen sehr teuer. Wer sich jedoch auf dem Markt umsieht, findet auch für das Betriebssystem CP/M, wofür die Programme zusehends preiswerter angeboten werden. Damit können Besitzer eines Schneider CPC, Joyce oder Commodore 128 den »Schritt in die Zukunft« versuchen. Leider muß man unter CP/M auf einen komfortablen Bildschirm-Editor verzichten. Und auch mit »Fensterln« ist nichts drin. Ob und wie gut die Implementationen Lisp/80 und micro-Prolog 3.1 einsetzbar sind, nehmen wir in unserem Test unter die Lupe.

Lisp — der Urahn

Künstliche Intelligenz ist die Brücke in die Zukunft. Paradoxerweise entstand die erste lauffähige Version von Lisp schon im Jahre 1959. Damit ist Lisp die Zweitälteste Computer-Hochsprache. Es hat sich aber gezeigt, daß das Grundkonzept von Lisp, wie es von John McCarthy am MIT (Massachusetts Institute of Technology) festgelegt wurde, derart flexibel ist, daß die Sprache auch heute noch bestehen kann. Nicht zuletzt ist auch Logo aus Lisp abgeleitet.

Lisp hat eine sehr einfache Betrachtungsweise der Dinge. Dennoch ist es nicht ohne gewisse Schwierigkeiten zu erlernen. Wahrscheinlich schrecken aus diesem Grunde bislang noch zu viele Programmierer davor zurück.

Lisp verfügt über nur zwei Datentypen. Das ist viel weniger als in konventionellen Sprachen. Denken Sie allein an die Vielfalt in C! Einer der Datentypen heißt »Atom«. Keine Angst, das symbolisiert nur, daß dieser Datentyp unteilbar ist. Ein Atom steht in Lisp für eine Zahl, ein Zeichen oder eine Zeichenkette. Folglich unterscheidet man numerische (numeric) und zeichenorientierte (Literal) Atome. Atome sind als Konstanten und Variablen verwendbar. Man weist ihnen Werte mit SET zu und verwendet sie in mathematischen Ausdrücken. Der zweite Datentyp ist die »Liste«.

Listen bestehen aus einer bestimmten Anzahl von Atomen. In vielen anderen Programmiersprachen erscheinen Listen in Form von eindimensionalen Datenfeldern (Arrays). Der Lisp-Programmierer kennzeichnet Listen durch runde Klammern. Haben Sie etwa die Atome A B und C sind diese als Liste (A B C) darstellbar. Mit verschiedenen Funktionen lassen sich solche Listen manipulieren. So liefert CAR das erste Element der Liste, CDR alle Elemente der Liste bis auf das erste. Auch mathematische Ausdrücke werden als Listen dargestellt.

Das kann doch nicht wahr sein!

Wer kein Geld für Experimente übrig hat, oder vor der Ausgabe mehrerer hundert Mark für einen Lisp- oder Prolog-Interpreter in die Materie hineinriechen will, dem bieten wir in diesem Monat einen besonderen Service:

Die Leserservice-Diskette für Schneider-Computer enthält nämlich Schnupper-Exemplare dieser Interpreter. Da es sich um Public-Domain-Software handelt, entstehen Ihnen dafür keinerlei Mehrkosten.

Wer sich etwas in Forth auskennt, kennt die umgekehrte Polnische Notation (UPN). Statt »3 + 5« heißt es dort »3 5 +«. Alle Rechenoperatoren stehen also in der UPN hinter beiden Operanden. Da es eine »Umgekehrte« Polnische Notation gibt, ist nur logisch, daß auch eine Polnische Notation existiert. Und genau die verwendet Lisp. In der PN steht der Operator vor den Operanden: »(PLUS 3 5)«. Die meisten Rechenoperationen sind aber in Lisp nur rudimentär (verkümmert) ausgebildet. So verarbeiten viele Lispinterpreter (darunter auch Lisp/80) nur ganzzahlige Werte, also Integerzahlen.

Lisp arbeitet ausschließlich mit Funktionen. Aha, denkt sich der C-Programmierer, das kenne ich doch! Dies ist in gewissem Umfang sogar richtig. Jedes Lisp-Programm besteht aus einer oder mehreren Funktionen, die sich gegenseitig aufrufen. Eine besondere Eigenschaft dieser Funktionen ist, daß sie stets einen bestimmten Wert zurückgeben. Prozeduren im üblichen Sinn existieren also nicht. Und jetzt kommt der schwerste Schlag für alle an herkömmliche Sprachen gewöhnten Programmierer: In Lisp gibt es keine sequentiellen Programme! Alle Befehle zur iterativen Berechnung fehlen völlig. Es gibt weder FOR-TO-NEXT noch REPEAT-UNTIL, auch kein SWITCH-CASE und wie sie alle heißen. Wenn sich Probleme also nicht iterativ lösen lassen, wie dann?

Einige Leser werden es schon ahnen: Rekursion heißt das Zauberwort. Genau, das ist die Programmiertechnik, die man schon damals in der Informatik-Arbeitsgruppe nicht verstanden hat. Auch wenn viele Informatiklehrer und -professoren behaupten, daß Rekursion das einzig Wahre ist, ist es doch ebenso wahr, daß Iterationen viel leichter zu programmieren sind. Bevor Sie sich nun mit Schrecken von Lisp abwenden, sei zu Ihrer Beruhigung gesagt, daß in vielen Lispimplementationen — auch in Lisp/80 — eine PROG-Funktion vorhanden ist. Mit ihr lassen sich herkömmliche sequentielle Programme schreiben. Neben RETURN und SELECTQ findet man hier auch das unstrukturierte GO (GOTO). Das hat allerdings nicht mehr sehr viel mit dem »puren« Lisp zu tun.

Was sind nun Programme? Wenn man das Wort »Programmliste« verwendet, kann man es sich denken: Jedes Programm ist auch nur eine Liste von Daten. Und hier setzt die künstliche Intelligenz an. Da es schon keinen Unterschied zwischen Programmen und Daten gibt, kann man doch auch Programme schreiben, die andere Programme schreiben oder sich selbst verändern. Und damit sind wir auf dem Punkt: Ein selbstlernendes Expertensystem, das selbsttätig seine Wissensbasis verbreitert, sich ständig selbst modifiziert, ist in Lisp durchaus vorstellbar. Nach dieser stark gerafften Einführung in die Gedankenwelt von Lisp sehen wir uns den Interpreter »Lisp/80« an. Lisp/80 ist ein »altes« Programm. Es stammt aus dem Jahr 1980 und wurde seitdem kaum weiterentwickelt. Deshalb stehen nur die Standardfähigkeiten von CP/M zur Verfügung. Lisp/80 beruht auf dem InterLisp-Dialekt. InterLisp ist recht verbreitet auf PDP-10- und DEC-20-Computern. Es bietet alle grundlegenden Strukturen von Lisp, aber leider kaum mehr. Über vordefinierte Funktionen erlaubt es aber immerhin die Kommunikation mit Diskettenlaufwerken.

Die Hilfen bei der Suche nach Programmfehlern sind erstaunlich ausgereift. So erfolgen alle Fehlermeldungen im (englischen) Klartext. Niemand muß also Fehlernummern im Handbuch nachschlagen. Was die Funktion TRAGE durchführt, muß man wohl keinem Basic-Programmierer erklären. Bei jeder einzelnen Funktion sind mit Lisp/80 auf dem Bildschirm die Funktionsaufrufe und Schachtelungstiefe darstellbar. BREAK unterbricht vorübergehend Funktionen für Eingaben. Über COLLECT ruft Lisp/80 eine Garbage-Collection auf, die unbenutzte Speicherzellen wieder zugänglich macht. Im Normalfall verfügt Lisp/80 lediglich über einen Zeileneditor, mit dem sich die Korrektur von Funktionen sehr schwierig gestaltet. Immerhin stehen dem Benutzer unter CP/M Plus alle üblichen Tastenkombinationen zur Verfügung. Als externe Funktion läßt sich EDIT.LSP hinzuladen, ein in Lisp geschriebener Editor. Dabei handelt es sich um einen sehr gewöhnungsbedürftigen »Struktureditor«. Man bestimmt hier nicht direkt mit den Cursortasten die Stelle, die man korrigieren möchte, sondern muß sich mit Befehlen zu einzelnen Atomen oder Listen vorarbeiten.

An Demonstrationsprogrammen finden sich auf der Lisp-Diskette »Doctor« und »Animal«. Animal ist ein einfaches Spiel, in dem der Computer Tiere errät. Da eine Wissensbasis völlig fehlt, stellt sich der Computer bei den ersten Spielrunden ausgesprochen dumm an. Wenn Sie dem Computer ein ihm unbekanntes Tier nennen, müssen Sie ihm Unterscheidungsmerkmale zu den bekannten Lebewesen nennen. Das läuft dann (natürlich auf Englisch) nach dem Muster »Wenn es Hörner hat und nicht auf zwei Beinen geht, ist es ein Stier«.

Hinter »Doctor« verbirgt sich eine abgemagerte Version des berühmten »Psychiater«-Programms »Eliza« von Josef Weizenbaum. Für alle, die Eliza noch nicht kennen: Der Computer stellt — wie ein Psychiater — Fragen und wertet Ihre Antworten aus. Dazu pickt er sich bestimmte Schlüsselwörter heraus und lenkt das Gespräch dann in eine ihm genehme Richtung. Ein Dialog mit Doctor sieht etwa so aus:

Computer:
Teil me about your problem!
Benutzer:
I feel depressed.
Computer:
Why do you suppose you feel depressed?
Benutzer:
My mother hates me.
Computer:
Tell me more about your mother!

Das Originalprogramm Eliza ließ Weizenbaum vor Jahren Studenten ausprobieren. Diese glaubten, sich endlich von jemandem verstanden zu wissen! Kritiker meinten allerdings sarkastisch, Eliza zeige weniger die Entwicklungen der künstlichen Intelligenz als vielmehr den Zustand der amerikanischen Psychiatrie.

Leider beweist besonders Eliza, daß der Lisp/80-Interpreter sehr langsam arbeitet. Implementationen unter MS-DOS und auch muLisp von Microsoft sind um ein Vielfaches schneller. Das schränkt natürlich die Nutzbarkeit für kommerzielle Anwendungen ein. Für Hobbyanwender und alle, die relativ preisgünstig die Grundlagen von Lisp erlernen wollen, ist Lisp/80 für 189 Mark dennoch ideal, Rechnen Sie aber gleich noch mit der Ausgabe für ein vernünftiges Lisp-Lehrbuch, denn mit der Anleitung von Lisp/80 besteht kaum eine Chance, Lisp wirklich zu erlernen. Es handelt sich nämlich dabei nur um eine rund fünfzig Seiten starke Auflistung aller Fähigkeiten von Lisp/80, keineswegs aber um eine Einführung in die Programmierung. Das Handbuch wird bedauerlicherweise nur in englischer Sprache geliefert, was bei einer ganzen Reihe von Interessenten zusätzlich zu Verständnisschwierigkeiten führt.

Prolog — japanische Logik

Die zweite Sprache, die in der Forschung künstlicher Intelligenz Verwendung findet, heißt Prolog. »Prolog« steht für »Programmieren in Logik«. Die Sprache wurde erstmals 1972 von Professor Colmerauer an der Universität Marseille auf einem Computer implementiert. Besonders japanische Wissenschaftler, die eifrig an den Computern der fünften Generation arbeiten, benutzen heute Prolog. Dieser Sprache liegt ein völlig anderes gedankliches Konzept zugrunde als allen anderen Computersprachen. In Basic, Pascal. Fortran und anderen Sprachen muß man sich überlegen, welche Anweisungen der Computer ausführen soll, um ein Problem zu lösen. Da man dem Computer vorschreibt, was er zu tun hat, nennt man diese Sprachen »prozedural« oder »imperativ«. Prolog geht von der anderen Seite heran. Hier sagt der Programmierer, welches Problem er hat und überläßt ganz dem Computer, wie es zu lösen ist. Dieser deskriptive Weg ist eigentlich eine gewaltige Revolution. Der Programmierer muß sich nicht mehr mit den Banalitäten und Widrigkeiten des Alltags herumschlagen, sondern läßt den Computer für sich denken. Allerdings ist — und das gibt der Masse der Programmierer noch einige Jahre lang genügend Arbeit — Prolog noch nicht so gut entwickelt, daß diese Technik völlig ausgereift ist. Deshalb besitzt Prolog sozusagen als Rettungsring auch prozedurale Elemente.

In Prolog zu programmieren heißt, dem Computer Sachzusammenhänge darzustellen. Das geschieht in micro-Prolog mit dem »Simple«-Paket zum Beispiel so:

&add(Reagan,Politiker)
&add( Thatcher, Politiker)

Hier werden zwei Fakten in die Wissensbasis eingefügt. Wenn Sie später einmal nicht mehr sicher sind, ob Reagan ein Politiker ist, verschaffen Sie sich schnell Gewißheit:

&is(Reagan,Politiker) YES
&is (Thatcher, Politiker) YES

Versuchen Sie hingegen folgendes:

&is (Gorbatschow, Politiker) NO

ist das aber bestimmt kein Kennzeichen für künstliche Intelligenz (oder in diesem Falle künstliche Ignoranz) in micro-Prolog. Sie haben Prolog nur nicht mitgeteilt, daß auch Herr Gorbatschow ein Politiker ist. Deshalb antwortet der Interpreter nur stur »No«.

Es lassen sich aber auch Fakten und Regeln nach dem Wenn-Dann-Prinzip aufstellen:

WENN Tier-legt-Eier
DANN Tier-ist-Vogel
SONST Tier-ist-Säugetier

Über Frageworte wie »is« und »which« lassen sich dann Schlußfolgerungen aus bekannten Fakten ziehen.

Auf diesem Niveau leistet Prolog allerdings kaum mehr als eine gute Datenbank. Erst diejenigen, die sich in die Programmierung von Prolog einarbeiten, werden »belohnt« durch entsprechende Resultate.

Bei micro-Prolog gestaltet sich das Erlernen und auch die praktische Arbeit mit höherem Komfort, denn es ist so kompakt, daß auch auf 8-Bit-Computern noch genügend Speicher für eigene Programme und Daten übrigbleibt. Verschiedene Befehlserweiterungen werden als Diskettendateien mitgeliefert, die bei Bedarf hinzuzuladen sind. Dazu gehört wieder — wie schon bei Lisp/80 — einer dieser furchtbaren Struktur-Editoren. Besser ist da schon den Editor von »Simple« zu gebrauchen. Über Befehle wie ADD, LIST, EDIT und KILL lassen sich hier einzelne Aussagen recht einfach editieren. Außerdem unterstützt »Simple«-Prolog einige höhere Frageformen und ersetzt die Fehlernummern durch Meldungen im Klartext. Verschiedene Debugging-Hilfen sind ebenfalls geboten.

Was bekommt der Käufer mit micro-Prolog für 349 Mark? Neben der Programmdiskette findet sich im Prolog-Paket ein dickes Referenz-Handbuch, das alle Details von Prolog und der speziellen Implementation von micro-Prolog unter CP/M beschreibt. Für alle, die Prolog bereits beherrschen, ist das eine sehr nützliche Informationsquelle. Doch erlernen kann man Prolog mit diesem Handbuch keinesfalls. Das hat auch der Hersteller erkannt und ein weiteres Buch beigelegt, das sich an Anfänger wendet und speziell auf micro-Prolog zugeschnitten ist. Es erklärt die Philosophie, die hinter Prolog steht, ebenso ausgezeichnet, wie die Grundlagen der Programmierung. Doch ist auch hier die gesamte Dokumentation leider nur in englischer Sprache verfügbar. Hier sind die deutschen Anbieter gefordert, Abhilfe zu schaffen.

Fast umsonst

Nach diesen kurzen Beschreibungen von Lisp und Prolog sowie der beiden Interpreter, sollte eigentlich Ihr Interesse an der künstlichen Intelligenz geweckt sein.

Doch wenn Sie noch nicht sicher sind, ob Sie soviel Geld für ein Programm ausgeben wollen, haben wir ein tolles Angebot für Sie: Die Leserservice-Diskette dieses Monats für Schneider-Computer enthält zwei Public-Domain-Programme. Das eine heißt schlicht »LISPCOM« und ist ein in Pascal geschriebener CP/M-Lisp-Interpreter. Das zweite, »EPRO.COM«, ist eine Minimalversion von Prolog. Professionelle Programme können Sie mit diesem Lisp und Prolog sicher nicht entwickeln, aber zur Einarbeitung in KI eignen sie sich hervorragend.

Lisp meldet sich nach kurzer Ladezeit mit einem gedehnten »R E A D Y« und ist bereit, Ihre Befehle entgegenzunehmen. Schalten Sie am besten auf ständige Großschreibung um, da Lisp die Befehle nur in Großschrift akzeptiert.

(SETQ X  (QUOTE(A B C)))

Wenn Sie jetzt ein zweites Mal < ENTER > oder < RETURN > drücken, führt Lisp Ihren Auftrag aus:

(A B C)

Im Gegensatz zu anderen Interpretern gestattet Lisp es nicht, QUOTE durch ein Apostroph abzukürzen. Das ist aber nicht allzu schlimm, denn es verursacht lediglich mehr Tipparbeit. Lisp besitzt keinerlei integrierte arithmetische Befehle. Das ist bei einfacheren Lisp-Implementationen durchaus üblich und läßt sich verschmerzen. Einige der Funktionen, die Lisp verarbeitet, sind CAR, CDR, CONS, LIST, APPEND, ATOM, EVAL, LENGTH, LAST, SET, SETQ, COND und LABEL. Auch PROG zur sequentiellen Programmierung ist zusammen mit GO und RETURN vorhanden. TRAGE und UNTRACE erlauben die Fehlersuche in Lisp-Funktionen.

Auf einer Lisp-Arbeitsdiskette muß unbedingt neben »LISPCOM« auch die Datei »INITLISP« vorhanden sein. Darin speichert der Computer benutzerdefinierte Funktionen und Variablen. Die mitgelieferte Datei INITLISP ist anfangs völlig leer. Auf der Diskette befindet sich aber zusätzlich die Datei »INIT-LISP.STB«, die bereits wichtige Funktionen definiert. Wenn Sie »INITLISP.STB« mit dem REN-Befehl von CP/M in »INITLISP« umbenennen und die alte INITLISP-Datei sichern, versteht Lisp auf Anhieb auch Befehle wie MEMBER, REPLACE, MAPCAR und MATCH.

Bei »EPRO« ist auch keine Arithmetik implementiert. Lediglich Zahlen zwischen 0 und etwa 5500 lassen sich durch LESS miteinander vergleichen. Bereits integrierte »Predicates« (Prädikate) umfassen LIST, READ, READLIST, READCHAR, WRITE, OPEN, CREATE, APPEND, CLOSE sowie SAVE und LOAD. Diese Prädikate müssen Sie in Großbuchstaben eingeben, während für den übrigen Text Klein- und Großschrift gemischt erlaubt sind.

Auf der Diskette finden Sie einige Beispielprogramme für E-Prolog. Sie sind mit »(LOAD Name)« zu laden.

SAMPLE.PRO ist eine kleine Datenbank, die Verwandtschafts-Verhältnisse untersucht.

SCIAM.PRO aus der Zeitschrift »Scientific American« klärt mit logischen Schlußfolgerungen endgültig, ob Marcus Cäsar haßte. STUPRO ist eine Befehlserweiterung.

VALGOL.PRO stellt einen Compiler für die Programmiersprache VALGOL-I dar. Der Compiler erzeugt puren Assembler-Quellcode!

Da auf der Leserservice-Diskette genügend Platz war, haben wir noch »DASM«, einen intelligenten Disassembler für Z80-Mnemonics, draufgepackt. Er erkennt selbsttätig Datenbereiche im Programmcode. Weiter finden Sie auf der Diskette »ZMAC« und »ZLINK«, einen Makro-Assembler für den Z80-Prozessor. Und ein besonderer Leckerbissen ist »F83«; ein vollständiger Forth-Compiler, der sogar mehrere Programme gleichzeitig im Multitasking-Verfahren abarbeitet!

(E. Stenzel/ja)



Aus: Happy Computer 12 / 1986, Seite

Links

Copyright-Bestimmungen: siehe Über diese Seite