home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 01 / statis / statis.doc < prev    next >
Encoding:
Text File  |  1987-07-03  |  51.2 KB  |  934 lines

  1.  
  2.  
  3.                          PRAKTISCHE ERFAHRUNGEN MIT
  4.                                 TURBO-PROLOG
  5.  
  6.                     Erfahrungbericht  eines  "ganz  nor-
  7.                     malen" Programmierers über eine  Be-
  8.                     gegnung der dritten Art.
  9.  
  10.                     Um es gleich vorweg zu  sagen,  wenn 
  11.                     mir vor  einem  Jahr  jemand  gesagt 
  12.                     hätte, daß ich  heute  in  und  über 
  13.                     Prolog  schreibe,  dann  hätte   ich 
  14.                     zumindest an  dessen  Zurechnungsfä-
  15.                     higkeit gezweifelt.  Das  sieht  man 
  16.                     auch an meinem Artikel in der PASCAL 
  17.                     Nr. 1, wo ich Prolog nur vom  Papier 
  18.                     her kannte.
  19.                     Nun grassierten aber  schon  längere 
  20.                     Zeit Storys und Gerüchte in den  Me-
  21.                     dien mit Stichworten wie AI (Artifi-
  22.                     cial Intelligence), Expertensysteme, 
  23.                     intelligente Datenbanken, 5.  Compu-
  24.                     tergeneration, etc..
  25.                     Ich  ließ  mich  aber  nicht  weiter 
  26.                     irritieren, freute  mich  an  Turbo-
  27.                     Pascal, programmierte AI-Spielereien 
  28.                     in LOGO auf einer  Z80-Maschine  und 
  29.                     staunte ansonsten über die horrenden 
  30.                     Preise die für Prolog- und  Lisp-Sy-
  31.                     steme verlangt wurden.
  32.                     Dann erschienen  erste  "Tests"  von  
  33.                     Turbo-Prolog  in  Fachzeitschriften. 
  34.                     Die Anführungsstriche habe ich  hier 
  35.                     mit Bedacht gewählt. Also, ohne mei-
  36.                     nen Kollegen  von  der  schreibenden 
  37.                     Zunft etwas  zu  wollen:  in  diesen 
  38.                     "Tests" wurde, von wenigen Ausnahmen 
  39.                     abgesehen,  die   Benutzeroberfläche 
  40.                     beschrieben,  bestaunt  wie  schnell 
  41.                     der Compiler ist und zum etwa  36ig-
  42.                     sten Mal das Beispiel mit  den  Ver-
  43.                     wandschaftsverhältnissen  (oder  al-
  44.                     ternativ  "Türme  von  Hanoi")   ge-
  45.                     bracht. Ansonsten  blieb  stets  das 
  46.                     Gefühl zurück, daß kein  Mensch  ei-
  47.                     gentlich so genau wußte, was der Ot-
  48.                     to-Normal-Hobby- oder  auch  Berufs-
  49.                     programmierer eigentlich mit dem Sy-
  50.                     stem anfangen soll. 
  51.                     In dieser Situation fand ich, dessen 
  52.                     einzige AI-Sprachen-Erfahrung in ei-
  53.                     nigen Stunden Lisp auf  einem  Groß-
  54.                     rechner   (abschreckend!)   bestand,  
  55.                     mich wieder, als  das  Schicksal  in 
  56.                     Gestalt meines Chefredakteurs (Wort-
  57.                     laut: "Du willst doch auf  dem  lau-
  58.                     fenden bleiben.") mich in  die  Arme 
  59.                     von Turbo-Prolog trieb. Da  saß  ich 
  60.                     nun mit  zwei  Disketten  und  einem 
  61.                     englischen Handbuch vor meinem Rech-
  62.                     ner, im Ohr Sprüche die  jüngst  auf 
  63.                     einem  AI-Kongress   gefallen   sind 
  64.                     (sinngemäß:  "Turbo-Prolog?   Micky-
  65.                     Maus-System!") und im Kopf die Über-
  66.                     legung ob so ein  Möchtegern-16 Bit-
  67.                     Rechner mit so was nicht doch  über-
  68.                     fordert ist. (Übrigens... Hinweis an 
  69.                     die Herren Experten: Wenn ich versu-
  70.                     chen würde eine  Expertensystembasis 
  71.                     für 20000 DM  (!)  an  den  Mann  zu 
  72.                      bringen, würde ich wohl auch  solche 
  73.                     Sprüche klopfen.). 
  74.                     Und da die üblichen Schlagworte  nun 
  75.                     schon einmal gefallen  sind,  möchte 
  76.                     ich an dieser Stelle versuchen, ein-
  77.                     mal einige  Mißverständnisse  auszu-
  78.                     räumen, die durch eine unsaubere Be-
  79.                     griffsfindung in den  Medien  aufge-
  80.                     treten sein können:
  81.                     1. Turbo-Prolog ist kein Expertensy-
  82.                     stem.
  83.                     2. Turbo-Prolog ist kein  Datenbank-
  84.                     system.
  85.                     3.  Turbo-Prolog  verkörpert  selber 
  86.                     keine künstliche Intelligenz.
  87.                     (Die Übersetzung  "Intelligenz"  für 
  88.                     "intelligence" geht  übrigens  haar-
  89.                     scharf an der Bedeutung vorbei. Sie-
  90.                     he auch CIA.)
  91.                     4. Programmieren muß man immer  noch 
  92.                     selber.
  93.                     Aber: Die Punkte 1-3  kann  man  mit 
  94.                     Prolog-Programmen erfüllen.
  95.                     (Genauere  Definitionen  dieser  Be-
  96.                     griffe finden  Sie  in  dem  Bericht 
  97.                     über den AI-Kongreß in dieser Ausga-
  98.                     be.)
  99.  
  100.                     Meine ersten Kontakte mit Turbo-Pro-
  101.                     log waren erstmal nur  positiv.  Das 
  102.                     System war schnell, komfortabel (oh-
  103.                     ne zu einem nagetiergesteuerten  Vi-
  104.                     deospiel zu entarten) und die Einar-
  105.                     beitung fiel  mit  den  Beispielpro-
  106.                     grammen ziemlich  leicht.  Besonders 
  107.                     positiv fiel mir z.B. auf,  daß  das 
  108.                     System, wenn man  eine  Datei  laden 
  109.                     will und den Namen nicht kennt, beim 
  110.                     "leeren" drücken von RETURN die  Na-
  111.                     men aller Files im aktuellen  Direc-
  112.                     tory zur Verfügung stellt. Dies  ist 
  113.                     zwar kein Zeichen von wie auch immer 
  114.                     gearteter Intelligenz, aber ein Hin-
  115.                     weis darauf, daß  die  Programmierer 
  116.                     des System erstens Praktiker  waren, 
  117.                     und zweitens  für's  Denken  bezahlt 
  118.                     wurden (und nicht für Anschläge  pro 
  119.                     Minute). Es ist wohl generell  posi-
  120.                     tiv zu werten, wenn  so  ein  System 
  121.                     von Praktikern geschaffen wird,  und 
  122.                     nicht von irgendwelchen  Esoterikern 
  123.                     in ihren Elfenbeintürmen. 
  124.                     Extrem hilfreich ist  auch  das  On-
  125.                     line-Manual, das durch  drücken  von 
  126.                     F1 erreichbar ist, und wildes  blät-
  127.                     tern im Handbuch nach Tastenbelegun-
  128.                     gen und Predikatennamen erspart. An-
  129.                     genehm im Zeitverhalten  macht  sich 
  130.                     auch bemerkbar, daß der Compiler in-
  131.                     crementell arbeitet.  D.h.  das  er, 
  132.                     wenn man aus dem Dialog  mit  F9  in 
  133.                     den  Editor  geht,  dort  Änderungen 
  134.                     vornimmt  und  mit  F10  wieder   zu 
  135.                     Dialog übergeht, nur die  geänderten 
  136.                     Teile neu compiliert, wie  er  über-
  137.                     haupt für den Dialog nur  die  benö-
  138.                     tigten Predikate übersetzt.
  139.                     Dabei war recht schnell  zu  merken, 
  140.                     daß in Prolog z.B.  eine  wissensba-
  141.                     sierte, "intelligente" Datenbank mit 
  142.                      wenigen  Zeilen  zu  schreiben  ist. 
  143.                     Such- und Sortieralgorithmen entfal-
  144.                     len durch  das  Backtracking  (s.u.) 
  145.                     quasi völlig. Da ich in diese  Rich-
  146.                     tung  aber  keine  Intentionen  habe 
  147.                     (ich bin  Naturwissenschaftler,  und 
  148.                     meine 20 Schallplatten kann ich  ge-
  149.                     rade noch so eben im  Kopf  "verwal-
  150.                     ten"), war meine nächste Idee, ange-
  151.                     sichts der  phantastischen  Möglich-
  152.                     keiten für Benutzeroberflächen,  mit 
  153.                     Turbo-Prolog eine "Shell" (UNIX-Neu-
  154.                     Deutsch) für Numerikprogramme  (z.B. 
  155.                     statistische  Meßwertauswertung)  in 
  156.                     anderen Programmiersprachen  (Pascal 
  157.                     und FORTRAN) zu schreiben. 
  158.                     Die Tücke lag wie üblich im  Detail, 
  159.                     Murphy  hatte  infolgedessen  wieder 
  160.                     alle Chancen zuzuschlagen,  und  die 
  161.                     Linkerei sowohl  mit  IBM-Professio-
  162.                     nal-FORTRAN als auch  mit  MS-Pascal 
  163.                     ging prompt  in  die  Hose.  (Turbo-
  164.                     Pascal ist leider erst in der  näch-
  165.                     sten Version linkfähig.)  Aber  dazu 
  166.                     weiter unten mehr.
  167.                     (Fast)  unverdrossen   (jetzt   erst 
  168.                     recht!) machte ich mich  daran,  das 
  169.                     zu tun, was angeblich eine  Schwach-
  170.                     stelle aller AI-Sprachen sein  soll, 
  171.                     nämlich numerische Sachen in  Prolog 
  172.                     zu programmieren.  (Ich  erdreistete 
  173.                     mich also, ein  ganz  normales  Pro-
  174.                     gramm schreiben zu wollen.)
  175.                     Bevor ich meine  Vorgehensweise  und 
  176.                     meine  Klauseln  näher   beschreibe, 
  177.                     möchte ich aber  noch  die  von  mir 
  178.                     verwendeten  Konventionen  erläutern 
  179.                     (scheinen auch so unsinnig nicht  zu 
  180.                     sein).  Wie es   anscheinend  üblich 
  181.                     ist, stehen die Input-Parameter  ei-
  182.                     nes Predikats links im Kopf, während 
  183.                     die Output-Parameter  rechts  stehen 
  184.                     (solange das Predikat  nicht  "umge-
  185.                     kehrt" verwendet wird). Ich habe die 
  186.                     Wahlfreiheit von  Turbo-Prolog  aus-
  187.                     genutzt was den Syntax von "IF" bzw. 
  188.                     ":-"  und  "AND"  bzw.  ","  angeht.  
  189.                     Falls es  mir  auf  den  prozedualen 
  190.                     Charakter der Klausel ankommt, diese 
  191.                     also im wesentlichen aus  Predikaten 
  192.                     besteht,  die  immer   "successfull" 
  193.                     sind und nur Seiteneffekte wie Wert-
  194.                     zuweisungen und I/O-Operationen  ha-
  195.                     ben, verwende ich ":-" und ",". Wenn 
  196.                     ich hingegen den logischen Charakter 
  197.                     betonen möchte,  verwende  ich  "IF" 
  198.                     und "AND". Beim  Einsetzen  des  Cut 
  199.                     zur Ablaufsteuerung mische ich  auch 
  200.                     schon einmal beide Notationen.  Pre-
  201.                     dikate, die nur Hilfsfunktionen  für 
  202.                     ein  anderes  sind,  stehen  (soweit 
  203.                     möglich) unmittelbar unter diesem. 
  204.                     Ich begann mit dem, was in dem  Lis-
  205.                     ting  als  mathematischer  Teil  be-
  206.                     zeichnet  ist.  Hier  implementierte 
  207.                     ich  Predikate,  die  standardmäßige 
  208.                     statistische   Berechnungen   machen 
  209.                     können (---> siehe  auch  Mathemati-
  210.                     scher Background).  Zur  Representa-
  211.                     tion meiner Liste von Werten  wählte 
  212.                      ich (nah, wer hätt's  gedacht)  eine 
  213.                     Liste von REALs. 
  214.                     Um mehrere  Datensätze  gleichzeitig 
  215.                     verwalten zu können, werden die Wer-
  216.                     te und Bezeichnungen für  eine  Meß-
  217.                     reihe zusammen mit einem  Stichwort, 
  218.                     das zur Identifikation dient, in ei-
  219.                     nem Verbundtyp mit dem assert-Predi-
  220.                     kat in die Datenbasis eingefügt. Da-
  221.                     her resultiert der  Menuepunkt  "Da-
  222.                     ten-Setup" bei dem dieses  Stichwort 
  223.                     und  Variablenbezeichnungen  verein-
  224.                     bart werden. "Natürlich" werden  bei 
  225.                     Anfragen  alle   schon   vorhandenen 
  226.                     Stichworte in  einem  Fenster  ange-
  227.                     zeigt. Das Suchen dieser  Stichworte 
  228.                     wird sehr elegant mit dem Systempre-
  229.                     dikat  "findall"  in   "zeige_alle_-
  230.                     Stichworte" erledigt.
  231.                     Diese Vorgehensweise  hat  auch  den 
  232.                     Vorteil, daß diese häufig benötigten 
  233.                     Größen nicht ständig  als  Parameter 
  234.                     mitgeschleppt werden müssen, sondern 
  235.                     quasi global sind.  Die  gesammelten 
  236.                     Eingaben  einer   "Sitzung"   können 
  237.                     abgespeichert und später auch wieder 
  238.                     geladen  werden.  Selbstverständlich 
  239.                     können eingegebene Werte auch wieder 
  240.                     geändert werden. 
  241.                     Der erste Stolperstein war die  Tat-
  242.                     sache, daß ich alle  Daten  rekursiv 
  243.                     verarbeiten  mußte.  Das  Kochrezept 
  244.                     dafür ist aber  recht  einfach,  wie 
  245.                     ich am Beispiel einer  Aufsummierung 
  246.                     der Elemente einer  Liste  erläutern 
  247.                     möchte (hier hab' ich mich das erste 
  248.                     Mal gefragt, was eigentlich das  Ge-
  249.                     rede soll, daß angeblich  in  Prolog 
  250.                     alles, was in anderen  Sprachen  üb-
  251.                     lich ist, ach so schwierig sei). Als 
  252.                     erstes kommt die Klausel für den Re-
  253.                     kursionsabbruch.  Hier  das   Faktum 
  254.                     listsum([],0), da trivialerweise die 
  255.                     Summe  der  Elemente  einer   leeren 
  256.                     Liste 0 sein  muß.  Dann  kommt  als 
  257.                     zweite Klausel die Regel für  nicht-
  258.                     leere Listen, und  zwar  trennt  man 
  259.                     schon im Kopf der  Klausel  mit  dem 
  260.                     "|"-Operator den Kopf der Liste  vom 
  261.                     Schwanz ab, listsum([H|T],Res).  Res 
  262.                     ist die Rückgabevariable  der  Klau-
  263.                     sel. Dann macht  man  im  Rumpf  der 
  264.                     Klausel als erstes  den  Rekursions-
  265.                     aufruf mit dem Schwanz der Liste und 
  266.                     einer neuen Variablen für  das  Zwi-
  267.                     schenergebniss, listsum(T,Res).  Als 
  268.                     letzter Schritt wird der  Ergebniss-
  269.                     variablen der Klausel die Summe  aus 
  270.                     dem Kopf der Liste und dem Zwischen-
  271.                     ergebniss  zugewiesen,  Res  =  H  + 
  272.                     NRes. Jemand der andere Programmier-
  273.                     sprachen gewohnt ist,  wird  fragen, 
  274.                     warum unbedingt eine  neue  Variable 
  275.                     NRes benötigt wird, schließlich gin-
  276.                     ge auch listsum(T,Res), Res = Res  + 
  277.                     H.  Aber: in Prolog kann  nur  einer 
  278.                     ungebundenen  Variable  (ohne  Wert) 
  279.                     ein Wert zugewiesen werden. Wenn die 
  280.                     Variable schon gebunden  ist,  wirkt 
  281.                     das Predikat "=" nur noch  als  Ver-
  282.                      gleichsoperator. Die  Bindung  einer 
  283.                     Variablen kann nur durch  ein  Back-
  284.                     tracking, das durch das "Fail" einer 
  285.                     Klausel ausgelöst wurde,  rückgängig 
  286.                     gemacht werden (s.u.). Sämtliche da-
  287.                     tenverarbeitenden Klauseln  arbeiten 
  288.                     nach diesem  rekursiven  "teile  und 
  289.                     beherrsche"-Prinzip.
  290.                     Das Schreiben solcher Predikate wird 
  291.                     einem von Turbo-Prolog  sehr  leicht 
  292.                     gemacht, da alle wesentlichen trans-
  293.                     zendenten  Funktionen  ("sqrt")  vom 
  294.                     System   zur   Verfügung    gestellt 
  295.                     werden.
  296.                     Als es nun darum ging die  Benutzer-
  297.                     oberfläche zu realisieren, habe  ich 
  298.                     erstmal das vermutlich einzig  rich-
  299.                     tige getan, nämlich nachgeguckt  was 
  300.                     an Material so alles  vorhanden  ist 
  301.                     (aufhören das Rad neu zu  erfinden). 
  302.                     Eine wahre Fundgrube ist  dabei  das 
  303.                     Geobase-Programm, wie überhaupt auch 
  304.                     die mitgelieferten Beispiele  allein 
  305.                     schon ihr Geld wert  sind.  Fenster-
  306.                     handling wird vom System ja  ohnehin 
  307.                     unterstützt, und im Geobase ist  ein 
  308.                     Modul  vorhanden,  das   PopUp-Menüs 
  309.                     produziert. Dies änderte ich  soweit 
  310.                     ab, daß man die zu benutzenden  Fen-
  311.                     sternummern  parametrisch  übergeben 
  312.                     kann, und übernahm es ansonsten  un-
  313.                     verändert mit den benötigten  Hilfs-
  314.                     predikaten in mein Programm.  (Teile 
  315.                     aus den Demoprogrammen sind übrigens 
  316.                     an der englischen Kommentierung  er-
  317.                     kennbar.) 
  318.                     Gewöhnungbedürftig ist die Realisie-
  319.                     rung  von  Fallunterscheidungen  bei 
  320.                     der Ablaufsteuerung (z.B.  Menue-Op-
  321.                     tionen). Hier wird  für  jeden  Fall 
  322.                     der  auftreten  kann,  eine   eigene 
  323.                     Klausel geschrieben. Dabei wird  die 
  324.                     eigentliche Fallunterscheidung durch 
  325.                     den Klauselkopf oder  Vergleiche  zu 
  326.                     Beginn des Klauselrumpfs gemacht.
  327.                     Um auch einen  angemessenen  Komfort 
  328.                     bei der Dateneingabe  (Programmteile 
  329.                     Dateneditor und Mini-Parser) zu  er-
  330.                     reichen, benutzte ich natürlich  den 
  331.                     Systemeditor. Bei diesem gibt es die 
  332.                     Möglichkeit,  schon   einen   Input-
  333.                     String zu übergeben, so daß man qua-
  334.                     si eine Maske vorgeben kann.  Leider 
  335.                     wurde  eine  Möglichkeit  vergessen, 
  336.                     den Benutzer daran zu hindern diesen 
  337.                     String zu manipulieren,  so  daß  es 
  338.                     passieren kann, daß der Benutzer un-
  339.                     beabsichtigt  Bildschirmmasken  zer-
  340.                     stört. Dies muß dann in dem  Filter-
  341.                     Predikat, das die Maske  wieder  aus 
  342.                     dem Rückgabestring entfernt, berück-
  343.                     sichtigt werden. Hier war die  Sache 
  344.                     insofern einfach, als daß die  "Mas-
  345.                     ke" nur aus  den  Überschriften  der 
  346.                     Eingabetabelle besteht.  Der  einge-
  347.                     bene String dann wird mit dem Predi-
  348.                     kat fronttoken  in  einzelne  Zahlen 
  349.                     "zerpflückt". Man muß allerdings be-
  350.                     achten, bei dieser "Filterung" Leer-
  351.                     zeichen und Zeilenvorschübe nicht zu 
  352.                      entfernen. Da  es  häufig  vorkommt, 
  353.                     daß z.B.  bei  einer  Messung  lange 
  354.                     Zeit derselbe  Wert  gemessen  wird, 
  355.                     können Wiederholungen in den  Tabel-
  356.                     lenspalten mit einem "w"  eingegeben 
  357.                     werden. Berücksichtigen muß man  bei 
  358.                     der Zerlegung des Strings die unter-
  359.                     schiedlichen Spaltenzahlen der  Ein-
  360.                     gabetabelle (1 oder 2  dim.  Vertei-
  361.                     lungen, Fehler bekannt oder nicht).
  362.                     Der Graphikteil für zweidimensionale 
  363.                     Verteilungen  wurde  so  konzipiert, 
  364.                     daß der  Benutzer  Begrenzungen  der 
  365.                     Graphik, Achsenschnittpunkt und Ach-
  366.                     senteilung vor der Darstellung fest-
  367.                     legt. Die Meßwerte werden als Kreuze 
  368.                     (gegebenenfalls  mit   Fehlerbalken) 
  369.                     dargestellt. Durch  die  Punkteschar 
  370.                     wird eine  Ausgleichsgrade  gezeich-
  371.                     net. In der Realisierung hat es sich 
  372.                     als günstig erwiesen, die  Benutzer-
  373.                     koordinaten zentral in Bildschirmko-
  374.                     ordinaten umzurechnen,  da  man  da-
  375.                     durch im Graphikteil eine Menge  Pa-
  376.                     rameter spart. Auf automatische Ska-
  377.                     lierung und Beschriftung der  Achsen 
  378.                     wurde verzichtet, weil das doch  den 
  379.                     Rahmen dieses Beispielprogramms  ge-
  380.                     sprengt hätte. Der Leser sollte dies 
  381.                     aber, wie auch das  ganze  Programm, 
  382.                     als Anregung zum experimentieren und 
  383.                     weiterentwickeln auffassen.
  384.                     Paradoxerweise  wird  der  Hauptteil 
  385.                     des Programms von der  Benutzerober-
  386.                     fläche ausgemacht, während  der  ei-
  387.                     gentliche Rechenteil nur ca. 50 Zei-
  388.                     len lang ist. Hierbei muß  man  aber 
  389.                     bedenken, daß das Programm in  einer 
  390.                     anderen Sprache geschrieben, wohl um 
  391.                     vielfaches länger wäre, und daß  ein 
  392.                     Prolog-Profi für diese Programm wohl 
  393.                     nur  halb  soviel  Zeilen  gebraucht 
  394.                     hätte. Hier kommt es sehr stark  auf 
  395.                     die  Effizients  des   Ansatzes   an 
  396.                     (Nachdenken lohnt sich).  Ich  hänge 
  397.                     hier wohl noch zu stark prozeduralen 
  398.                     Denken an.
  399.  
  400.  
  401.                     Backtracking und der "Cut":
  402.                     Es ist häufig günstig,  insbesonders 
  403.                     wenn viele Klauseln zu ein und  dem-
  404.                     selben Predikat existieren,  an  dem 
  405.                     Faktum  für  den  Rekursionsabbruch, 
  406.                     oder ähnlichen Stellen, einen Regel-
  407.                     teil zu schreiben, der lediglich ei-
  408.                     nen Cut ("!") enthält. Dies hat fol-
  409.                     gende Funktion:
  410.                     Normalerweise geht Prolog seine Wis-
  411.                     sensbasis von oben nach unten  durch 
  412.                     und versucht die Klauseln der Predi-
  413.                     kate zu erfüllen. Wenn eine  Klausel 
  414.                     nicht erfüllbar ist,  geht  das  Sy-
  415.                     stem, falls Alternativwege zur  Ver-
  416.                     fügung stehen, zurück bzw.  versucht 
  417.                     die  nächste  Klausel  zu  erfüllen. 
  418.                     Dieser Prozeß wird Backtracking  ge-
  419.                     nannt. Aber auch  wenn  die  Klausel 
  420.                     erfüllbar war, versucht  das  System 
  421.                     noch andere Lösungen zu  finden.  In 
  422.                      praxi sieht es aber oft so aus,  daß 
  423.                     es   Erfahrungswerte   (Heuristiken) 
  424.                     gibt, daß, wenn ein bestimmter Punkt 
  425.                     erreicht  wird,  es  keine  Lösungen 
  426.                     (mehr) gibt, oder  man  ist  ohnehin 
  427.                     nur an einer Lösung interessiert. An 
  428.                     solchen Stellen kann man  einen  Cut 
  429.                     setzen, um dem  System  mitzuteilen, 
  430.                     daß es weitere Suche an vorhergegan-
  431.                     genen   Verzweigungen    unterlassen 
  432.                     möge, wenn  es  diese  Stelle  über-
  433.                     schritten hat. 
  434.                     An diese Stelle gehört auch der Hin-
  435.                     weis, daß der Cut unbedingt  notwen-
  436.                     dig ist, um effektive Expertensyste-
  437.                     me zu  schreiben.  Es  ist  naiv  zu 
  438.                     glauben, daß es ausreicht,  das  Sy-
  439.                     stem mit einem Wust  an  Fakten  und 
  440.                     Regeln zu füttern,  und  zu  denken, 
  441.                     der Rechner wird schon  eine  Lösung 
  442.                     finden. Dies scheitert an der Reali-
  443.                     tät der heutigen Maschinen, da  kein 
  444.                     Rechner schnell genug  ist,  um  mit 
  445.                     der Kombinatorischen Explosion  fer-
  446.                     tig zu werden, von  Schwierigkeiten, 
  447.                     wie   Rekursionsstacküberlauf   u.ä. 
  448.                     ganz  abgesehen.  Der  Programmierer 
  449.                     muß bei größeren Systemen sein Welt-
  450.                     wissen in Form der Steuerung mit dem 
  451.                     Cut einbringen.
  452.                     Leider hat  der  Cut  auch  negative 
  453.                     Auswirkungen, da er häufig die Wirk-
  454.                     samkeit eines Predikats  für  "beide 
  455.                     Richtungen" (Analyse  und  Synthese) 
  456.                     beeinträchtigt. Dies ist  aber  eine 
  457.                     der  Hauptforderungen  der   Prolog-
  458.                     "Philosophie". In  dem  vorliegenden 
  459.                     Programm habe ich darauf aber  keine 
  460.                     größere Rücksicht genommen (prozedu-
  461.                     raler Charakter). Auf dieses Problem 
  462.                     möchte ich aber in einer der folgen-
  463.                     den Ausgaben eingehen.
  464.  
  465.  
  466.                     "Narrensicherheit" von Turbo-Prolog:
  467.                     Bei meinen ersten Gehversuchen hatte 
  468.                     ich  hinreichende  Gelegenheit,  mit 
  469.                     den informativen  und  meistens  den 
  470.                     Punkt treffenden Fehlermeldungen des 
  471.                     Systems  Bekanntschaft  zu   machen. 
  472.                     Auch Laufzeitfehler wurden gut abge-
  473.                     fangen (einschließlich Endlosschlei-
  474.                     fen). 
  475.                     Derart in  Sicherheit  gewiegt  ver-
  476.                     nachlässigte ich  das  Zwischenspei-
  477.                     chern. Die  Strafe  folgte  auf  dem 
  478.                     Fuße. Ich machte einen  Fehler,  der 
  479.                     wohl so idiotisch  ist,  daß  keiner 
  480.                     damit gerechnet  hat,  daß  man  ihn 
  481.                     überhaupt machen  könnte;  und  zwar 
  482.                     verwendete ich ein Database-Predikat 
  483.                     als Verbundparameter in einer  Klau-
  484.                     sel (wie ich  darauf  gekommen  bin, 
  485.                     wissen nur die Götter). Als das Pro-
  486.                     gramm merkwürdige Ergebnisse liefer-
  487.                     te, wollte ich  der  Sache  mit  der 
  488.                     Trace-Funktion auf den Grund  gehen. 
  489.                     Dabei konnte ich beobachten wie  das 
  490.                     System konfuss  im  Programm  herum-
  491.                     sprang und dieses mit einer  ansehn-
  492.                      lichen Sammlung  Sonderzeichen  ver-
  493.                     zierte.  Anscheinend  versuchte   es 
  494.                     verzweifelt, die  Database  mit  den 
  495.                     übergebenen Parametern zu  vereinba-
  496.                     ren. Meinen anschließenden  (zugege-
  497.                     bener Maßen nicht besonders intelli-
  498.                     genten) Versuch die kläglichen Reste 
  499.                     zu  sichern,  nutzte  das  waidwunde 
  500.                     System um der Programm- und  BackUp-
  501.                     Datei den Gnadenstoß  zu  versetzen, 
  502.                     und  anschließend  mit  jämmerlichen 
  503.                     Piepsen   selber   in   die   ewigen 
  504.                     Jagdgründe einzugehen. (Folge dieser 
  505.                     Erfahrung: 6 Stunden Tipparbeit  an-
  506.                     hand  eines  Listings.)  Anscheinend 
  507.                     ist es wohl doch nicht möglich,  ein 
  508.                     System  gegen  den  Einfallsreichtum 
  509.                     menschlicher  Unvernunft  vollkommen 
  510.                     abzusichern.
  511.                     Etwas empfindlich scheint das System 
  512.                     auch  bei  großen   Programmen   mit 
  513.                     schlecht definierten  Klauseln,  die 
  514.                     hohen Rekursionsgrad mit  intensivem 
  515.                     Backtracking kombinieren, zu reagie-
  516.                     ren, wenn man diese mit  der  Trace-
  517.                     funktion verfolgt.  Dort  kollidiert 
  518.                     anscheinend  der  große  Platzbedarf 
  519.                     der Trace-Funktion  mit  dem  Expan-
  520.                     sionsdrang der Klausel, was     dann 
  521.                     zu "merkwürdigen"  Verhalten  führt. 
  522.                     Dies läßt sich aber  leicht  vermei-
  523.                     den, indem man Rekursionen  "anstän-
  524.                     dig" terminieren läßt.
  525.                     Vorsicht geboten ist auch  wenn  man 
  526.                     Graphikbefehle verwendet, obwohl man 
  527.                     gar nicht im Graphikmodus  ist.  Da-
  528.                     raus können arithmetische Fehler (?) 
  529.                     wie Division durch Null resultieren.
  530.  
  531.  
  532.  
  533.  
  534.                     Laufzeitverhalten von Turbo-Prolog:
  535.                     Im  amerikanischen   Orginalhandbuch 
  536.                     wird ziemlich dreist mit der Aussage  
  537.                     "Programme die schneller  ausgeführt 
  538.                     werden, als diejenige auf den Proto-
  539.                     typen des japanischen  '5th  Genera-
  540.                     tion Project'" geworben, und irgend-
  541.                     wo im Hinterkopf habe ich auch,  daß 
  542.                     schon der Satz  "bis  zu  10000  mal 
  543.                     schneller als herkömmliche  Systeme" 
  544.                     gefallen ist. Hierbei muß  man  wis-
  545.                     sen, daß die Hardware dieser  Proto-
  546.                     typen direkt auf Prolog  zugeschnit-
  547.                     ten ist, so daß solche Aussagen  ei-
  548.                     gentlich unglaubwürdig sind.
  549.                     Ich suchte  dann  eine  M╙glichkeit, 
  550.                     mir einen Eindruck von dem Geschwin-
  551.                     digkeiten  des  Systems  zu  machen. 
  552.                     Meine erste Idee  war,  dies  anhand 
  553.                     eines  größeren  Programms,  nämlich 
  554.                     GEOBASE, zu testen. Aber dabei konn-
  555.                     te ich  letztlich  nur  feststellen, 
  556.                     das Abfragen, die bei  der  Abarbei-
  557.                     tung   Heuristiken   nutzen,   enorm 
  558.                     schnell abgearbeitet  werden  (keine 
  559.                     messbare   Reaktionszeit),   während 
  560.                     nicht-deterministische   Abarbeitung 
  561.                     durchaus einige Sekunden dauern kann 
  562.                      (fragen Sie  mal  nach  der  größten 
  563.                     Stadt). Hier kocht auch Borland  nur 
  564.                     mit Wasser.
  565.                     Zufällig fiel mir  ein  Artikel  aus 
  566.                     der "Computer Persönlich"   9/86  in 
  567.                     die  Hände,  wo  die  Laufzeit   von 
  568.                     "Türme von  Hanoi"  (ich  weiß,  arg 
  569.                     strapaziert) für mehrere Systeme ab-
  570.                     gedruckt war. Das schnellste, compi-
  571.                     lierende System brauchte dort für  9 
  572.                     Scheiben 1.3  Sekunden  (ohne  Bild-
  573.                     schirmausgabe). Beispielprogramm  55 
  574.                     nutzt exakt  denselben  Algorithmus. 
  575.                     Ich ließ das Programm  laufen  (ohne 
  576.                     Bildschirmausgabe),  mußte  aber  zu 
  577.                     meiner Verblüffung feststellen,  daß 
  578.                     das Programm so  schnell  lief,  daß 
  579.                     ich keine Laufzeit bemerkte.  Zuerst 
  580.                     dachte ich an einen  Fehler  meiner-
  581.                     seits, und baute die  Bildschirmaus-
  582.                     gabe wieder ein, nur um dann festzu-
  583.                     stellen, daß alles korrekt  funktio-
  584.                     nierte. Ich stoppte  dann  die  Zeit 
  585.                     mit der Systemuhr und kam auf  6/100 
  586.                     Sekunden (ohne Ausgabe). Bei hundert 
  587.                     Durchläufen mittelte sich die durch-
  588.                     schnittliche Zeit für  einen  Durch-
  589.                     lauf zu 0.0472  Sekunden  (8088  mit 
  590.                     8 MHz). D.h. Turbo-Prolog  ist  über 
  591.                     27 mal schneller als  das  bis  dato 
  592.                     schnellste System auf einem  PC.  Da 
  593.                     man dieses Zeitverhalten wahrschein-
  594.                     lich verallgemeinern kann,  muß  ich 
  595.                     mich wohl oder übel davon überzeugen 
  596.                     lassen, daß die obigen Aussagen  zu-
  597.                     mindest größenordnungsmäßig  richtig 
  598.                     sind. Damit wird  Turbo-Prolog  auch 
  599.                     für den  kommerziellen  und  wissen-
  600.                     schaftlichen  Bereich   interessant. 
  601.                     Da, wo bis jetzt spezielle  Hardware 
  602.                     für Performance sorgen mußte, tut es 
  603.                     jetzt schon eine Maschine und  Soft-
  604.                     ware, die preislich für ein größeres 
  605.                     Unternehmen überhaupt nicht ins  Ge-
  606.                     wicht fällt. Dabei muß man auch noch 
  607.                     erwähnen,  daß  die  Geschwindigkeit 
  608.                     auf einem Rechner der jüngste MS-DOS 
  609.                     Generation (80386  Prozessor)  noch-
  610.                     mals etwa 10 mal höher ist. 
  611.                     Kurz vor Fertigstellung  dieses  Be-
  612.                     richtes erreichten mich weitere  In-
  613.                     formationen  in  Form   eines   Ver-
  614.                     gleichsberichts  in  der   "Computer 
  615.                     Persönlich" 22 dieses  Jahres.  Dort 
  616.                     wurde Turbo-Prolog  mit  Prolog  II, 
  617.                     einem sehr modernen,  leistungsfähi-
  618.                     gen, aber nichts desto trotz  "klas-
  619.                     sischen" (und  teuren)  System,  das 
  620.                     von einer Forschungsgruppe der  Uni-
  621.                     versität Marseille entwickelt wurde, 
  622.                     verglichen (siehe auch Buchbesprech-
  623.                     ung "PROLOG" in dieser Ausgabe). Bei 
  624.                     rekursiven Problemen war  Turbo-Pro-
  625.                     log immerhin noch um Faktor 2 bis  9 
  626.                     schneller. Hingegen konnte Prolog II 
  627.                     bei einem intensiv Backtracking for-
  628.                     dernden Problem (intensiv  ist  gut, 
  629.                     exzessiv ist das richtige Wort) eine 
  630.                     um Faktor 5.2 kürzere Laufzeit  ver-
  631.                     buchen.
  632.                      Turbo-Prolog und andere Sprachen:
  633.                     Im Handbuch wird behauptet, daß Tur-
  634.                     bo-Prolog-Module mit  anderen  Spra-
  635.                     chen zusammengelinkt werden  können. 
  636.                     Dabei ist die  Rede  von  Assembler, 
  637.                     Pascal, FORTRAN  und  C.  Vorgeführt 
  638.                     wird dies an  einem  Assembler-  und 
  639.                     einem C-Beispiel.  Hat  auch  seinen 
  640.                     guten Grund. Linken mit FORTRAN-Pro-
  641.                     grammen ist eigentlich von vorneher-
  642.                     ein ausgeschlossen,  da  keiner  der 
  643.                     mir bekannten FORTRAN-Compiler  sich 
  644.                     dazu überreden läßt den  Unterstrich 
  645.                     "_" in Identifiern  zu  akzeptieren. 
  646.                     Der Unterstrich wird aber zum Linken 
  647.                     mit Prolog  (siehe  Handbuch)  unbe-
  648.                     dingt benötigt. 
  649.                     Alle gängigen Pascal-Compiler akzep-
  650.                     tieren  aber  den  Unterstrich,  und 
  651.                     nachdem ich das MS-Pascal dazu über-
  652.                     redet hatte mit 32-Bit-Pointern (EX-
  653.                     TERNAL und VARS-Deklarationen in ei-
  654.                     nem MODULE) zu  arbeiten,  ging  die 
  655.                     Linkerei auch fehlerfrei ab.  Leider 
  656.                     verabschiedete sich der Rechner beim 
  657.                     Laden solcher  Programme  sang-  und 
  658.                     klanglos. Mit C scheint sich  Turbo-
  659.                     Prolog hingegen prächtig zu  verste-
  660.                     hen (haben ja  auch  z.B.  dieselben 
  661.                     Stringkonventionen), wobei ich  aber 
  662.                     bis jetzt definitiv nur sagen  kann, 
  663.                     daß die Zusammenarbeit mit Lattice-C 
  664.                     einwandfrei klappt (großes Speicher-
  665.                     modell).
  666.                     Wer bisher viel mit C gearbeitet hat 
  667.                     ist also fein raus, Freunde von FOR-
  668.                     TRAN und Pascal müssen  aber  darauf 
  669.                     hoffen, daß sich doch noch ein  ver-
  670.                     träglicher Compiler findet (hier ap-
  671.                     peliere ich an die Leserschaft, Laut 
  672.                     zu geben), oder auf Turbo-Pascal 4.0 
  673.                     (voraussichtlich  2.  Quartal   '87) 
  674.                     warten.
  675.  
  676.  
  677.                     Prolog und strukturierte Programmie-
  678.                     rung:
  679.                     Allen, die die Konzepte der struktu-
  680.                     rierten Programmierung  liebgewonnen 
  681.                     haben, muß ich jetzt eine herbe Ent-
  682.                     täuschung  bereiten.   Struktogramme 
  683.                     sind bestenfalls  in  Ausnahmefällen 
  684.                     für die Entwicklung von  Prolog-Pro-
  685.                     grammen brauchbar,  was  schlichtweg 
  686.                     daran  liegt,  das  es  keinen  Sinn 
  687.                     macht, mit Gewalt  Schleifenkonzepte 
  688.                     anderer Sprachen in eine deklarative 
  689.                     Sprache wie Prolog zu übertragen. 
  690.                     Aber: Prolog,  und  speziell  Turbo-
  691.                     Prolog,  zwingt  einen,  auch   wenn 
  692.                     man's  nicht  merkt,  Programme   zu 
  693.                     strukturieren.  Diese  Struktur  hat 
  694.                     aber eine ganz andere  Qualität  als 
  695.                     in imperativen Sprachen, da sie sich 
  696.                     weniger aus dem Zwang eine  Arbeits-
  697.                     vorschrift  zu  formulieren  ergibt, 
  698.                     als daraus, Anforderungen an das Sy-
  699.                     stem zu formulieren. Der Unterschied 
  700.                     mag so  auf  dem  Papier  vielleicht 
  701.                     nicht offensichtlich sein, aber  man 
  702.                      merkt es beim programmieren, wenn es 
  703.                     einem nach  geringer  Eingewöhnungs-
  704.                     zeit egal wird, wie das  System  das 
  705.                     gestellte Ziel erreicht.  In  erster 
  706.                     Näherung wird  die  Frage  nach  dem 
  707.                     "wie" also durch die Frage nach  dem 
  708.                     "was" ersetzt.
  709.                     Zum Eingewöhnen in diese Sprache hat 
  710.                     sich für mich  die  folgende  Vorge-
  711.                     hensweise bewährt:
  712.                     1. Ein grobes Gesamtkonzept für  das 
  713.                     Programm erstellen.
  714.                     2. Anhand dieses Konzepts überlegen, 
  715.                     welche Detailanforderungen  wohl  an 
  716.                     das System  gestellt  werden.  Dabei 
  717.                     konsequent  in  kleinsten  Einheiten 
  718.                     denken, da  lange  Klauseln  schnell 
  719.                     undurchschaubar werden können.
  720.                     3. Die Predikate für diese  Anforde-
  721.                     rungen realisieren.
  722.                     4. Diese Predikate  interaktiv  aus-
  723.                     testen. Dieser Punkt  ist  besonders 
  724.                     wichtig, da Fehler, die irgendwo  im 
  725.                     Logik-Dschungel   verborgen    sind, 
  726.                     selbst mit den hervorragenden Debug-
  727.                     gingmöglichkeiten  von  Turbo-Prolog 
  728.                     nur schwer gefunden werden können.
  729.                     5.  Anschließend  diese  "Primitiv"-
  730.                     Predikate von ablaufsteuernden  Pre-
  731.                     dikaten benutzen lassen.
  732.                     Diese Strategie  der  Bottom-Up-Ent-
  733.                     wicklung wird durch die Interaktivi-
  734.                     tät von Prolog  hervorragend  unter-
  735.                     stützt.
  736.                     Modulare Programmierung ist, wie  es 
  737.                     sich für ein modernes System eigent-
  738.                     lich auch gehört, voll verwirklicht. 
  739.                     Zum einen auf der  Ebene  der  Klau-
  740.                     seln, wo alle Variablen lokal  sind, 
  741.                     und zum anderen in Form  von  echten 
  742.                     Modulen mit wohldefinierten Schnitt-
  743.                     stellen. 
  744.  
  745.  
  746.                     Turbo-Prolog und der Standard:
  747.                     Tja..., da muß man erst einmal  ganz 
  748.                     klar sehen, daß es so etwas wie  ei-
  749.                     nen Standard gar nicht gibt. Es gibt 
  750.                     zwar einen sogenannten Standard-Syn-
  751.                     tax (eine scheußliche, Lisp-ähnliche 
  752.                     Notation),  aber  eingebürgert   hat 
  753.                     sich der Edinburgh-Syntax wie er von 
  754.                     Clocksin & Mellish beschrieben wird. 
  755.                     Bis auf geringfügige  Details  (z.B. 
  756.                     "=" anstatt "is") die mit der Erset-
  757.                     zungsfunktion des Editors korrigiert 
  758.                     werden können, versteht Turbo-Prolog 
  759.                     den vollen Edinburgh-Syntax (mit den 
  760.                     unten genannten Einschränkungen), so 
  761.                     daß Programme, die in diesem Dialekt 
  762.                     geschrieben sind,  problemlos  über-
  763.                     nommen werden können. Dabei muß  man 
  764.                     lediglich  beachten  alle  Predikate 
  765.                     und Domains zu deklarieren und Klau-
  766.                     seln desselben Predikats unmittelbar 
  767.                     untereinander zu schreiben. Dies ist 
  768.                     wohl der Preis, den man für die Vor-
  769.                     teile eines Compilers bezahlen  muß. 
  770.                     Jemand, der vorher in  Pascal-ähnli-
  771.                     chen Sprachen gearbeitet  hat,  wird 
  772.                      dies, weil gewohnt, nicht  als  stö-
  773.                     rend empfinden.  Für  jemanden,  der 
  774.                     von BASIC/FORTRAN  kommt,  tut  sich 
  775.                     ohnehin eine neue Welt  auf.  Ledig-
  776.                     lich  Jünger  des   "puren   Prolog" 
  777.                     (s.u.) werden mit Turbo-Prolog  wohl 
  778.                     nicht  hundert-prozentig   glücklich 
  779.                     sein, es aber schließlich  doch  be-
  780.                     nutzen, weil es schnell, komfortabel 
  781.                     und  preisgünstig   ist.   Ähnliches 
  782.                     konnte man ja auch bei  Turbo-Pascal 
  783.                     beobachten, was nicht die volle ISO-
  784.                     Norm erfüllt und trotzdem eine  Rie-
  785.                     senverbreitung hat.
  786.                     Etwas aufpassen muß man auch bei der 
  787.                     Verwendung des Cut, weil er  gering-
  788.                     fügig  andere   Auswirkungen   haben 
  789.                     kann. Dieses Problem  ist  aber  bei 
  790.                     der Verwendung verschiedener Prolog-
  791.                     dialekte üblich, und rührt  aus  den 
  792.                     unterschiedlichen Backtracking-Algo-
  793.                     rithmen der Systeme her. 
  794.                     Der umgekehrte Weg, Turbo-Prolog auf 
  795.                     andere Systeme, ist leider nicht  so 
  796.                     einfach, da man sich  in  der  Regel 
  797.                     doch das  Leben  leicht  macht,  die 
  798.                     Features von Turbo-Prolog  ausnutzt, 
  799.                     und dabei Inkompatibilitäten in Kauf 
  800.                     nimmt. Allerdings sehe ich für  mei-
  801.                     nen Teil keinen  Grund,  mit  Gewalt 
  802.                     Turbo-Prolog-Programme auf ein ande-
  803.                     res System rüberkriegen  zu  wollen. 
  804.                     Wie ich zu dieser  Meinung  gekommen 
  805.                     bin ? --> Siehe Laufzeitverhalten.
  806.                     Der einzige echte Nachteil gegenüber 
  807.                     anderen  (meist   interpretierenden) 
  808.                     Systemen sehe ich darin, daß während 
  809.                     der Laufzeit  nur  noch  Fakten  und 
  810.                     keine Regeln mehr in die  Datenbasis 
  811.                     eingefügt werden können.  Dies  wird 
  812.                     wohl  gerade  (und  vielleicht  auch 
  813.                     nur?) von AI-Profis angekreidet wer-
  814.                     den, kann aber umgangen werden,  in-
  815.                     dem für diese Zwecke ein Mini-Inter-
  816.                     preter für  Turbo-Prolog  in  Turbo-
  817.                     Prolog geschrieben wird (Münchhausen 
  818.                     zieht sich am Zopf aus  dem  Sumpf). 
  819.                     Die prinzipielle Vorgehensweise  da-
  820.                     für wird  auch  an  einem  einfachen 
  821.                     Beispiel  im  Handbuch   vorgeführt. 
  822.                     Dies ist zwar etwas für höhere Seme-
  823.                     ster, aber  mittlerweile  würde  ich 
  824.                     mir durchaus zutrauen, sowas zu bau-
  825.                     en.
  826.                     Der Autor des zuletzt  unter  "Lauf-
  827.                     zeitverhalten"  erwähnten  Artikels, 
  828.                     anscheinend ein Prediger einer ziem-
  829.                     lich puristischen Prolog-Schule, und 
  830.                     zudem ohne Pascal-Erfahrung,  bemän-
  831.                     gelte die Typbindung, die in  Turbo-
  832.                     Prolog existiert, und die verhindert 
  833.                     z.B. Listen zu konstruieren, die ge-
  834.                     mischt  beliebige  Typen  aufnehmen. 
  835.                     Stattdessen muß  ein  Funktor  defi-
  836.                     niert werden, der als Objekte  Werte 
  837.                     und Variablen aller Typen  aufnehmen 
  838.                     kann, und eine Liste dieses Funktors 
  839.                     definiert werden. (Siehe auch Turbo-
  840.                     Prolog-Handbuch   Kap.11,    Abschn. 
  841.                     "Compound Terms or Structures".)
  842.                      Auch kritisiert er, daß Turbo-Prolog 
  843.                     kein vollständiges  Operator-Konzept 
  844.                     hat, so daß keine infix-Notation von 
  845.                     Operatoren möglich ist (in den  mei-
  846.                     sten anderen Dialekten auch  nicht), 
  847.                     sondern  nur   prefix-Notation   als 
  848.                     Funktor  möglich  ist  (z.B.   "Karl 
  849.                     ist_Vater_von Martin" muß  geschrie-
  850.                     ben werden als "ist_Vater_von( Karl, 
  851.                     Martin)" ). 
  852.                     Begründet wird diese  Kritik  damit, 
  853.                     daß mit infix-Notation Programme  in 
  854.                     "natürlichen"   Sätzen   geschrieben 
  855.                     werden können. Ich für  meinen  Teil 
  856.                     sehe aber den Sinn dessen  nicht  so 
  857.                     ganz. Die Zeiten, wo jeder  Anwender 
  858.                     auch Programmierer sein mußte,  sind 
  859.                     letztlich und endlich vorbei, so daß 
  860.                     die Programm-Lesbarkeit für den End-
  861.                     anwender kein Argument sein  sollte. 
  862.                     Und für den Programmierer bietet das 
  863.                     Funktor-Konzept meiner Meinung  nach 
  864.                     nur Vorteile aufgrund  der  besseren 
  865.                     Strukturierung (Vorsicht mit  dieser 
  866.                     Aussage: Ich bin "Pascal-Jünger").
  867.                     Aber sei's drum: Dies sind alles ei-
  868.                     gentlich  philosophische  Überlegun-
  869.                     gen. Ganz praktisch betrachtet  kann 
  870.                     man in  Turbo-Prolog  alles  machen, 
  871.                     was auch in anderen Dialekten  geht, 
  872.                     auch wenn man bei einigen Sachen et-
  873.                     was "basteln" muß. Dafür kann man in 
  874.                     Turbo-Prolog vieles machen, was  mit 
  875.                     anderen  Systemen   wohl   überhaupt 
  876.                     nicht geht, z.B. maschinennahe  Pro-
  877.                     grammierung. Selbst wenn  man  nicht 
  878.                     gewillt ist, diese "Basteleien" sel-
  879.                     ber vorzunehmen, kann man wohl davon 
  880.                     ausgehen,  daß  in  absehbarer  Zeit 
  881.                     Tool-Boxen  angeboten  werden,   die 
  882.                     z.B. Interpreterkerne oder Experten-
  883.                     system-Basen enthalten.
  884.                     Durch seinen angenehmen  Syntax  und 
  885.                     noch viel mehr durch  seine  anderen 
  886.                     Vorzüge kann Turbo-Prolog es  meiner 
  887.                     Meinung nach durchaus erreichen, ein 
  888.                     De Facto Standard zu werden.
  889.  
  890.  
  891.                     Wenn ich dies alles  betrachte,  hat 
  892.                     Turbo-Prolog alle Chancen die Erwar-
  893.                     tungen von Borland zu erfüllen,  die 
  894.                     angepeilten 2 Millionen  Prolog-Pro-
  895.                     grammierer weltweit zu stellen.  Das 
  896.                     System ermöglicht (mit den erwähnten 
  897.                     Einschränkungen) alles was  man  von 
  898.                     einem Prolog-System  erwarten  kann, 
  899.                     bietet zusätzliche Möglichkeiten für 
  900.                     "normale" Programme  (viele  numeri-
  901.                     sche und Seiteneffektpredikate)  und 
  902.                     ist  für   PC-Maßstäbe   unglaublich 
  903.                     schnell. Ich möchte erstmal pauschal 
  904.                     behaupten (bis zum Gegenbeweis), daß 
  905.                     in Turbo-Prolog alles "geht" was auf 
  906.                     einem PC in  Hochsprachen  überhaupt 
  907.                     machbar ist. Abraten möchte ich  nur 
  908.                     von schlecht konvergierenden,  nume-
  909.                     rischen Iterationsverfahren, da Tur-
  910.                     bo-Prolog  den   Numerik-Coprozessor 
  911.                     anscheinend (ist nirgendwo  erwähnt) 
  912.                      (noch ?) nicht  unterstützt.  (Aber: 
  913.                     Man nehme C ...)
  914.                     Dazu kommt noch die  gute  Benutzer-
  915.                     oberfläche, die auch in eigenen Pro-
  916.                     grammen verfügbar  ist,  und  selbst 
  917.                     dem  absoluten  Anfänger  das  Leben 
  918.                     leicht macht. Was will  man  eigent-
  919.                     lich mehr ?
  920.                     Ich glaube, daß für die Zukunft  ei-
  921.                     niges zu erwarten ist, und zumindest 
  922.                     für mich  persönlich  hat  sich  das 
  923.                     Abenteuer "Einstieg in  Prolog"  ge-
  924.                     lohnt (und Spaß gemacht hat's  oben-
  925.                     drein).  Und  auch  wenn  ich  jetzt 
  926.                     vielleicht  als   blauäugig,   fort-
  927.                     schrittsgläubig und über  die  Maßen 
  928.                     begeisterungsfähig verschrien werde: 
  929.                     Einsteigen Leute, durch  deklarative 
  930.                     Programmierung  eröffnen  sich  ganz 
  931.                     neue Möglichkeiten, und noch nie war 
  932.                     es so  einfach,  gute  Programme  zu 
  933.                     schreiben, wie heute.
  934.