Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung



Ähnliche Dokumente
Einführung in die Programmierung

Grundlagen der Programmierung (Vorlesung 14)

Programmierkurs Java

Was ist Logische Programmierung?

Erwin Grüner

Kontrollstrukturen, Strukturierte Programmierung

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Entwurf von Algorithmen - Kontrollstrukturen

Objektorientierte Programmierung

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Java Kurs für Anfänger Einheit 5 Methoden

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Lineare Gleichungssysteme

SOI Die Schweizer Informatikolympiade

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Kontrollstrukturen - Universität Köln

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Das Briefträgerproblem

7 Rechnen mit Polynomen

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Gesicherte Prozeduren

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Funktionale Programmierung mit Haskell

1 Vom Problem zum Programm

1 Mathematische Grundlagen

Lehrer: Einschreibemethoden

Lineare Gleichungssysteme

Einführung in die Informatik I

Primzahlen und RSA-Verschlüsselung

Zeichen bei Zahlen entschlüsseln

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Quadratische Gleichungen

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Grundlagen der Künstlichen Intelligenz

Wir arbeiten mit Zufallszahlen

Einführung in die Java- Programmierung

Grundlagen der Künstlichen Intelligenz

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Programmierung in C. Grundlagen. Stefan Kallerhoff

Algorithmen und Datenstrukturen

Automatisches Parallelisieren

Bevor lineare Gleichungen gelöst werden, ein paar wichtige Begriffe, die im Zusammenhang von linearen Gleichungen oft auftauchen.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Mächtigkeit von WHILE-Programmen

Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T:

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Welche Lagen können zwei Geraden (im Raum) zueinander haben? Welche Lagen kann eine Gerade bezüglich einer Ebene im Raum einnehmen?

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Kapiteltests zum Leitprogramm Binäre Suchbäume

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Softwarelösungen: Versuch 4

Programmieren Formulierung eines Algorithmus in einer Programmiersprache

Theoretische Informatik I

1. EINLEITUNG 2. GLOBALE GRUPPEN Globale Gruppen anlegen

R ist freie Software und kann von der Website.

Rundung und Casting von Zahlen

Vereinsverwaltung DFBnet Verein. Anleitung Familienbeiträge und Gemeinschaften

The B Method. B ist eine Methode zur Spezifikation zum Entwurf zur Implementierung von Software Systemen. Bücher zur B-Methode

Elemente der Analysis I Kapitel 2: Einführung II, Gleichungen

Algorithmen II Vorlesung am

Übung Theoretische Grundlagen

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

Pädagogische Hochschule Thurgau. Lehre Weiterbildung Forschung

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Informationsblatt Induktionsbeweis

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Ihr Ideen- & Projektmanagement-Tool

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Grundbegriffe der Informatik

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Access Grundlagen für Anwender. Andrea Weikert 1. Ausgabe, 1. Aktualisierung, Juli inkl. zusätzlichem Übungsanhang ACC2010-UA

Mit dem Tool Stundenverwaltung von Hanno Kniebel erhalten Sie die Möglichkeit zur effizienten Verwaltung von Montagezeiten Ihrer Mitarbeiter.

Druckerscriptsprache

Software Engineering Interaktionsdiagramme

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

7DVWH.HOOQHU. Kassensystem SANYO (X&D6RIWKapitel 42

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Rente = laufende Zahlungen, die in regelmäßigen Zeitabschnitten (periodisch) wiederkehren Rentenperiode = Zeitabstand zwischen zwei Rentenzahlungen

SCHRITT 1: Öffnen des Bildes und Auswahl der Option»Drucken«im Menü»Datei«...2. SCHRITT 2: Angeben des Papierformat im Dialog»Drucklayout«...

Korrelation (II) Korrelation und Kausalität

Kapitel MK:IV. IV. Modellieren mit Constraints

Kapitel 6: Graphalgorithmen Gliederung

Übersicht Programmablaufsteuerung

Kapitel 7 - Wägungen

Java-Programmierung mit NetBeans

Kundenspezifische Preise im Shop WyRu Online-Shop

Diana Lange. Generative Gestaltung Operatoren

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Plotten von Linien ( nach Jack Bresenham, 1962 )

2.11 Kontextfreie Grammatiken und Parsebäume

Transkript:

Funktionale Programmierung 1 Funktionale Programmierung: Vorlesungsüberblick 1. Funktionale Programmierung Prinzipien funktionaler Programmierung Funktionale Programmierung in prozeduralen Sprachen 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 2 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 3

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 4 Funktionales Programmieren in imperativen Sprachen 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 imperativen Sprache 5 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 6

Modula-3 Programm (Euklidischer Algorithmus) PROCEDURE ggt(a,b : INTEGER) : INTEGER= VAR tmp : INTEGER; LOOP IF b = 0 THEN RETURN a; tmp := a; a := b; b := tmp MOD b; 7 Modula-3-Programm (Rekursive Funktion) PROCEDURE ggt(a,b : INTEGER) : INTEGER= IF b = 0 THEN RETURN a; RETURN ggt(b, a MOD b) 8 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 derartig konstruierte rekursive Funktionen können dann mittels Induktion als korrekt bewiesen werden 9

Rekursive Funktionen: Mathematische Operationen PROCEDURE mod (n,m:integer):integer = (* n 0, m > 0*) IF n < m THEN RETURN n; RETURN mod(n-m,m); END mod; 10 Rekursive Funktionen: Mathematische Operationen PROCEDURE binom (n,k:integer):integer =(*n,k 0, n k*) IF n = k OR k = 0 THEN RETURN 1; RETURN binom(n-1,k-1) + binom(n-1,k); END binom; 11 Rekursive Funktion: Erkennen eines Palindroms PROCEDURE h (n : INTEGER) : INTEGER = (* n 0 *) IF n < 10 THEN RETURN 1 RETURN 10 * h(n / 10) END h; PROCEDURE spiegel (n : INTEGER) : INTEGER = (* n 0 *) IF n < 10 THEN RETURN n RETURN mod(n,10) * h(n) + spiegel(n/10) END spiegel; PROCEDURE palindrom (n: INTEGER) : BOOLEAN = (*n 0*) RETURN spiegel(n) = n END palindrom; 12

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 = IF i > j THEN RETURN 0; RETURN i + sum(i + 1, j); END sum; 13 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 = IF v = 0 THEN RETURN u; RETURN ggt(v, u MOD v); 14 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 = IF n = k OR k = 0 THEN RETURN 1; RETURN binom(n-1,k-1) + binom(n-1,k); END binom; 15

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*) IF m = 0 THEN RETURN n + 1; IF n = 0 THEN RETURN ackermann(m-1,1) RETURN ackermann(m-1, ackermann(m,n-1)); END ackermann; 16 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 17 Laufzeitstapel beim rekursiven Aufruf Basis Stapel Wachstum Rahmen der aufrufenden Funktion Rahmen der aufgerufenen Funktion top of stack 18

Bestandteile von Funktionsrahmen Parameter Temporär genutzter Platz Rücksprungadresse Statischer Verweis Dynamischer Verweis 19 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 20 Transformation von rekursiven Aufrufen in Schleifen Eigenschaften repetitiv rekursiver Funktionen: vor Auswertung eines neuen rekursiven Aufrufs ist die Auswertung 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 21

Beispiel: Repetitiv rekursive Funktion PROCEDURE ggt(u,v : INTEGER) : INTEGER = IF v = 0 THEN RETURN u; RETURN ggt(v, u MOD v); 22 Beispiel: Transformation in eine Schleife PROCEDURE ggt(u,v : INTEGER) : INTEGER = (* Vom Übersetzer eingefügte Hilfsvariablen *) VAR t1, t2 : INTEGER; LOOP IF v = 0 THEN RETURN u; (* Auswertung der aktuellen Parameter *) t1 := v; t2 := u MOD v; (* Neuzuweisung der Parameter *) u := t1; v := t2; (* IF *) (* Schleife *) 23 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 24

Beispiel: Nicht repetitiv rekursive Funktion PROCEDURE sum(i, j : INTEGER) : INTEGER = IF i > j THEN RETURN 0; RETURN i + sum(i + 1, j); END sum; 25 Beispiel: Transformation in repetitiv rekursive Form PROCEDURE sum1(i, j, sumsofar : INTEGER) : INTEGER = IF i > j THEN RETURN sumsofar; RETURN sum1(i + 1, j, sumsofar + i) END sum1; PROCEDURE sum(i, j : INTEGER) : INTEGER = RETURN sum1(i, j, 0); END sum; 26