Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS 2002 1 Funktionale Programmierung.

Ähnliche Präsentationen


Präsentation zum Thema: "Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS 2002 1 Funktionale Programmierung."—  Präsentation transkript:

1 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionale Programmierung

2 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionale Programmierung: Vorlesungsüberblick 1.Funktionale Programmierung Prinzipien funktionaler Programmierung Funktionale Programmierung in Modula-3 Rekursive Programmierung Aufwandsbetrachtungen rekursiver Programme 2. Semantik funktionaler Programme Induktiver Beweis Induktive Deutung Fixpunktdeutung 3. Einführung in die rein funktionale Programmiersprache Scheme 4. Verfahren zur automatischen Speicherverwaltung

3 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Eigenschaften rein funktionaler Programmierung Alle Programme und Prozeduren sind Funktionen und unterscheiden deutlich zwischen hereinkommenden Werten (Parameter) und herausgehenden Werten (Ergebnisse) Programmausführung in funktionalen Programmen ist die Auswertung eines Ausdrucks Es gibt keine Variablen – Variablen werden durch Parameter ersetzt Es gibt keine Zuweisungen und keine Schleifen – Schleifen werden durch rekursive Aufrufe ersetzt Der Wert einer Funktion hängt nur vom Wert der Parameter ab und nicht von der Reihenfolge der Berechnungen

4 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionale und imperative Programmierung Vorteile funktionaler Programmierung gegenüber imperativer Programmierung einheitliche Betrachtung von Programmen als Funktionen Behandlung von Funktionen als Daten (=Werte) Einschränkung von Seiteneffekten Automatische Speicherfreigabe Flexibilität, Prägnanz in der Notation, einfache Semantik Hauptnachteil funktionaler Programmierung ist die Ineffizienz der Programmausführung Anwendungsgebiete: künstliche Intelligenz, mathematische Beweissysteme, Logikanwendungen

5 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionales Programmieren in Modula-3 Imperative Programmiersprachen (wie Modula-3) besitzen im allgemeinen ebenfalls mehr oder weniger ausgereifte Formen der funktionalen Programmierung rein funktionale Programmierung in imperativen Sprachen kann durch folgende Einschränkungen bei der Auswahl der gewählten Programmierelemente erreicht werden ausschließliche Verwendung von Funktionen zur Beschreibung des Kontrollflusses eines Programms wird alleinig auf Selektion und Funktionsaufruf zurückgegriffen keine Verwendung von Variablen, Zuweisungen und Schleifen in den Programmen Mächtigkeit des so eingeschränkten Programmiermodells entspricht dem der uneingeschränkten Sprache Modula-3

6 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Voraussetzungen (Euklidischer Algorithmus) Euklidischer Algorithmus kann zur Berechnung des größten gemeinsamen Teilers (ggT) benutzt werden Eine Zahl ggT heißt größter gemeinsamer Teiler zweier Zahlen a und b falls gilt: ggT teilt a und b für jeden gemeinsamen Teiler d von a und b gilt: d teilt die Zahl ggT wichtige Eigenschaften des ggT: ggT(x,0) = x ggT(x, y) = ggT(y, x mod y) für x,y > 0

7 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Modula-3 Programm (Euklidischer Algorithmus) PROCEDURE ggT(a,b : INTEGER) : INTEGER= VAR tmp : INTEGER; BEGIN LOOP IF b = 0 THEN RETURN a; tmp := a; a := b; b := tmp MOD b; END; END ggT;

8 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Modula-3-Programm (Rekursive Funktion) PROCEDURE ggT(a,b : INTEGER) : INTEGER= BEGIN IF b = 0 THEN RETURN a; ELSE RETURN ggT(b, a MOD b) END; END ggT;

9 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Allgemeiner Entwurf rekursiver Funktionen analog zum Beweisen mit vollständiger Induktion stellt man sich die Frage: wie wird der Basisfall gelöst? der absolute Trivialfall der einfachste nicht-triviale Fall wie kann der allgemeine Fall der Größe n auf die Lösung für eine Größe n´< n reduziert werden? aus der so erzeugten Spezifikation können bedingte Gleichungen abgeleitet werden, die dann in Programmcode umgesetzt werden solchermaßen konstruierte rekursive Funktionen können dann mittels Induktion als korrekt bewiesen werden

10 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursive Funktionen: Mathematische Operationen PROCEDURE mod (n,m:INTEGER):INTEGER = (* n  0, m > 0*) BEGIN IF n < m THEN RETURN n; ELSE RETURN mod(n-m,m); END; END mod;

11 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursive Funktionen: Mathematische Operationen PROCEDURE binom (n,k:INTEGER):INTEGER =(*n,k  0, n  k*) BEGIN IF n = k OR k = 0 THEN RETURN 1; ELSE RETURN binom(n-1,k-1) + binom(n-1,k); END; END binom;

12 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursive Funktion: Erkennen eines Palindroms PROCEDURE h (n : INTEGER) : INTEGER = (* n  0 *) BEGIN IF n < 10 THEN RETURN 1 ELSE RETURN 10 * h(n / 10) END; END h; PROCEDURE spiegel (n : INTEGER) : INTEGER = (* n  0 *) BEGIN IF n < 10 THEN RETURN n ELSE RETURN mod(n,10) * h(n) + spiegel(n/10) END; END spiegel; PROCEDURE palindrom (n: INTEGER) : BOOLEAN = (*n  0*) BEGIN RETURN spiegel(n) = n END palindrom;

13 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursionsformen: Lineare Rekursion in einer rekursiven Funktionsdeklaration für f tritt ein Aufruf von f in jedem Zweig einer Fallunterscheidung höchstens einmal auf PROCEDURE sum(i, j : INTEGER) : INTEGER = BEGIN IF i  j THEN RETURN 0; ELSE RETURN i + sum(i + 1, j); END; END sum;

14 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursionsformen: Repetitive Rekursion eine linear rekursive Funktion f heißt repetitiv rekursiv, falls alle rekursiven Aufrufe in den Zweigen einer Fallunterscheidung als äußerste (letzte) Aktion vorkommen PROCEDURE ggT(u,v : INTEGER) : INTEGER = BEGIN IF v = 0 THEN RETURN u; ELSE RETURN ggT(v, u MOD v); END; END ggT;

15 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursionsformen: Kaskardenartige Rekursion treten in mindestens einem Zweig einer Fallunterscheidung zwei oder mehr rekursive Aufrufe auf, so spricht man von einer kaskaden- oder baumartigen, nichtlinearen Rekursion PROCEDURE binom (n,k:INTEGER):INTEGER = BEGIN IF n = k OR k = 0 THEN RETURN 1; ELSE RETURN binom(n-1,k-1) + binom(n-1,k); END; END binom;

16 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Rekursionsformen: Vernestete Rekursion treten im Rumpf einer rekursiven Funktion f in den aktuellen Parameterausdrücken eines rekursiven Aufrufs von f weitere rekursive Aufrufe von f auf, so heißt f vernestet. PROCEDURE ackermann (m,n:INTEGER):INTEGER = (*m,n  0*) BEGIN IF m = 0 THEN RETURN n + 1; ELSEIF n = 0 THEN RETURN ackermann(m-1,1) ELSE RETURN ackermann(m-1, ackermann(m,n-1)); END; END ackermann;

17 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Effizienz funktionaler Programme Bewertungskriterien für den Auswertungsaufwand eines funktionalen Programms Anzahl der auf algorithmischer Basis bei der Berechnung auszuführenden Grundoperationen Anzahl der durchgeführten rekursiven Funktionsaufrufe Aufruftiefe der rekursiven Funktionen Effizienz funktionaler Programme leidet oft besonders unter dem sehr kostspieligen Aufbau der Funktionsrahmen während der rekursiven Berechnung der Funktionsergebnisse zur Effizienzverbesserung werden funktionale Programme vom Übersetzer oft vor der Ausführung wieder in eine nicht rekursive Form gebracht

18 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Laufzeitstapel beim rekursiven Aufruf Stapel Basis Wachstum Rahmen der aufrufenden Funktion top of stack Rahmen der aufgerufenen Funktion

19 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Bestandteile von Funktionsrahmen Parameter Temporär genutzter Platz Rücksprungadresse Statischer Verweis Dynamischer Verweis

20 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Automatische Transformation rekursiver Aufrufe Anlegen der Funktionsrahmen zur Ausführung einer rekursiven Funktion ist sowohl sehr speicher- als auch sehr zeitintensiv Übersetzer für funktionale Sprachen versuchen daher bei der Programmerzeugung intern rekursive Funktionen wieder in Schleifen zu transformieren repetitiv rekursive Funktionen eignen sich besonders zur einfachen und schnellen Rücktransformation in Schleifen nicht repetitiv rekursive Funktionen können mittels akkumulierender Parameter in repetitive Funktionen transformiert werden

21 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Transformation von rekursiven Aufrufen in Schleifen Eigenschaften repetitiv rekursiver Funktionen: vor Auswertung eines neuen rekursiven Aufrufs ist die Auswert-ung des vorhergehenden rekursiven Aufrufs völlig abgeschlossen aktuelle Parameterwerte müssen nicht aufbewahrt werden Umwandlung repetitiv rekursiver Funktionen in Schleifen: für jeden Funktionsparameter p i wird eine Variable t i angelegt Funktionsrumpf wird in eine Endlosschleife umgewandelt nicht rekursive Fallunterscheidungen bleiben unverändert rekursive Fallunterscheidungen werden in 2 Schritten modelliert: Zuweisungen der aktuellen Parameterwerte a i des rekursiven Aufrufs zu den temporären Variablen t i Zuweisung der den t i zugewiesenen Werte an die formalen Parametern der Funktion p i

22 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Beispiel: Repetitiv rekursive Funktion PROCEDURE ggT(u,v : INTEGER) : INTEGER = BEGIN IF v = 0 THEN RETURN u; ELSE RETURN ggT(v, u MOD v); END; END ggT;

23 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Beispiel: Transformation in eine Schleife PROCEDURE ggT(u,v : INTEGER) : INTEGER = (* Vom Übersetzer eingefügte Hilfsvariablen *) VAR t1, t2 : INTEGER; BEGIN LOOP IF v = 0 THEN RETURN u; ELSE (* Auswertung der aktuellen Parameter *) t1 := v; t2 := u MOD v; (* Neuzuweisung der Parameter *) u := t1; v := t2; END; (* IF *) END; (* Schleife *) END ggT;

24 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Transformation nicht repetitiv rekursiver Funktionen prinzipiell kann jede rekursive Funktion in die repetitive Form gebracht und anschließend in eine Schleife transformiert werden einfach gestaltet sich die Transformation von nur linearen Rekursionen in das repetitiv rekursive Gegenstück in nur linearen Rekursionsformen ist in jeder Fallunterscheidung höchsten ein rekursiver Aufruf erlaubt rekursiver Aufruf in nur linearen Funktionen muss jedoch nicht die letzte Operation einer Fallunterscheidung sein Transformation von nur linearer in repetitiv lineare Rekursion rekursive Funktionsdeklaration wird um einen zusätzlichen Ergebnisparameter erweitert Operationen, die sonst erst nach Beendigung des rekursiven Aufrufes durchgeführt würden, werden vorab berechnet und dem Ergebnisparameter beim rekursiven Aufruf übergeben

25 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Beispiel: Nicht repetitiv rekursive Funktion PROCEDURE sum(i, j : INTEGER) : INTEGER = BEGIN IF i  j THEN RETURN 0; ELSE RETURN i + sum(i + 1, j); END; END sum;

26 Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Beispiel: Transformation in repetitiv rekursive Form PROCEDURE sum1(i, j, sumSoFar : INTEGER) : INTEGER = BEGIN IF i  j THEN RETURN sumSoFar; ELSE RETURN sum1(i + 1, j, sumSoFar + i) END; END sum1; PROCEDURE sum(i, j : INTEGER) : INTEGER = BEGIN RETURN sum1(i, j, 0); END sum;


Herunterladen ppt "Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS 2002 1 Funktionale Programmierung."

Ähnliche Präsentationen


Google-Anzeigen