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

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

der Universität Oldenburg
Programmierung 1 - Repetitorium
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Software-Engineering II Eingebettete Systeme, Softwarequalität, Projektmanagement Prof. Dr. Holger Schlingloff Institut für Informatik der Humboldt.
Rekursionen Erstellt von J. Rudolf im November 2001 /
Suche in Texten (Stringsuche )
2. Kapitel: Komplexität und Komplexitätsklassen
Puck eine visuelle Programmiersprache für die Schule
Imperative Programmierung
der Universität Oldenburg
der Universität Oldenburg
Einführung in Berechenbarkeit und Formale Sprachen
Numerik partieller Differentialgleichungen
Übung 6.1Turing-Maschine 1.Machen Sie sich mit der Funktionsweise des Busy Beaver-Programms vertraut Vollziehen sie die 11 Schritte der ersten Turing-Tabelle.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
6 Folgen (Teil II - Datenstrukturen und Algorithmen)
Imperative Programmierung Funktionen und Parameter
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Matthias Spohrer · TU München 8. Präsenzveranstaltung – TU Stammgelände Innenstadt Nachqualifizierungskurs für Informatiklehrkräfte.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Rekursion Richard Göbel.
Visualisierung funktionaler Programme
Grundlagen der Programmierung
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
2.4 Rekursion Klassifikation und Beispiele
Prof. Dr.-Ing. Franz-Josef Behr
Algorithmen und Datenstrukturen Übungsmodul 8
Parameterübergabemechanismen für den Methodenaufruf
Automaten, formale Sprachen und Berechenbarkeit II SoSe 2004 Prof. W. Brauer Teil 1: Wiederholung (Vor allem Folien von Priv.-Doz. Dr. Kindler vom WS 2001/02.
MODULA-2.
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
BMEVIEEA100 Grundlagen der Programmierung
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Programmiersprachen II Fortsetzung Datenstrukturen Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Dr. Wolfram Amme, Verifikation imperativer Programme, Informatik II, FSU Jena, SS Verifikation von imperativen Programmen.
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
1 Grundsätze objektorientierter Programmierung. Dr. Wolfram Amme, Grundsätze objektorientierter Programmierung, Informatik II, FSU Jena, SS Objektorientierte.
1 Eine Einführung in die objektorientierte Programmierung.
Dr. Wolfram Amme, Automatische Speicherverwaltung, Informatik II, FSU Jena, SS Automatische Speicherverwaltung.
2.4 Rekursion Klassifikation und Beispiele
Rekursion – Speicherverwaltung
Wiederholung Größte gemeinsame Teiler Satz von Bezout:
 Präsentation transkript:

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

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

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

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

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

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

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;

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;

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

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;

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;

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;

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;

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;

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;

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;

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

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

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

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

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

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;

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;

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

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;

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;