Der Name MProlog steht für Modular Prolog. MProlog ist das erste kommerzielle Prolog-Entwicklungssystem, das für den ATARI ST erhältlich ist. Für Insider und KI-Spezialisten ist MProlog sicher ein Begriff. Für alle anderen ein kurzer Überblick:
MProlog, eine ursprünglich ungarische Entwicklung, wurde in der leider nicht sehr verbreiteten Compilersprache CDL (Compiler Design Language) geschrieben. CDL-Compiler erzeugen einen hoch-optimierten Code und geben dem Entwickler alle Möglichkeiten, das Letzte aus einem Rechner herauszuholen. In CDL wurden zum Beispiel die Programme der bekannten _Mephisto"-Schachcomputer geschrieben.
MProlog wurde bereits an viele Rechner angepaßt: Von kleinen Geräten, wie IBM PC, Apple Macintosh und jetzt Atari, über Sun, Apollo, VAX und Nixdorf bis hin zu Großrechnern der Marken IBM und Siemens. MProlog kann weltweit mehr als 1000 Installationen in Industrie und Wissenschaft aufweisen.
Die Programme sind bis auf wenige rechnerspezifische Details zwischen den einzelnen Implementierungen auf Quellcodeebene vollständig portabel. Programme, die auf einem günstigen System wie dem Atari ST entwickelt wurden, laufen in ihrer Produktionsversion ohne weiteres auf Rechnern wie VAX oder IBM ab.
Kernstück des Systems ist, wie bei allen Prolog Implementierungen, der Interpreter. Er arbeitet die Programme ab und spuckt die erwarteten Ergebnisse aus. Der MProlog Interpreter erwartet aus Effizienzgründen eine vorverarbeitete Eingabe. Das macht sich dann auch in der Geschwindigkeit bemerkbar: Mit einem mitgelieferten Testprogramm erhält man Werte zwischen 600 und 800 Lips (s. Kasten).
Lips steht für Logical Inferences per Second, das ist: die Anzahl von logischen Schlüssen pro Sekunde. Für die Messung gibt es anscheinend keine bindende Vereinbarung. Meist wird das folgende naive-reverse genannte Programm zur Messung benutzt. Es kehrt eine gegebene Liste um. Die Anzahl der Aufrufe von naive-reverse, die der Interpreter in der Sekunde leistet, ist dann genau die gesuchte Lipszahl.
naive--reverse([XILO],L) :
naive--reverse(L0,L 1), append(L 1,[X],L). naive--everse([],[]).
MProlog hält sich rein syntaktisch an den DEC-10-Standard, weicht jedoch bei der Namensgebung der Prädikate vollkommen davon ab. Das mag den, der bereits Prologerfahrung hat, etwas stören. Nach einer raschen Gewöhnung möchte man die gegenüber dem DEC-10-Standard bessere Gliederung und Vereinheitlichung nicht mehr missen. Für den eingefleischten DEC-10-Fan steht sogar eigens ein Satz an Prädikaten zur Verfügung, die eine Umsetzung von DEC-10 nach MProlog ermöglichen.
Tabelle l: Standardprädikate (Ausschnitt) | |||
! - > < add_statement bag__of concatenate cut __ input is__a output__columns__left read__token signal unread__token usw. |
/ =/= accept__char ancestor channel__state convert del__all__statements key__sort phrase remove__spaces sort value |
+ /= accept__key ancestor__list close__input create__* del_op list__length protected set__cursor string__index var__list |
- < add__op and compare cursor fail modify read set__of system write |
Von vornherein enthält MProlog einen gewaltigen Satz an eingebauten Prädikaten aus allen Sparten (ca. 150 Standardprädikate). Tabelle 1 zeigt ei nen willkürlichen, alphabetischen Ausschnitt.
Die eingebauten Prädikate ermöglichen dem Benutzer z. B. die vollständige Kontrolle über die dynamische Datenbasis. Er kann global oder ganz selektiv einfügen, löschen und zugreifen. Die meisten Prädikate, die die Datenbasis beeinflussen, sind wahlweise auch rücksetzbar: Bei einem Rücksetzen im Suchbaum macht der Interpreter die ausgelösten Effekte wieder rückgängig. Welche Möglichkeiten diese Option bietet, muß ich wohl nicht erklären.
Sehr selten bei Prolog ist der hier vollständig vorhandene Satz an Prädikaten zur Stringbehandlung. Strings können verkettet werden; es ist möglich, Sub strings zu suchen und Strings zu zerteilen. Es gibt ein Prädikat, das die Länge eines Strings liefert und vieles mehr. Außerdem ist es möglich, einen String in eine Liste zu verwandeln; damit stehen alle listenverarbeitenden Prädikate zur Verfügung.
Wichtig für eine Programmiersprache ist das Ein-/Ausgabehandling. Auch hier hat MProlog einiges zu bieten. Die Ein-/Ausgabe ist ähnlich wie in C Stream-orientiert. Das heißt, man ordnet einem Ein- oder Ausgabestrom eine Datei oder ein physikalisches Gerät zu und kann dann einzelne Zeichen, Token oder ganze Statements lesen und schreiben. Wie bei der Datenbasis sind die meisten Prädikate rücksetzbar. Beim Backtracking z. B. werden dadurch bereits gelesene Zeichen in die Eingabe zurückgestellt. Außerdem gibt es spezielle Prädikate zur Abfrage der Tastatur und zur Ausgabe auf den Bildschirm.
Schließlich sollen die Möglichkeiten zur Fehlerbehandlung erwähnt werden. Jedes Prädikat, z. B. auch das ganze Programm, kann in einem protected- (geschützten) Modus aufgerufen werden. Tritt dann ein Fehler auf, so wird ein vom Benutzer definiertes Prädikat aufgerufen, das die Entscheidung über den weiteren Verlauf treffen kann. Diese sogenannten Error-Handler werden auf einem Stack abgelegt, so daß ein nicht abgefangener Fehler an den nächsten Handler weitergereicht wird. Dadurch ist es möglich, eine ausgeklügelte Hierarchie von Fehlerlerbehandlungsprädikaten anzulegen und so eine vollständige Kontrolle des Programms im Fehlerfall zu erhalten.
Der Interpreter bietet darüber hinaus noch Möglichkeiten, bei der Definition eines Prädikats die Reihenfolge festzulegen, in der bei einem späteren Aufruf die Argumente gematcht werden. Weitere Effizienzsteigerungen sind durch die Kennzeichnung von immer gebundenen Variablen möglich. Das weitere Verhalten des Interpreters ist durch eine Menge von Optionen steuerbar.
Für den Insider sei angemerkt, daß MProlog auch die üblichen Prädikate zur Verarbeitung von Definite Clause Grammars beinhaltet und damit die Programmierung von natürlichsprachlichen Interfaces stark erleichtert.
Das MProlog Paket für den Atari schließt eine Grafik ein. Ein Atari-Freak, der erwartet, so einen Durchgriff auf VDI und AES zu haben, muß allerdings enttäuscht werden: Die Grafik selbst benutzt zwar VDI-Aufrufe und erreicht damit die vom Atari gewohnte Geschwindigkeit, der Benutzer hat aber keinen direkten Zugriff. Das hat natürlich seinen Grund: Oberstes Gebot bei MProlog ist, wie schon erwähnt, die Portabilität von Programmen. Durch das Verbot eines direkten Durchgriffs auf Systemebene wird diese Portabilität momentan zwischen den Rechnern IBM PC, Macintosh und Atari erreicht.
Die Grafik selbst beinhaltet dennoch eine interessante Philosophie: Es ist eine von Logo her bekannte TurtleGrafik aber in 3D. Statt der Logo-Schildkröte kann man sich einen Adler vorstellen, der durch den Raum fliegt und dabei eine Farbspur zurückläßt. Man kann den Adler vorwärts und rückwärts, nach rechts und nach links fliegen lassen. Man kann ihn aber auch zu einem Sturzflug veranlassen, oder ihn auf die Seite legen. Die dadurch erzeugte dreidimensionale Flugbahn wird dann vom Syrern wahlweise parallel oder perspektivisch auf den Bildschirm projeziert. Darüber hinaus ist es möglich, Gebiete zu füllen und Text in die Grafik zu schreiben. Es ist sogar ein rudimetärer Verdeckungsalgorithmus vorhanden, der allerdings nur für einen konvexen Körper funktioniert. Zahlreiche Demos zur Grafik werden mitgeliefert. So kann man sich die bekannten Türme von Hanoi als immer kleiner werdende Quader auf dem Bildschirm umschichten lassen.
Vielleicht haben Sie sich schon gefragt, was das Wort modular in MProlog bedeutet. Die Erklärung ist einfach: MProlog bietet die Möglichkeit, Programme in einzelne Module aufzuteilen, wie es etwa in Modula 2 gemacht wird. Ein Modul hat ein Import bzw. Export-Interface, in dem angegeben wird, was außerhalb des Moduls sichtbar ist. Dadurch ist es möglich, die eigentliche Implementierung eines Prädikats nach außen hin zu verbergen und nur eine Schnittstelle für die Benutzung zu bieten.
Es ist bekannt, daß die Aufteilung in Module einen großen Einfluß auf die Wartbarkeit und Anderungsfreundlichkeit von großen Programmsystemen hat. Ein Beispiel für das äußere Erscheinungsbild von MProlog-Programmen sehen sie in Listing 1. Es ist ein Programm, das Strings, die auch die Wildcards '*' und '?' enthalten dürfen, gegeneinander matcht.
Logic Lab heißt Zusammenfassung und Zusammenspiel der Programme im MProlog: Paket. Schauen Sie sich dazu bitte Bild 1 an.
Ganz links oben sehen sie das PDSS (Program Development Support System). Es stellt die Verbindung zwischen Anwender und Interpreter während der Entwicklungsphase eines Programms her. PDSS legt sich wie eine Schale um den Interpreter und übersetzt die Benutzeranfragen an den Interpreter. Integriert ist ein Full Screen Editor, der bei Programmierfehlern automatisch aufgerufen wird und den Cursor genau an die Fehlerstelle positioniert. Dadurch sind syntaktische Fehler sehr schnell zu beheben. PDSS stellt eine Reihe mächtiger Kommandos zum Verwalten und Testen eines Programmsystems zur Verfügung. Es ist möglich, die Benutzersicht auf Modulebene und sogar Definitionsebene zu _fokussieren" und damit gezielt Definitionen innerhalb oder zwischen Modulen zu verschieben und zu verändern. An allen vernünftigen Stellen ist ' *' als Wildcard möglich:
focus Module * Definition test Statement 3 oder kürzer f M * D test S 3
durchsucht alle Module nach der Definition test und richtet den Fokus auf das dritte Statement innerhalb der Definition.
Weiterhin steht ein sehr mächtiger interaktiver Trace zur Verfügung, dessen Benutzung jedoch gerade am Anfang wegen der vielen Möglichkeiten etwas schwierig ist. Es ist möglich, Breakpoints zu setzen oder ein Programm im Einzelschritt zu durchlaufen. Man kann den Interpreter zwingen, ein Prädikat mit succeed oder fall zu verlassen und hat so den Programmfluß voll in der Hand. Es ist möglich, aus dem Trace heraus beliebige PDSS-Kommandos zu geben und sogar einen neuen interaktiven PDSS-Level aufzumachen, um sich nach der Beendigung mit 'bye' wieder an der alten Stelle im Programm zu finden. Die Menge der angezeigten Information läßt sich genau angeben, so daß .man an weniger interessanten Stellen nicht von einem _Wust" von Details überschüttet wird. Der Trace-Mechanismus wird außerdem bei jedem Programmfehler automatisch aktiviert, dabei wird die Fehlerstelle angezeigt.
Hat man sein Programm intensiv ausgetestet, kann eine Standalone-Version erzeugt werden. Dazu übersetzt man die einzelnen Module mit einem Pretranslator (Vorübersetzer) genannten Programm und linkt sie dann mit dem Consolidator zusammen. Nach dem Pretranslator kann man optional den Compiler starten, der eine wesentliche Erhöhung der Ausführungsgeschwindigkeit bewirkt. Das durch den Consolidator erzeugte Programm kann dann direkt dem Interpreter zur Ausführung übergeben werden.
Auch in der Standalone-Version braucht man nicht auf die Testmöglichkeiten zu verzichten: Es ist möglich, PDSS zum Programm dazuzulinken.
Die Atari-Version von MProlog wird unterstützt von den Möglichkeiten, die GEM bietet. Interpreter, Pretranslator und Consolidator sind in GEM eingebunden und werden wie gewohnt über die Menüleiste bedient. Es werden drei Fenster geöffnet: Ein Ein-/Ausgabefenster, ein Editorfenster und ein Grafikfenster.
Weiterhin gibt es einige spezielle Prädikate (nicht portabel):
Der Aufruf
answer ("Titelzeile",X).
öffnet eine Dialogbox mit einer Textzeile. Der vom Benutzer eingegebene Text wird an die Variable X gebunden.
Mit
select__ menu__item(X,"Titel", ["Eintrag1","Eintrag2"]).
wird ein Eintrag in der Menüleiste erzeugt und das selektierte Item an X gebunden.
An allen Stellen (auch in einem Programm), an denen Dateinamen verwendet werden, wird - falls der Name Wildcards enthält - automatisch die bekannte Atari-File-Selektorbox geöffnet.
Nach soviel Erfreulichem sollen auch einige Nachteile zur Sprache kommen. Der größte dürfte der bekannte Speicherhunger von Prolog sein. MProlog macht da keine Ausnahme. Die Herstellerfirma gibt an, daß dem Interpreter in der Zusammenstellung Controlaccessory und Festplatte noch 606 KB Speicher zur Verfügung stehen. Dabei darf man jedoch nicht vergessen, daß während der Entwicklungsphase davon noch der Anteil von PDSS abgezogen wird. Für kleinere und mittlere Anwendungen mag der Platz noch ausreichend sein, wer aber ein Expertensystem schreiben will, sollte seinen Rechner doch möglichst auf 2 MByte aufstocken. Zu bedenken ist auch, daß Prolog als Interpretersprache mit dynamischen Datenstrukturen von Zeit zu Zeit eine GarbageCollection durchführen muß. Je weniger Speicher vorhanden ist, um so öfter wird dieser Vorgang erforderlich.
Ein weiterer kleiner Minuspunkt ist die Dokumentation. Trotz des Umfangs von fast 700 Seiten ist sie an manchen Stellen etwas knapp ausgefallen und für Anfänger auf jeden Fall völlig ungeeignet. Zudem muß man sich seine Information teilweise recht mühsam zusammensuchen. Bisweilen mangelt es an Beispielen. Die Dokumentation wird dadurch eher zu einem Nachschlagewerk für den erfahrenen Benutzer. Die Firma epsilon liefert allerdings auf Wunsch ein "Primer" genanntes Paket, daß sehr ausführlich und auch für den Anfänger verständlich in Prolog einführt. Dieser Primer ist allerdings im Standardlieferumfang nicht enthalten.
MProlog ist ein durch und durch professionelles Programmpaket und zielt als solches auch auf den professionellen Markt. Allein der Preis verbietet eigentlich Hobbyanwendungen. MProlog enthält alles, was zu einer Entwicklung von großen Programmsystemen im Bereich der KI notwendig ist. epsilon stellt dem Anwender außerdem Hilfen in Form von Wartungsverträgen und vierteljährlichen Seminaren in Berlin und Karlsruhe zur Verfügung.
MProlog auf Atari, IBM oder Macintosh stellt im Moment, trotz des Preises, die weitaus günstigste Möglichkeit zu professionellen, portablen Entwicklungen im Bereich der künstlichen Intelligenz dar. Allerdings sollte man seinem Rechner soviel Speicher wie möglich zur Verfügung stellen.
Programm:
MPROLOG - modulares Prolog + Entwicklungsumgebung.
Version:
Release 2.1 ab ca.. Juni/Juli 87, dann 2.2.
Lieferumfang:
2 Disketten 720 KB (wahlweise 3 a 360 KB) mit Interpreter, Pretranslator, Consolidator, PDSS Entwicklungssystem und Beispielprogrammen. Ordner mit ca. 700 Seiten Dokumentation (englisch).
Anforderungen:
Atari ST mit 1 MByte RAM, TOS im ROM, 1 einseitiges Laufwerk. Empfohlen: Speicher > 1MByte und Festplatte.
Datentypen: Strukturen, Strings, Listen. Integer: -223 - 1 bis 223 Real: (64 Bit IEEE) -1.8 * 10308 - 1.8 * 10308
Geschwindigkeit: Interpreter: 800 Lips (Logical Inferences per s) Compiler: 15 Klips werden erwartet.
Preis: 998,- Release 2.1 ohne Compiler 1.498,- Release 2.2 mit Compiler (ab Juni/Juli 87)
Bezug:
epsilon Gesellschaft für Softwaretechnik und Systementwicklung, Kurfürstendamm 188/189, D-1000 Berlin 15