Dieser Hinweis ist aus der Übung im WS 1994/95 oder aus einer noch älteren Übung oder war nie Teil einer Übung und ist daher möglicherweise für spätere Übungen nicht gültig!
Partielle Auswertung von Programmen Einige Beispiele, die z.B. die Schnittstelle \hinweis{makenextdone} verwendeten, oder ausdruck//1, haben Programmiertechniken gezeigt, die es erlauben, relativ allgemeine und erweiterbare Programme zu schreiben. Diese Allgemeinheit hat aber einen oft entscheidenden Nachteil: Die Programme laufen wesentlich langsamer als äquivalente effizient kodierte Varianten. Ist etwa beim Ziel ausdruck_liste/2 der Ausdruck schon vor einem Beweis bekannt, nur die zu betrachtende / erzeugende Liste unbekannt, könnte man eigentlich ein spezialisiertes und effizienteres Programm schreiben. Man steht so früher oder später vor der gleichen unangenehmen Wahl, wie auch in anderen Programmiersprachen: Entweder man entscheidet sich für Effizienz (speziellere ,,auscodierte`` Programmteile, in Modula oder C vermeidet man dann möglichst Prozeduraufrufe etc.) und nimmt dadurch einen erhöhten Kodierungs- und Wartungsaufwand in Kauf, oder man bleibt bei der Allgemeinheit und riskiert damit die Verwendbarkeit des Programms. Erfahrungsgemäß laufen z.B. metainterpretierte Programme in Prolog um ca. eine Faktor 3-10 langsamer. Manchmal ist der Mehraufwand durch Allgemeinheit auch exponentiell! Es kommt oft vor, daß man in einem Programm mehrere solcher Interpretationsebene einführt, um das Programm wartbarer zu machen. (siehe z.B. \hinweis{makenextdone} für eine solche Verallgemeinerung, die man auch innerhalb eines Metainterpreters verwenden könnte). Diese Mehrkosten multiplizieren sich so weit, daß daraus einige Größenordnungen werden. (Faktor 1000 nicht unüblich). Durch einen solchen Mehraufwand kann man leicht eingeschüchtert werden und versucht sein, sich einen ,,effizienteren`` Programmierstil anzueignen. Bevor Sie aber in die Niederungen der ,,effizienten`` Programmiererei hinabsteigen, die auch in Prolog nicht viel besser als in anderen Programmiersprachen ist, versuchen Sie einmal, genau diese Aufgabe einem Programm zu überlassen. Nehmen Sie etwa die Prädikate aus Beispiel 28. Schreiben Sie etwa statt :- letztes_app(X, Xs). nun :- pe letztes_app(X, Xs). Es wird nach dem DO ein spezialisiertes Programm am Beispielende eingefügt. Sehen Sie sich dieses Programm genauer an! oder :- pe ausdruck_liste({[a]}, L). \hinweis{mixtusproblem} Der in dieser Umgebung eingebaute partielle Auswerter heißt Mixtus. Er wurde am SICS (© Swedish Institute of Computer Science 1991) von Dr. Dan Sahlin in Prolog entwickelt. \hinweis{mixtusman} detailliertere Erklärung \hinweis{PrologAllgemein} Zurück: \hinweis{init}