home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 01 / newton / newton.doc < prev    next >
Encoding:
Text File  |  1987-06-24  |  62.6 KB  |  1,073 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.                                      Symbolverarbeitung !
  11.                               Der Weg zur intelligenten Maschine?
  12.  
  13.  
  14.                               Turbo-Prolog lernt Analytik. Funk-
  15.                               tionen werden nicht mehr  numerisch, 
  16.                               sondern symbolisch differenziert und 
  17.                               integriert. Ein  Programm,  auf  das 
  18.                               Schüler   und   Naturwissenschaftler 
  19.                               schon lange gewartet haben.
  20.  
  21.                               ------------------------------------
  22.                                         Eine Definition
  23.                               ------------------------------------
  24.  
  25.                               Mancher  wird  sich  angesichts  der 
  26.                               Überschrift wohl fragen:  "Was  soll 
  27.                               das denn jetzt  schon  wieder  sein, 
  28.                               Symbole ?" Aber keine Angst, ich ha-
  29.                               be nicht vor, jemanden mit theoreti-
  30.                               schen Formalismen aus der Informatik 
  31.                               zu quälen. Dies könnte ich auch  aus 
  32.                               Mangel  an  derartiger  Bildung  gar 
  33.                               nicht. Meine naive, aber trotzdem in 
  34.                               dem  Analytikprogramm   erfolgreiche 
  35.                               Definition lautet etwa folgender-
  36.                               maßen: Ein Symbol  ist  ein  Objekt, 
  37.                               das einen oder mehrere  Werte  haben 
  38.                               kann. Diese können  selber  wiederum 
  39.                               Symbole oder Atome sein. Unter einem 
  40.                               Atom  verstehe  ich  hierbei   einen 
  41.                               Wert, der selbst  kein  Symbol  oder 
  42.                               Atom mehr zum Wert hat. 
  43.  
  44.                               Ein Hinweis für Leser, die von kon-
  45.                               ventionellen Programmiersprachen ge-
  46.                               prägt sind: Man muß  sich  hier  von 
  47.                               dem strengen  Gegensatz  Variable  - 
  48.                               Wert lösen.  In  dieser  Definition, 
  49.                               wie auch allgemein  in  AI-Sprachen, 
  50.                               ist mit einem Wert nicht ein Zahlen-
  51.                               wert oder eine Zeichenkette gemeint, 
  52.                               sondern einfach ein Wort, mit dem 
  53.                               eine Variable (Symbol) gebunden 
  54.                               wird. Wenn der Wert die richtige Ge-
  55.                               stalt hat (kein Zahlenwert), kann er 
  56.                               selbst wieder als Variable gehand-
  57.                               habt und an einen Wert gebunden wer-
  58.                               den. 
  59.  
  60.                               Bevor ich jegliche Klarheit besei-
  61.                               tige, ein Beispiel aus dem täglichen 
  62.                               Leben: Als Symbol nehmen  wir  Geld. 
  63.                               Dies kann, unterschiedlich für ver-
  64.                               schieden  Personen,  z.B.  folgenden 
  65.                               Werte haben: Stück_Papier,  Nahrung, 
  66.                               Vergnügen, Arbeits_Gegenwert, Geld_-
  67.                               Münze,...  Wie man sieht,  ist  z.B. 
  68.                               Nahrung  wiederum  ein  Symbol,  daß 
  69.                               verschiedene Werte (Bedeutungen) ha-
  70.                               ben kann. Ein atomarer  Wert  könnte 
  71.                               z.B. Geld_Münze sein, falls die Per-
  72.                               son, die mit dem Symbol Geld arbei-
  73.                               tet, eine Münze in ihrer Vorstel-
  74.                               lungswelt nicht weiter strukturiert. 
  75.                               (Siehe auch die graphische Darstel-
  76.                               lung dieses Beispiels als Baum.)
  77.  
  78.                               ------------------------------------
  79.                               Eine Abbildung unserer Begriffswelt
  80.                               ------------------------------------
  81.  
  82.                               Es sieht so aus, als könnte man  mit 
  83.                               einer solchen Datenstruktur die Vor-
  84.                               gehensweise des menschlichen Gedäch-
  85.                               nisses (Assoziationsketten und Bäu-
  86.                               me) ziemlich gut  nachbilden.  Jetzt 
  87.                               stellt sich natürlich die Frage, wie 
  88.                               man  solche  Datenstrukturen   einer 
  89.                               mentalen Maschine auf einem physika-
  90.                               lischen Gerät wie einem Computer ab-
  91.                               bildet. Ein  'nur  BASIC-Program-
  92.                               mierer' wird vielleicht sagen: "Geht 
  93.                               gar nicht.". Kenner von Pascal-ähn-
  94.                               lichen  Sprachen  werden  sich  wohl 
  95.                               etwas in dem Bart murmeln wie "Lis-
  96.                               tenstrukturen aus Zeigern mit vari-
  97.                               anten Records als  Knoten"  und  die 
  98.                               Sache wegen zu großem Umfangs wieder 
  99.                               fallen lassen.
  100.  
  101.                               Hingegen wird die Abbildung  solcher 
  102.                               Strukturen in AI-Sprachen wie Pro-
  103.                               log, Lisp und Logo geradezu  simpel. 
  104.                               In der  Lisp/Logo-Version  wäre  ein 
  105.                               Symbol ein Wort, das als  Wert  eine 
  106.                               Liste besitzt, die ein oder  mehrere 
  107.                               Symbole oder  Atome  enthält.  Diese 
  108.                               Symbole in der Liste enthalten wie-
  109.                               derum Listen, in denen... 
  110.  
  111.                               In Turbo-Prolog müssen wir, im Ge-
  112.                               gensatz zu Lisp, Logo und "klassi-
  113.                               schen" Prolog-Dialekten, vorher  ein 
  114.                               wenig  deklarieren  (Prolog-Puristen 
  115.                               mögen mir verzeihen, daß ich  diesen 
  116.                               Dialekt wählte, allerdings paßte  er 
  117.                               als einziger  problemlos  in  meinen 
  118.                               Etat und auf meinen  Rechner!).  Wie 
  119.                               die zu Beginn erfolgte formale Defi-
  120.                               nition vermuten ließ, ist das  Ganze 
  121.                               eine hochgradig rekursive Angelegen-
  122.                               heit. Im Programm würde das folgen-
  123.                               dermaßen aussehen:
  124.  
  125.                               DOMAINS
  126.                                 SymbolListe = ein_Symbol*
  127.                                 /* Eine Liste von Symbolen */
  128.                                 ein_Symbol = atom(STRING) 
  129.                                           OR Symbole(SymbolListe)
  130.                                           OR einSymbol(ein_Symbol)
  131.  
  132.                               Das die eigentlichen  Werte  (STRING 
  133.                               <=> Atome, SymbolListe,  ein_Symbol) 
  134.                               noch in Funktoren (atom, Symbole, 
  135.                               einSymbol) eingebunden  werden,  hat 
  136.                               hier nur programmiertechnische Grün-
  137.                               de. Dazu  weiter  unten  anhand  des 
  138.                               Programms mehr.
  139.  
  140.                               Nun gut, wenn man nun eine Möglich-
  141.                               keit hat, unsere Begriffswelt abzu-
  142.                               bilden, könnte man  auch  versuchen, 
  143.                               Prädikate zu formulieren, die Rela-
  144.                               tionen und Wechselwirkungen von Ob-
  145.                               jekten (Symbolen)  beschreiben.  Für 
  146.                               den  nicht  Prolog-Bewanderten:  Ein 
  147.                               Prädikat ist ein  Faktum  oder  eine 
  148.                               Regel, das Relationen zwischen Ob-
  149.                               jekten beschreibt. Implizit kann ein 
  150.                               Prädikat eine  Transformation  eines 
  151.                               Objekts enthalten. 
  152.  
  153.                               Beispiele:
  154.                               Ein Faktum mit Relationsbeschreibung 
  155.                               ist ist_aelter(Vater,Sohn). Die 
  156.                               Parameter   sind   hier   Variablen, 
  157.                               'Vater' und 'Sohn' würden  also  die 
  158.                               Namen  zweier  Personen   enthalten. 
  159.                               Eine Regel mit  Transformation  wäre 
  160.                               ziehe_Wurzel(Wert,Ergebniss). In 
  161.                               'Wert' stände eine  Zahl,  und  nach 
  162.                               Anwendung  des  Prädikats   enthielt 
  163.                               'Ergebniss' das Resultat der Rech-
  164.                               nung.  Die  expliziete  Vereinbarung 
  165.                               der Regeln für die  Prädikate,  hier 
  166.                               z.B. das Ziehen der  Wurzel,  findet 
  167.                               in Prolog im Klauselteil des Pro-
  168.                               grammes statt.
  169.  
  170.                               Auf diese Weise müßte man ein Pro-
  171.                               gramm formulieren können,  das  eine 
  172.                               gute Portion gesunden Menschenver-
  173.                               stand besitzt und Lösungen für  alle 
  174.                               Probleme  der  Begriffswelt   finden 
  175.                               könnte. 
  176.  
  177.                               Ansätze dieser Art wurden auch schon 
  178.                               in der Frühgeschichte der EDV pro-
  179.                               biert und führten im  Prinzip  sogar 
  180.                               zum Erfolg. Einer der prominentesten 
  181.                               Vertreter dieser  Entwicklungen  war 
  182.                               der "General  Problem  Solver".  Bei 
  183.                               diesem Programm mußte man einen An-
  184.                               fangszustand in einer Welt definie-
  185.                               ren, den gewünschten Endzustand  und 
  186.                               die Operatoren (Prädikate), die  auf 
  187.                               die Objekte (Symbole) der Welt an-
  188.                               gewandt werden konnten. Das Programm 
  189.                               funktionierte  wunderbar,  aber  der 
  190.                               Aufwand für die Formulierung der Ob-
  191.                               jekte und Operatoren wuchs bei stei-
  192.                               gender Weltgröße  sehr  schnell  ins 
  193.                               Unerträgliche. Zudem ist ein Pro-
  194.                               blem,  das  man  exakt   formulieren 
  195.                               kann, eigentlich schon keines mehr. 
  196.  
  197.                               Daraus kann man den  Schluß  ziehen, 
  198.                               daß die Idee gut war, aber die An-
  199.                               wendung  verkehrt  (Frei  nach  Hugo 
  200.                               Hacker: "Eine Lösung hatte ich, aber 
  201.                               leider nicht  das  passende  Problem 
  202.                               dafür.").
  203.  
  204.                               ------------------------------------
  205.                                        Eine kleinere Welt
  206.                               ------------------------------------
  207.  
  208.                               Sehr  viel  praxisorientierter  wird 
  209.                               die Angelegenheit, wenn man in einer 
  210.                               Welt arbeitet, deren Objekte und Re-
  211.                               geln (Operatoren) überschaubar sind, 
  212.                               wo aber die Anwendung der Regeln für 
  213.                               den  Menschen  unübersichtlich   und 
  214.                               kompliziert ist.
  215.  
  216.                               Hier muß wieder mal  die  Mathematik 
  217.                               herhalten, wobei ich mir das  Gebiet 
  218.                               der Differential- und Integralrech-
  219.                               nung herausgeguckt habe. Mein Anlie-
  220.                               gen ist also ein Programm zu formu-
  221.                               lieren, das einen beliebigen, analy-
  222.                               tischen  Funktionsausdruck  ableiten 
  223.                               oder die Stammfunktion davon  bilden 
  224.                               kann. Jemand, dessen Mathematik-Un-
  225.                               terricht schon etwas  länger  zurück 
  226.                               liegt, und dem der Sinn der Differ-
  227.                               ential-/Integralrechnung   entfallen 
  228.                               ist, sollte in den mathematischen 
  229.                               Erläuterungen nachsehen.
  230.  
  231.                               Das universelle Symbol  dieser  Welt 
  232.                               habe ich term genannt. Damit meine 
  233.                               ich  Funktionssymbole,   Operatoren, 
  234.                               Variablen, numerische und symboli-
  235.                               sche Konstanten sowie die  unendlich 
  236.                               vielen Verknüpfungen, die mit diesen 
  237.                               termen möglich sind. (Schon wieder 
  238.                               eine Rekursion!)
  239.  
  240.                               ------------------------------------
  241.                                         Es wird konkret
  242.                               ------------------------------------
  243.  
  244.                               Als erstes habe ich in dem  DOMAINS-
  245.                               Teil die atomaren Größen mit term 
  246.                               identifiziert. Diese atomaren Größen 
  247.                               sind Konstanten (z.B. a), numerische 
  248.                               Konstanten (z.B. 3.14) oder Varia-
  249.                               blen (z.B. X). Diese Größen sind als 
  250.                               Funktoren definiert, die durch ihren 
  251.                               Inhalt einen konkreten Wert bekom-
  252.                               men. Die numerische Konstante 3.14 
  253.                               würde also als nconst(3.14) darge-
  254.                               stellt - und die Variable X würde 
  255.                               als var("X") geschrieben.
  256.  
  257.                               Der erste rekursive term ist der 
  258.                               Funktor funk mit zwei Argumenten. 
  259.                               Dieser Funktor dient zur Darstellung 
  260.                               von Funktionen. Das  erste  Argument 
  261.                               ist dabei ein STRING, der den  Namen 
  262.                               der  Funktion  enthält:  z.B.  "sin" 
  263.                               oder "exp". Das zweite Argument  ist 
  264.                               wiederum ein term. Die Funktoren für 
  265.                               die  Grundrechenarten  sind   gleich 
  266.                               doppelt rekursiv, da sie zwei terme 
  267.                               als Argumente haben.
  268.  
  269.                               Zu guter Letzt  habe  ich  noch  den 
  270.                               Funktor npot definiert, der Potenzen 
  271.                               mit  konstantem  Exponenten   be-
  272.                               schreibt. Das erste Argument ist der 
  273.                               term, der potenziert wird. Das zwei-
  274.                               te Argument, der Exponent, ist  auch 
  275.                               als term definiert, obwohl dieser, 
  276.                               als Konstante, eigentlich eine ato-
  277.                               mare Größe sein müßte. Man darf aber 
  278.                               nicht vergessen, daß ein  konstanter 
  279.                               Exponent sich aus symbolischen und 
  280.                               numerischen Konstanten zusammenset-
  281.                               zen kann. Diese gewisse Eigenwillig-
  282.                               keit der Potenzen  taucht  auch  bei 
  283.                               ihrer mathematischen Behandlung wie-
  284.                               der auf. 
  285.  
  286.                               Zusätzlich habe ich noch eine Domäne 
  287.                               (Datentyp) nach definiert. Diese 
  288.                               steht für die Variable, nach der ab-
  289.                               geleitet  oder   integriert   werden 
  290.                               soll.
  291.  
  292.                               ------------------------------------
  293.                                  Eine angemessene Darstellung ?
  294.                               ------------------------------------
  295.  
  296.                               Mancher wird sich jetzt  fragen,  ob 
  297.                               dies eine sinnvolle Darstellung  von 
  298.                               mathematischen Termen ist. Zum Bei-
  299.                               spiel wird aus dem  relativ  simplen 
  300.                               Term (X+Y)*(U-W)/Z in dieser 
  301.                               Funktor-Notation ein Monstrum wie 
  302.                               div(mal(plus(var("X"),var("Y")),
  303.                                       minus(var("U"),var("W"))),
  304.                                       var("Z")). 
  305.  
  306.                               Der große  Vorteil  dieser  Notation 
  307.                               ist aber, daß  man  sich  an  keiner 
  308.                               Stelle bei der Formulierung der Re-
  309.                               geln für Ableitungen und Stammfunk-
  310.                               tionen Gedanken über  die  Priorität 
  311.                               von mathematischen Operatoren machen 
  312.                               muß. Man muß also Regeln wie "Punkt-
  313.                               rechnung vor Strichrechnung", Klam-
  314.                               merungen und ähnliches nicht  weiter 
  315.                               berücksichtigen, da man es immer nur 
  316.                               mit einem Funktor mit höchstens zwei 
  317.                               Argumenten zu tun hat, die naturge-
  318.                               mäß dieselbe  Priorität  haben.  Wie 
  319.                               man sieht, ist so ein term impliziet 
  320.                               eigentlich eine Baumstruktur.
  321.  
  322.                               Natürlich ist es niemandem zuzumu-
  323.                               ten, einen komplizierteren  Term  in 
  324.                               dieser Notation einzugeben. Da könn-
  325.                               te man die Sache  ja  gleich  wieder 
  326.                               "zu Fuß"  rechnen.  Daher  habe  ich 
  327.                               noch einen Parser (eigentlich  schon 
  328.                               ein Mini-Compiler) programmiert, der 
  329.                               aus der "normalen" Notation  in  die 
  330.                               Baumnotation und zurück übersetzt. 
  331.                               Hierbei taucht dann das Prioritäts-
  332.                               problem doch wieder auf. Anscheinend 
  333.                               gilt auch hier das Prinzip der Inva-
  334.                               rianz  der  Schwierigkeit.  Auf  gut 
  335.                               Deutsch: Man kann die Sache  angehen 
  336.                               wie man  will,  es  ist  und  bleibt 
  337.                               schwierig. Aber  dazu  weiter  unten 
  338.                               mehr.
  339.  
  340.                               ------------------------------------
  341.                                      Jetzt wird gerechnet !
  342.                               ------------------------------------
  343.  
  344.                               Der ganze Vorgang des  Ableiten  und 
  345.                               Stammfunktion bilden wird von  einem 
  346.                               einzigen  Prädikat   'stammf_ableit' 
  347.                               erledigt, das für beide "Richtungen" 
  348.                               wirksam sein soll. Das Prädikat  hat 
  349.                               drei Parameter: Erstens einen term 
  350.                               für  die   Stammfunktion,   zweitens 
  351.                               einen Ausdruck 'nach', der die 
  352.                               Variable bezeichnet, nach der inte-
  353.                               griert/differenziert werden  soll  - 
  354.                               und drittens einen term für die 
  355.                               Ableitung.
  356.  
  357.                               Im Klauselteil für  dieses  Prädikat 
  358.                               werden als erstes die Regeln für die 
  359.                               atomare Größen definiert. Hier tau-
  360.                               chen auch gleich die ersten Schwie-
  361.                               rigkeiten für die Umkehrung der Ab-
  362.                               leitung auf. Zum Beispiel  habe  ich 
  363.                               zuerst die Regel "Irgendeine Kon-
  364.                               stante nach irgendwas abgeleitet er-
  365.                               gibt 0" naiv als 
  366.  
  367.                               stammf_ableit( const(_),_,nconst(0)) 
  368.  
  369.                               formuliert. Der Unterstrich "_" re-
  370.                               präsentiert hier die  Anonyme 
  371.                               Variable, also einen Wert, der für 
  372.                               die Regel unbedeutend ist. Diese Re-
  373.                               gel funktioniert für  die  Ableitung 
  374.                               auch einwandfrei,  ist  aber  leider 
  375.                               auf  keinen  Fall   umkehrbar!   Der 
  376.                               Rechner müßte sich ja für die Bil-
  377.                               dung der Stammfunktion  nach  dieser 
  378.                               Regel irgendeine Konstante aus dem 
  379.                               Begriffsvakuum zaubern.  In  solchen 
  380.                               Fällen muß man also anhand der Bin-
  381.                               dung der Variablen  entscheiden,  in 
  382.                               welche Richtung die Klausel arbeiten 
  383.                               soll und für die Umkehrung eine ei-
  384.                               gene Regel formulieren. Hier benennt 
  385.                               man für die Umkehrung irgendeine 
  386.                               Konstante als const(const) (siehe 
  387.                               Listing). Dieses  Manko  der  Regeln 
  388.                               sollte man aber nicht Prolog anlas-
  389.                               ten, da es eher eine Folge der ma-
  390.                               thematischen Regeln ist. Diese  sind 
  391.                               nie konzipiert  worden,  unmittelbar 
  392.                               umgedreht zu werden (sinngemäße Um-
  393.                               kehrung ist natürlich kein Problem).
  394.  
  395.                               Übrigens,  noch  ein   Hinweis:   An 
  396.                               Stellen, wo im Programm  ein  STRING 
  397.                               stehen muß, kann man sich in  Turbo-
  398.                               Prolog die Anführungsstriche sparen, 
  399.                               wenn der STRING aus einem  einzigen, 
  400.                               kleingeschriebenen   Wort   besteht. 
  401.                               Dies habe ich auch entsprechend aus-
  402.                               genutzt.
  403.  
  404.                               Bei  den   Klauseln   der   atomaren 
  405.                               Größen, sowie  bei  allen  folgenden 
  406.                               Klauseln, habe ich an das  Ende  des 
  407.                               Regelteils einen Cut ("!") gesetzt. 
  408.                               Dies bewirkt, daß keine der folgen-
  409.                               den Klauseln mehr  "probiert"  wird, 
  410.                               falls der  Regelteil  einer  Klausel 
  411.                               erfolgreich bis zum Ende durchlaufen 
  412.                               wurde. Bei den ersten beiden  Regeln 
  413.                               ist dies z.B.  unbedingt  notwendig. 
  414.                               Falls die  erste  Regel  erfolgreich 
  415.                               durchgeführt wurde (Ableitung bil-
  416.                               den), darf die zweite Regel auf kei-
  417.                               nen  Fall   mehr   angewand   werden 
  418.                               (Stammfunktion bilden).
  419.  
  420.                               Bei vielen anderen Klauseln ist dies 
  421.                               nicht notwendig, da meistens ohnehin 
  422.                               auf einen Fall nur genau eine  Regel 
  423.                               paßt. Falls aber doch mehrere Regeln 
  424.                               anwendbar sind, bewirkt der Cut, daß 
  425.                               genau eine Lösung gefunden wird. Man 
  426.                               muß die Regeln natürlich so anord-
  427.                               nen, daß zuerst die Spezialfälle und 
  428.                               dann die allgemeinen Fälle  behan-
  429.                               delt werden. Gerade  bei  rekursiven 
  430.                               Klaueln bringt  der  Cut  in  dieser 
  431.                               Form (theoretisch) eine enorme Ver-
  432.                               besserung des Laufzeitverhaltens und 
  433.                               des  Speicherbedarfs,  da  unnötiges 
  434.                               Backtracking, das sonst fakultativ 
  435.                               (im mathematischen Sinne)  auftreten 
  436.                               würde, vermieden  wird.  Theoretisch 
  437.                               deshalb, da das Programm  auch  ohne 
  438.                               diese nicht unbedingt  nötigen  Cuts 
  439.                               so schnell läuft, daß kaum eine Re-
  440.                               aktionszeit auftritt.
  441.  
  442.                               Im Listing folgen  dann  die  Regeln 
  443.                               für zweistellige Operatoren,  sprich 
  444.                               Grundrechenarten. Im Klauselkopf er-
  445.                               kennt man ohne Mühe die Regeln wie-
  446.                               der, die in der  Mini-Formelsammlung 
  447.                               der mathematischen Erläuterung ange-
  448.                               geben sind. Gemäß  der  Rekursivität 
  449.                               der Datenstruktur sind auch die Re-
  450.                               geln  rekursiv.  D.h.  am  Ende  der 
  451.                               Klausel werden erst die  Ableitungen 
  452.                               der Argumente des Funktors gebildet, 
  453.                               welche  anschliessend  im  Kopf  der 
  454.                               Klausel regelgerecht verknüpft wer-
  455.                               den.
  456.  
  457.                               Für die Ableitung der Potenzen  sind 
  458.                               gleich mehrere Regeln angegeben. Die 
  459.                               erste Regel führt eigentlich nur ei-
  460.                               ne Vereinfachung (x1 = x) vor der 
  461.                               Ableitung durch.  Eigentlich  sollte 
  462.                               so eine Regel im  dafür  zuständigen 
  463.                               Programmteil  stehen.  Es  bot  sich 
  464.                               aber nun einmal an, diese hierhin zu 
  465.                               setzten. Die zweite Regel beschreibt 
  466.                               die Ableitung von Potenzen, die  als 
  467.                               Exponent nur eine numerische Kon-
  468.                               stante haben, gemäß den Ableitungs-
  469.                               regeln. Die dritte Regel schließlich 
  470.                               ist für die Ableitung  von  Potenzen 
  471.                               mit zusammengesetzten Exponenten zu-
  472.                               ständig.
  473.  
  474.                               Danach folgen die Regeln für die Ab-
  475.                               leitung  von  Funktionen  gemäß  der 
  476.                               Bildung des Produkts aus innerer mal 
  477.                               äußerer Ableitung. Ich habe hier ex-
  478.                               plizit für jede Funktion eine eigene 
  479.                               Regel geschrieben.  Man  könnte  das 
  480.                               Ganze kompakter schreiben, indem man 
  481.                               mit zwei Listen arbeitet, wobei  die 
  482.                               eine die Funktionen und  die  andere 
  483.                               an den  entsprechenden  Stellen  die 
  484.                               Ableitungen enthält.  Da  dies  aber 
  485.                               der Übersicht  und  dem  Verständnis 
  486.                               kaum förderlich ist, habe  ich  dies 
  487.                               an dieser Stelle unterlassen.
  488.  
  489.                               Damit hat man  den  Formalismus  der 
  490.                               Ableitungsbildung mit weniger als 50 
  491.                               Prolog-Zeilen formuliert, wobei  die 
  492.                               Umkehrung,  also  die  Bildung   der 
  493.                               Stammfunktion, schon voll berück-
  494.                               sichtigt ist.
  495.  
  496.                               ------------------------------------
  497.                                           Integration,
  498.                                  Umkehrung der Differenzierung ?
  499.                               ------------------------------------
  500.  
  501.                               Wenn man nun versucht, das  Prädikat 
  502.                               'stammf_ableit'  zur   Bildung   von 
  503.                               Stammfunktionen  einzusetzen,   wird 
  504.                               man selbst bei Termen, deren Inte-
  505.                               grationsregeln   implizit   in   den 
  506.                               Klauseln enthalten sind, in der Re-
  507.                               gel eine böse Überraschung  erleben. 
  508.                               Die  Systemmeldungen  reichen  dabei 
  509.                               von "no solution" bis "Stack over-
  510.                               flow". 
  511.  
  512.                               Der Grund dafür ist eigentlich recht 
  513.                               einleuchtend.  Wenn  man  sich   den 
  514.                               rechten Teil der Klauselköpfe (Ab-
  515.                               leitung) anschaut, stellt man fest, 
  516.                               daß dort in aller Regel terme ste-
  517.                               hen, wo mit einer inneren  Ableitung 
  518.                               oder Konstante  multipliziert  wird. 
  519.                               Dieses Muster  paßt  dann  natürlich 
  520.                               nicht auf die einfachen terme, deren 
  521.                               Stammfunktion man gerne haben möchte 
  522.                               (das Matching funktioniert nicht). 
  523.                               Man ist also wohl oder übel gezwun-
  524.                               gen, die Umkehrung der Regeln noch-
  525.                               einmal explizit hinzuschreiben.
  526.  
  527.                               Als weitere Regel für die Integra-
  528.                               tion von Produkten habe ich die par-
  529.                               tielle Integration eingeführt.  Hier 
  530.                               wird mit dem Prädikat part_I ge-
  531.                               prüft, ob eine partielle Integration 
  532.                               erfolgsversprechend ist, also ob ei-
  533.                               ner der Multiplikanden eine  Potenz, 
  534.                               Variable oder ähnliches  ist.  Dabei 
  535.                               muß sich  der  anderer  Multiplikant 
  536.                               mit den vorhandenen Regeln integrie-
  537.                               ren lassen. Wenn ein term diesen Be-
  538.                               dingungen genügt, wird die partielle 
  539.                               Integration angewand  und  versucht, 
  540.                               das daraus resultierende neue Inte-
  541.                               gral (siehe "Mathematische Erläuter-
  542.                               ungen") rekursiv zu integrieren.
  543.  
  544.                               Auf die Substitutionsregel habe  ich 
  545.                               verzichtet, da dies für ein  Pro-
  546.                               gramm, das in einer Zeitschrift ab-
  547.                               gedruckt werden soll, zu umfangreich 
  548.                               geworden wäre. Statt dessen habe ich 
  549.                               das Programm mit einer gewissen Ta-
  550.                               belle an Standardintegralen ausge-
  551.                               rüstet, die von jedem, der ein ent-
  552.                               sprechendes Tabellenwerk (z.B. Br°n-
  553.                               stedt) zu Hause hat, beliebig erwei-
  554.                               tert werden kann. Für den prakti-
  555.                               schen Einsatz des  Programms  sollte 
  556.                               man diese Tabelle vielleicht dyna-
  557.                               misch  mit  einem  DATABASE-Prädikat 
  558.                               erzeugen. Auf diese Weise  kann  man 
  559.                               das Programm  lernfähig  machen,  so 
  560.                               daß einmal gelöste  Integrale  nicht 
  561.                               neu berechnet werden müssen.
  562.  
  563.                               Um Enttäuschungen  vorzubeugen,  muß 
  564.                               ich hier gleich klarstellen, daß das 
  565.                               Programm in dieser Form mit Sicher-
  566.                               heit  nicht  alle  Integrale   lösen 
  567.                               kann, die ein Mathematiker unter An-
  568.                               wendung  aller  Tricks  und   Kniffe 
  569.                               'hinkriegt'. Hier unterlag ich  auch 
  570.                               vom Programmumfang gewissen  Ein-
  571.                               schränkungen - ganz davon abgesehen, 
  572.                               daß es jahrelange Detailarbeit  ist, 
  573.                               so ein Programm leidlich perfekt  zu 
  574.                               machen. Aber statt  an  der  Meldung 
  575.                               "no solution" zu resignieren,  würde 
  576.                               ich versuchen, das Programm  ständig 
  577.                               zu verbessern.
  578.  
  579.                               ------------------------------------
  580.                                     Vereinfachung von Termen
  581.                               ------------------------------------
  582.  
  583.                               Wenn man die Ableitungs- und Inte-
  584.                               grationsregel in der oben beschrie-
  585.                               benen Form anwendet, kriegt man zwar 
  586.                               (hoffentlich!) korrekte  Lösungen  - 
  587.                               diese sehen aber ziemlich  wüst  und 
  588.                               merkwürdig aus. Der Grund dafür ist, 
  589.                               daß das Programm terme, die ein 
  590.                               Mensch bei der Rechnung stillschwei-
  591.                               gend unter den  Tisch  fallen  läßt, 
  592.                               bis zum bitteren  Ende  mitschleppt. 
  593.                               Solche terme sind z.B. Multiplika-
  594.                               tion mit 1, Addition von 0, Multi-
  595.                               plikation mit 0 etc.
  596.  
  597.                               Um solche  "toten  Zweige"  aus  dem 
  598.                               term-Baum zu entfernen, habe ich ein 
  599.                               Prädikat vereinfache geschrieben, 
  600.                               welches mit den Hilfsprädikaten ver-
  601.                               einfache1 und vereinfache2 den Baum 
  602.                               wiederholt bearbeitet und dabei Ver-
  603.                               einfachungsregeln anwendet. Die wie-
  604.                               derholte Anwendung ist notwendig, da 
  605.                               z.B. bei der rekursiven Vereinfa-
  606.                               chung der beiden Operanden des Funk-
  607.                               tors mal einer der beiden Multipli-
  608.                               kanten denn Wert 1 annehmen  könnte. 
  609.                               Die damit hinfällige  Multiplikation 
  610.                               kann  aber  nur  in  einem  weiteren 
  611.                               Durchgang  vereinfacht  werden.  Ein 
  612.                               unmittelbarer   rekursiver    Aufruf 
  613.                               könnte  zu  Endlosschleifen  führen, 
  614.                               falls die Multiplikation  halt  doch 
  615.                               nicht vereinfacht werden  kann.  Als 
  616.                               Abbruchkriterium dient die  Abfrage, 
  617.                               ob sich der Baum bei der  Verein-
  618.                               fachung geändert hat. Da  dies  aber 
  619.                               auch durch ineffektive term-Ver-
  620.                               tauschungen der Fall sein kann, wird 
  621.                               die Anzahl der Wiederholungen mitge-
  622.                               zählt und bei einer gewissen  Grenze 
  623.                               terminiert.
  624.  
  625.                               Die eigentlichen Regeln zur Verein-
  626.                               fachung sind allesamt recht  simpler 
  627.                               Natur. Allerdings scheint ihre An-
  628.                               zahl exponentiell mit der gewünsch-
  629.                               ten Güte zu steigen.  Zudem  tauchen 
  630.                               fast alle Regeln doppelt auf, da die 
  631.                               Kommutativität explizit berücksich-
  632.                               tigt werden mußte (zum  Problem  der 
  633.                               Vertauschbarkeit von Operanden  habe 
  634.                               ich mich auch beim Parser ausgelas-
  635.                               sen, s.u.).
  636.  
  637.                               Das eigentliche Problem bei der Ver-
  638.                               einfachung ist, alle Regeln zu be-
  639.                               rücksichtigen,   wobei    es    auch 
  640.                               Schwierigkeiten macht, die  richtige 
  641.                               Reihenfolge zu finden. Der "Verein-
  642.                               facher" ist in dieser Form mit Si-
  643.                               cherheit noch nicht perfekt. Es gibt 
  644.                               sicherlich noch etliche Sonderfälle, 
  645.                               die nur schlecht berücksichtigt wur-
  646.                               den. Hier bin ich für Verbesserungs-
  647.                               vorschläge ganz offen.  (Das  "Ding" 
  648.                               ist allerdings auch  so  schon  lang 
  649.                               genug.)
  650.  
  651.                               Daß solche "Vereinfacher" Riesenap-
  652.                               parate werden können, sieht  man  an 
  653.                               Programmen  wie  "REDUCE"  und  "MU-
  654.                               SIMP". Ersteres ist ein Großrechner-
  655.                               Lisp-Programm, das soviel Speicher-
  656.                               platz braucht, daß man es mit  einer 
  657.                               normalen Benutzerberechtigung über-
  658.                               haupt nicht zum Laufen  kriegt.  Das 
  659.                               Zweite ist auch  ein  mathematisches 
  660.                               Programm  für  die   Apple II-Serie, 
  661.                               dessen  Hauptanteil  angeblich   von 
  662.                               solch einem Vereinfacher  ausgemacht 
  663.                               wird.
  664.  
  665.                               ------------------------------------
  666.                                            Der Parser
  667.                               ------------------------------------
  668.  
  669.                               Wie schon erwähnt, kann es niemandem 
  670.                               zugemutet   werden,    mathematische 
  671.                               Terme in der in diesem Programm ver-
  672.                               wendeten  Baumnotation   einzugeben. 
  673.                               Die Umwandlung analytischen Notation 
  674.                               ---> Baumnotation  und  zurück  wird 
  675.                               von dem als Parser bezeichneten 
  676.                               Programmteil   vorgenommen.   Dieser 
  677.                               Parser  ist  eigentlich  schon   ein 
  678.                               Mini-Compiler, da er - formal be-
  679.                               trachtet, von einer Sprache in  eine 
  680.                               andere Übersetzt.  Dem  entsprechend 
  681.                               schwierig war er zu realisieren  (er 
  682.                               hat mich fast in den Wahnsinn ge-
  683.                               trieben). Die Problematik rührte zum 
  684.                               einen aus der  Berücksichtigung  der 
  685.                               Operator-Prioritäten und zum anderen 
  686.                               aus der Nicht-Umkehrbarkeit des Par-
  687.                               sing her.
  688.  
  689.                               Zum Übersetzen in  die  Baumnotation 
  690.                               sieht die prizipielle Vorgehensweise 
  691.                               wie im folgenden beschrieben aus:
  692.  
  693.                               1. Aus dem Term-String  werden  alle 
  694.                               Leerzeichen entfernt (entferne_Leer-
  695.                               zeichen).
  696.  
  697.                               2. Der String wird in eine Token-
  698.                               liste zerlegt (string_tokenliste). 
  699.                               Ein Token ist hier  ein  Wort  (z.B. 
  700.                               "sin"), eine Zahl oder ein Sonder-
  701.                               zeichen (z.B. "*","/","(",")",...) 
  702.  
  703.                               3. Von dem Prädikat tokenliste_term 
  704.                               wird als erstes  überprüft,  ob  die 
  705.                               Tokenliste einem  gültigen term ent-
  706.                               spricht. Das Prädikat richtiger_Term 
  707.                               überprüft hier nur,  ob  die  Anzahl 
  708.                               der öffnenden  Klammern  gleich  der 
  709.                               Anzahl  der  schließenden   Klammern 
  710.                               ist. Der Syntax-Check kann natürlich 
  711.                               nach Bedarf beliebig erweitert wer-
  712.                               den. Fehler bei der Klammerschach-
  713.                               telung sind aber erfahrungsgemäß die 
  714.                               häufigsten.  Durch  den   Cut   wird 
  715.                               erreicht, daß im Fehlerfall das kom-
  716.                               plette Parsing failed, abgebrochen 
  717.                               wird.
  718.  
  719.                               4. Es folgt die Behandlung der ato-
  720.                               maren Größen. Hier wird im Kopf  der 
  721.                               Klausel geprüft  ob  die  Tokenliste 
  722.                               nur noch ein Element enthält. Dieses 
  723.                               wird dann  in  sein  ╨quivalent  der 
  724.                               Baumnotation  umgesetzt.  An  dieser 
  725.                               Stelle terminieren also alle Rekur-
  726.                               sionen. 
  727.                               Hinweis: Mancher wird hier die Be-
  728.                               handlung der symbolischen Konstanten 
  729.                               vermissen. Selbige würden nach die-
  730.                               sem Mechanismus als Variablen  im 
  731.                               Baum auftauchen. Dies  habe  ich  an 
  732.                               dieser Stelle in Kauf genommen, um 
  733.                               mir das Mitschleppen der vom  Be-
  734.                               nutzer gewünschten Variablen als ei-
  735.                               nen weiteren  Parameter  durch  alle 
  736.                               Klauseln des  Parsers  zu  ersparen. 
  737.                               Die  entsprechende  Ersetzung  durch 
  738.                               Konstanten wird zentral von dem Prä-
  739.                               dikat replace vorgenommen.
  740.  
  741.                               5. Wenn  die  Tokenliste  mit  einer 
  742.                               öffnenden Klammer beginnt, und  nach 
  743.                               der  schliessenden  Klammer   nichts 
  744.                               mehr folgt, wird das Argument in den 
  745.                               Klammern extrahiert (aeussere_Klam-
  746.                               mern), rekursiv dem Parsing unter-
  747.                               worfen und der daraus erhaltene term 
  748.                               zurückgegeben.
  749.  
  750.                               6. Falls hingegen nach der schlies-
  751.                               senden  Klammer  noch  etwas   folgt 
  752.                               (Op|Rest), wird der führende Klam-
  753.                               merterm komplett zu einem String zu-
  754.                               sammengezogen und tokenliste_term 
  755.                               mit diesem  String  als  "Kopf"  und 
  756.                               Op|Rest als "Rest" rekursiv aufge-
  757.                               rufen. 
  758.  
  759.                               7. Die Behandlung von Funktionen und 
  760.                               Potenzen erfolgt  vollkommen  analog 
  761.                               zu den Klammertermen.  Der  vor  der 
  762.                               Klammer stehende 'Name' wird auf Zu-
  763.                               gehörigkeit zu einer Liste von gül-
  764.                               tigen  Funktionsbezeichner  geprüft. 
  765.                               Diese Liste ist übrigens umfangrei-
  766.                               cher als notwendig, aber  ich  werde 
  767.                               den Parser wohl auch noch in anderen 
  768.                               Programmen einsetzen.
  769.  
  770.                               8.  Nun  wird  die   Kontrolle   des 
  771.                               Parsing an split_in_P_Liste über-
  772.                               geben, dessen Aufgabe  es  ist,  die 
  773.                               Liste in Teile aufzuteilen, die  nur 
  774.                               noch mit  Punktrechnungen  verknüpft 
  775.                               sind. 
  776.                               Im Detail:
  777.  
  778.                               a) Wenn  die  ankommende  Liste  nur 
  779.                               noch aus drei Teilen  besteht,  wird 
  780.                               geprüft, ob das zweite  Element  ein 
  781.                               Punktrechnungsoperator (ist_Punktop) 
  782.                               ist. Falls dies zutrifft,  wird  der 
  783.                               Kopf wieder in eine Tokenliste zer-
  784.                               legt und  rekursiv  'geparsed'.  Das 
  785.                               dritte Element, das ja eine  atomare 
  786.                               Größe sein muß, wird gleichfalls ge-
  787.                               parsed. Die Ergebnisse des rekursi-
  788.                               ven Parsing  werden  mit  einem  dem 
  789.                               Operator entsprechenden Funktor ver-
  790.                               knuepft (verknuepf).
  791.  
  792.                               b) Das  Gleiche  wird  durchgeführt, 
  793.                               wenn die Liste zwar  mehr  als  drei 
  794.                               Elemente enthält, aber der Teil nach 
  795.                               dem  Operator  einem   selbständigen 
  796.                               term entspricht. Selbstständige 
  797.                               terme sind Funktionen, Klammerterme 
  798.                               und Potenzen (ist_iso_term).
  799.  
  800.                               c) Wenn der ankommende Operator  ein 
  801.                               "+" ist, kann man den führenden  und 
  802.                               nachfolgenden  (rekursiv  geparsten) 
  803.                               term schon miteinander verknüpfen, 
  804.                               da das "+" die niedrigste  Priorität 
  805.                               hat und demgemäß alle anderen Ver-
  806.                               knüpfungen schon stattgefunden ha-
  807.                               ben.
  808.  
  809.                               d) Wenn ein "-"  ankommt,  kann  man 
  810.                               gleichfalls schon verknüpfen, falls 
  811.                               das Parsing des Restes keinen 
  812.                               Strichrechnungs-Funktor      ergibt. 
  813.                               Sonst könnte z.B. passieren, daß man 
  814.                               a-b+c zu minus(a,plus(b,c)) 
  815.                               verknüpft,  was  aber  in   normaler 
  816.                               Notation a-(b+c) entspräche.
  817.  
  818.                               e) Ansonsten werden die ersten  drei 
  819.                               Elemente  der  Liste,  falls   diese 
  820.                               nicht den Beginn einer Funktion, 
  821.                               eines Klammerterms oder einer Potenz 
  822.                               signalisieren, "zusammengepackt" und 
  823.                               wiederum mit dem Rest der Liste ge-
  824.                               parsed.
  825.  
  826.                               f) Sonst werden Funktionen, Potenzen 
  827.                               und Klammerterme extrahiert und  mit 
  828.                               dem  ersten  Listenelement  und  dem 
  829.                               Operator  verpackt.   Darauf   folgt 
  830.                               wieder  der  rekursive  Aufruf   mit 
  831.                               diesem  neuen  Listenkopf  und   dem 
  832.                               Rest. 
  833.  
  834.                               g) Zu guter letzt erfolgt die Be-
  835.                               handlung für den Fall,  daß  man  am 
  836.                               Ende des  Ausdrucks  angekommen  ist 
  837.                               (nur noch drei  Listenelemente),  wo 
  838.                               der  Kopf  dieser  Restliste  wieder 
  839.                               geparsed und mit dem letzten Element 
  840.                               verknüpft wird.
  841.  
  842.  
  843.                               9. Das Prädikat split_in_S_Liste 
  844.                               geht analog vor, um nur mit Strich-
  845.                               rechnung verknüpfte Terme zu zerle-
  846.                               gen.
  847.  
  848.                               Damit ist der Parser für die Rich-
  849.                               tung analytische Notation ---> Baum-
  850.                               notation fertig.
  851.  
  852.                               ------------------------------------
  853.                                    Eine schwierige Umkehrung
  854.                               ------------------------------------
  855.  
  856.                               Leider habe ich bei diesem  Prädikat 
  857.                               keine Möglichkeit gefunden, die Um-
  858.                               kehrbarkeit unmittelbar zu berück-
  859.                               sichtigen. Dies scheint bei  solchen 
  860.                               Parsing-Aufgaben auch ein prinzi-
  861.                               pielles Problem zu sein. Dazu könn-
  862.                               ten ja mal einige theoretisch inte-
  863.                               ressierte Programmierer einen Bei-
  864.                               trag liefern. Ich habe der Einfach-
  865.                               heit halber für die Umkehrung eigene 
  866.                               Klauseln geschrieben, wobei die oben 
  867.                               erwähnten Klauseln für die  atomaren 
  868.                               Größen natürlich beidseitig wirken.
  869.  
  870.                               Die Klauseln für die Richtung Baum-
  871.                               notation --->  analytische  Notation 
  872.                               sind  allesamt  recht  einfach.  Sie 
  873.                               brauchen sich in dem Baum nur rekur-
  874.                               siv bis zu den atomaren Größen vor-
  875.                               arbeiten und  dabei  die  Namen  von 
  876.                               Variablen, Konstanten etc. ausgeben, 
  877.                               wobei an den richtigen Stellen Klam-
  878.                               mern eingefügt werden  müssen.  Wenn 
  879.                               man sich die Klauseln ansieht, artet 
  880.                               das Ganze in eine fürchterliche Ver-
  881.                               kettung  von  Tokenlisten  mit   dem 
  882.                               Prädikat append aus. Wo die Klammern 
  883.                               bei Funktionen und Funktions-ähn-
  884.                               lichen termen (Potenzen) gesetzt 
  885.                               werden müssen, ist trivial.
  886.  
  887.                               Interessant sind eigentlich nur drei 
  888.                               Fälle: 
  889.  
  890.                               1.) Beim Auftreten des Funktor div 
  891.                               muß der  zweite  Operand  geklammert 
  892.                               werden, falls er ein  Punkrechnungs- 
  893.                               oder Strichrechnungsoperator ist.
  894.  
  895.                               2.) Beim Auftreten eines Punktrech-
  896.                               nungsfunktor,  der  ein  oder   zwei 
  897.                               Strichrechnungsfunktoren    enthält, 
  898.                               müssen diese geklammert werden.
  899.  
  900.                               3.) Beim Auftreten des Funktor minus 
  901.                               muß der  zweite  Operand  geklammert 
  902.                               werden, wenn er ein Strichrechnungs-
  903.                               funktor ist.
  904.  
  905.                               Ein Sonderfall sind terme wie 0-x, 
  906.                               die aus dem Parsingprozeß resultie-
  907.                               ren und als -x ausgegeben werden 
  908.                               müssen.
  909.  
  910.                               Leider mußte ich für jede der diver-
  911.                               sen  Kombinationen,  die   auftreten 
  912.                               können, eine eigene Klausel schrei-
  913.                               ben, wobei diese natürlich alle fast 
  914.                               gleich aussehen (Typ für's eintip-
  915.                               pen:  Kopierfunktion  des  Editors). 
  916.                               Dafür gibt es nur einen  Grund:  Man 
  917.                               kann dem elektronischen Trottel  das 
  918.                               Kommutativgesetz   (Vertauschbarkeit 
  919.                               von Operanden) nicht anständig bei-
  920.                               bringen, da keine schlüssige Mög-
  921.                               lichkeit existiert, das  Vertauschen 
  922.                               von Operanden  zu  terminieren.  Man 
  923.                               könnte natürlich immer  die  Ver-
  924.                               tauschungen  mitzählen,   was   aber 
  925.                               nicht gerade elegant ist. 
  926.  
  927.                               Sei's drum, die zusätzliche Tippar-
  928.                               beit ist bei Einsatz der Kopierfunk-
  929.                               tion minimal - und das Programm wird 
  930.                               durch solche lineare  Programmierung 
  931.                               eher schneller.
  932.  
  933.                               ------------------------------------
  934.                                        Das Hauptprogramm
  935.                               ------------------------------------
  936.  
  937.                               Auf eine großartige Benutzerober-
  938.                               fläche habe ich bei diesem  Programm 
  939.                               verzichtet, da es mir im  wesent-
  940.                               lichen auf den Aspekt der Symbolver-
  941.                               arbeitung ankam. Das Prädikat start' 
  942.                               definiert nur ein Fenster mit Über-
  943.                               schrift, in dem ein Buchstabenmenue 
  944.                               mit den Optionen "A)bleiten", "I)n-
  945.                               tegrieren",   "V)ereinfachen"    und 
  946.                               "Q)uit" ausgegeben wird. 
  947.  
  948.                               Nach Anwahl eines  Menüpunktes  kann 
  949.                               man  seinen  Funktionsterm  eingeben 
  950.                               (z.B. a*x*y + b/(a*y)), wird nach 
  951.                               den  verwendeten  Variablen  gefragt 
  952.                               (z.B. x y") und muß gegebenenfalls 
  953.                               die  Variable  eingeben,  nach   der 
  954.                               differenziert oder integriert werden 
  955.                               soll. Das Ergebniss wird dann ausge-
  956.                               druckt.
  957.  
  958.                               ------------------------------------
  959.                                        Rapid Prototyping
  960.                               ------------------------------------
  961.  
  962.                               Wenn  man  das  Programm  in  seiner 
  963.                               Gesamtheit  betrachtet,  kriegt  man 
  964.                               gelegentlich den Eindruck,  daß  ein 
  965.                               hoher Grad  an  Redundanz  vorhanden 
  966.                               ist, d.h. daß es für einen bestimm-
  967.                               ten Fall oft mehrere Programmstellen 
  968.                               gibt, wo dieser berücksichtigt wird. 
  969.                               Dies resultiert aus der Vorgehens-
  970.                               weise, mit der ich Prolog-Programme 
  971.                               schreibe. 
  972.  
  973.                               Hierbei denke ich  mir  ein  Konzept 
  974.                               für ein Prädikat aus und  realisiere 
  975.                               die  dazugehörigen  Klauseln.   Beim 
  976.                               Austesten des Prädikats benutze ich, 
  977.                               falls  ein  Fehler   auftritt,   die 
  978.                               Trace-Funktion  und  korrigiere  den 
  979.                               Fehler dann,  indem  ich  z.B.  noch 
  980.                               eine zusätzliche  Klausel  einführe. 
  981.                               Diese Vorgehensweise birgt natürlich 
  982.                               das Risiko von Redundanzen in  sich, 
  983.                               weil man dabei  die  Gesamtheit  des 
  984.                               Programmes aus dem Auge verliert.
  985.  
  986.                               Ich muß hier vorab klarstellen,  daß 
  987.                               ich durchaus ein Anhänger der struk-
  988.                               turierten   Programmierung   bin   - 
  989.                               schließlich habe  ich  einige  Jahre 
  990.                               hauptsächlich in Pascal  program-
  991.                               miert. Aber wir leben  nicht mehr im 
  992.                               Lochkarten-Zeitalter, wo jeder Feh-
  993.                               ler im Programm zu  Umlaufzeiten  in 
  994.                               der Größenordnung von Stunden führ-
  995.                               te. Im Gegenteil, schon seit  Jahren 
  996.                               macht sich das Problem der Software-
  997.                               Krise bemerkbar.  Immer  mehr  Leute 
  998.                               benutzen Computer jeder Größenord-
  999.                               nung und fordern dafür Individual-
  1000.                               software, die von den Programmierern 
  1001.                               so schnell  nicht  geliefert  werden 
  1002.                               kann.
  1003.  
  1004.                               Aus  dieser  Perspektive   ist   die  
  1005.                               Philosophie des "Rapid  Prototyping" 
  1006.                               nur positiv zu bewerten. Moderne AI-
  1007.                               Programmiersysteme      unterstützen 
  1008.                               durch   ihre   Interaktivität    die 
  1009.                               schnelle Entwicklung  von  Programm-
  1010.                               Prototypen ganz hervorragend,  wobei 
  1011.                               diese Prototypen interaktiv  -  auch 
  1012.                               im Dialog mit dem Anwender,  ver-
  1013.                               bessert werden. Diese Vorgehensweise 
  1014.                               führt zu sehr kurzen Entwicklungs-
  1015.                               zeiten von Programmen,  wobei  diese 
  1016.                               durch das  Tracing  unter  Umständen 
  1017.                               sogar fehlerfreier sind, als her-
  1018.                               kömmlich entwickelte Programme.
  1019.  
  1020.                               Zumindest für mich hat diese Ent-
  1021.                               wicklungsstrategie noch einen wich-
  1022.                               tigen, vielleicht den allerwichtig-
  1023.                               sten Vorteil: Das Programmieren wird 
  1024.                               wieder kreativer! Ich  fühlte  mich, 
  1025.                               nachdem ich ein Struktogramm ent-
  1026.                               worfen und dieses z.B. in Pascal um-
  1027.                               gesetzt hatte, oftmals zur Codier-
  1028.                               maschine degradiert und sehnte  mich 
  1029.                               nach  den  Zeiten  der  Basic-   und 
  1030.                               Assemblerhackerei zurück. Die  ganze 
  1031.                               Programmiererei wurde in ein weit-
  1032.                               gehend automatisiertes Schema-F ge-
  1033.                               packt, wo kein Platz mehr für spon-
  1034.                               tane Ideen und Spielereien  war.  In 
  1035.                               diesem Sinne pfeife ich auf die paar 
  1036.                               kB Speicher und Millisekunden 
  1037.                               Ausführungszeit, die mir durch Re-
  1038.                               dundanzen und ähnliches verloren ge-
  1039.                               hen. 
  1040.  
  1041.                               Diese fallen  heutzutage,  wo  schon 
  1042.                               bessere Home-Computer ihren Speicher 
  1043.                               in MegaByte messen und in Geschwin-
  1044.                               digkeitsregionen  von  einigen  MIPS 
  1045.                               (Millionen Instruktionen pro Sekun-
  1046.                               de) vordringen, nicht mehr ins Ge-
  1047.                               wicht.
  1048.  
  1049.                               ------------------------------------
  1050.                                             Resume 
  1051.                               ------------------------------------
  1052.  
  1053.                               Ich weiß  nicht,  ob  mein  Computer 
  1054.                               durch die  Symbolverarbeitung  einen 
  1055.                               Hauch von Intelligenz bekommen  hat. 
  1056.                               Mein Problem ist  hier  wieder,  daß 
  1057.                               der "Zauber" solcher Programme nicht 
  1058.                               wirkt, wenn man weiß, wie sie funk-
  1059.                               tionieren. Bekannte von mir, bemer-
  1060.                               kenswerter Weise auch Leute, die nu-
  1061.                               merische   Probleme   programmieren, 
  1062.                               zeigen sich von  dem  Programm  doch 
  1063.                               beeindruckt. Der Umfang des  Pro-
  1064.                               grammes wurde schon auf hunderte von 
  1065.                               Seiten Quellcode geschätzt - aller-
  1066.                               dings ohne Kenntniss der angewandten 
  1067.                               Sprache.
  1068.  
  1069.                               Eines ist auf jeden Fall  klar:  Die 
  1070.                               Kiste kann mittlerweile besser inte-
  1071.                               grieren und differenzieren als ich. 
  1072.                               (Martin Schlöter)
  1073.