Funktionale Programmierung • Funktionen und Phänomene • Funktionen höherer Ordnung - Funktionale • Parameterübergabe • Formularmaschine - Auswertung von Funktionen • Rekursion • Polymorphie Funktionale Programmierung Motivation • Daten Funktionen Operationen auf Daten • Verwischen der Trennung von Daten und Operationen • Verwischen der Unterscheidung von Objektbeschreibung und Handlungsanweisung • Verschmelzen von Daten und Operationen Funktionale Programmierung Funktionen höherer Ordnung • Bekanntlich: Funktionenraum typ D [D'→D"] • Falls D', D'' wieder Funktionenräume, so bildet f D Funktionen aus D' auf Funktionen aus D" ab • f heißt Funktion höherer Ordnung (higher order function, Abk. HOF) oder Funktional Funktionale Programmierung HOF - typisches Beispiel 1 A={f: IR→IR | f ist integrierbar} B={f: IR→IR | f ist Funktion}. Integral ∫: A→B ist Funktional, das jeder integrierbaren Funktion f reellwertige Funktion F, die Stammfunktion, zuordnet: x ∫(f)=F mit ∫ f(t) dt=F(x) 0 ∫ [[real→real]→[real→real]]. Funktionale Programmierung HOF - typisches Beispiel 2 Ableitungsoperator ' ist Funktional ': {f: IR→IR | f ist differenzierbar} →{f: IR→IR | f ist Funktion} das jeder differenzierbaren Funktion ihre Ableitungsfunktion zuordnet: '(f)=f' ' [[real→real]→[real→real]] Funktionale Programmierung HOF - typisches Beispiel 3 Summation: a,b Z und f: Z→Z: b Σ f(i)=f(a)+f(a+1)+f(a+2)+...+f(b). i=a Fasse Summe als Funktion S auf mit f: Z→Z und Grenzen a,b Z als Argumenten S: {f: Z→Z }×Z×Z→Z mit b S(f,a,b)= Σ f(i). S ist vom Datentyp D mit typ D i=a [([int→int], int, int)→int]. Funktionale Programmierung HOF - typisches Beispiel 4 Komposition: Selbstanwendung einer Funktion f twice: [int→int]→[int→int] mit twice(f)=f°f. Zum Beispiel: twice(pred)=pred°pred und twice(pred) (7)=pred(pred(7))=5. Allgemeine Komposition: komp: [A→B]×[C→A]→[C→B] mit komp(f,g)=f°g. komp [([A→B],[C→A])→[C→B]]. Funktionale Programmierung HOF - Definition Definition: • Daten sind nullstellige Funktionen, besitzen die Ordnung 0 und heißen Konstanten. • Die Ordnung einer Funktion ist das Maximum der Ordnungen ihrer Argumente zuzüglich 1. Funktionen der Ordnung ≥2 heißen auch Funktionale. Funktionale Programmierung HOF - Beispiele Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: ∫ [[real→real]→[real→real]] Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: ' [[real→real]→[real→real]] Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: komp [([A→B],[C→A])→[C→B]] Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: twice: [int→int]→[int→int] Funktionale Programmierung HOF - Beispiele 1. Funktionen vorigen Beispielen besitzen alle Ordnung 2: twice: [int→int]→[int→int] 2. Die Konstante 17 besitzt Ordnung 0. Man kann sie interpretieren als nullstellige Funktion 17: unit→nat mit 17()=17. Funktionale Programmierung Currying • Idee: partielle Auswertung von Funktionen • liefere die Argumente der Reihe nach zu • betrachte “Zwischenfunktionen” als Funktionen auf den Restargumenten • Beachte: Als Tupel müssen die Argumente der Funktion immer en bloc zugeführt werden Funktionale Programmierung Currying - Motivation • Multiplikation • mult: IR×IR→IR mit mult(x,y)=xy (eigentlich: mult ((x,y)) ) mult ist “vernünftig”, wenn es nur partiell ausgewertet wird, z.B. • d: IR→IR mit d=mult(2,·) bzw. d(x)=mult(2,x) oder • DollarDM: IR→IR mit DollarDM=mult(1.521,·) Funktionale Programmierung Currying - Motivation • Multiplikation • mult: IR×IR→IR mit mult(x,y)=xy (eigentlich: Diesmult darf((x,y)) man ) so nicht mult ist “vernünftig”, wenn es nur partiell schreiben ausgewertet wird, z.B. • d: IR→IR mit d=mult(2,·) bzw. d(x)=mult(2,x) oder • DollarDM: IR→IR mit DollarDM=mult(1.521,·) Funktionale Programmierung Currying - 2-stellig • Currying: Übergang von 2-stelliger Funktion • f: A×B→C mit f(a,b)=c zu Funktion 2. Ordnung • F: A→(B→C) die man partiell auswerten kann: zunächst a zuführen und Funktion 1. Ordnung erhalten: • F(a): B→C dann auf b anwenden und Ergebnis erhalten: F(a)(b)=f(a,b) Funktionale Programmierung Currying - 2-stellig • Currying: Übergang von 2-stelliger Funktion • f: A×B→C mit f(a,b)=c zu Funktion 2. OrdnungUncurrying • F: A→(B→C) die man partiell auswerten kann: zunächst a zuführen und Funktion 1. Ordnung erhalten: • F(a): B→C dann auf b anwenden und Ergebnis erhalten: F(a)(b)=f(a,b) Funktionale Programmierung Currying - n-stellig • Currying: Übergang von n-stelliger Funktion • zu Funktion n-ter Ordnung • • • f: A1×...×An→B F: A1→(A2→(A3→...→(An→B)...)) mit F(a1)(a2)(a3)...(an)=f(a1,a2,a3,...,an). Eindeutige Zuordnung (Beweis s. Übungen) Schreibweise: F a1 a2 a3 ... an • dabei linksassoziative Interpretation: (...(((F(a1)a2)a3)...an) im folgenden fast immer gecurryte Schreibweise Funktionale Programmierung Informatischer Funktionsbegriff 1. Forderung: [D'→D”] nur berechenbare Funktionen 2. Forderung: Beschreibung von Funktionen durch ausführbare Rechenvorschriften Beispiel: Mathematik: ggT: IN0×IN0→IN0 mit ggT(a,b)=max{t IN0 | t\a und t\b} • • Brauchbarer: Effektiv ausführbare Rechenvorschrift zur Konstruktion des Ergebnisses: a, falls a=b, ggT(a,b)= ggT(b,a), falls a<b, ggT(a-b,b), sonst. { Funktionale Programmierung Informatischer Funktionsbegriff ggT(a,b)= { a, falls a=b, ggT(b,a), falls a<b, ggT(a-b,b), sonst. Rechne: ggT(40,12)=ggT(28,12)=ggT(16,12)=ggT(4,12) =ggT(12,4)=ggT(8,4)=ggT(4,4)=4. Ausführbare Beschreibungen von Funktionen nennt man Rechenvorschriften. Funktionale Programmierung Informatischer Funktionsbegriff Ist diese Def. sinnvoll? ggT(a,b)= { (selbstbezüglich, rekursiv) a, falls a=b, ggT(b,a), falls a<b, ggT(a-b,b), sonst. Rechne: ggT(40,12)=ggT(28,12)=ggT(16,12)=ggT(4,12) =ggT(12,4)=ggT(8,4)=ggT(4,4)=4. Ausführbare Beschreibungen von Funktionen nennt man Rechenvorschriften. Funktionale Programmierung Rechenvorschriften Definition: Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift. Allgemeine Definition: funktion f x1:D1 x2:D2 ... xn:Dn → D R. • • • • • f Bezeichner der Rechenvorschrift x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn D Datentyp des Funktionsergebnisses Funktionalität von f: D1→(D2→(D3→...(Dn→D)...)) R Ausdruck (Term) vom Typ D induktiv wie folgt definiert: Funktionale Programmierung Rechenvorschriften Definition: Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift. Kopf Rumpf Allgemeine Definition: funktion f x1:D1 x2:D2 ... xn:Dn → D R. • • • • • f Bezeichner der Rechenvorschrift x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn D Datentyp des Funktionsergebnisses Funktionalität von f: D1→(D2→(D3→...(Dn→D)...)) R Ausdruck (Term) vom Typ D induktiv wie folgt definiert: Funktionale Programmierung Rechenvorschriften Definition: Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift. Allgemeine Definition: funktion f x1:D1 x2:D2 ... xn:Dn → D R. • • • • • f Bezeichner der Rechenvorschrift x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn D Datentyp des Funktionsergebnisses Funktionalität von f: D1→(D2→(D3→...(Dn→D)...)) R Ausdruck (Term) vom Typ D induktiv wie folgt definiert: Funktionale Programmierung Rechenvorschriften Definition: Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift. Allgemeine Definition: funktion f x1:D1 x2:D2 ... xn:Dn → D R. • • • • • f Bezeichner der Rechenvorschrift x1,...,xn paarweise verschiedene formale Parameter vollständig der Datentypen D1,...,Dn gecurryed D Datentyp des Funktionsergebnisses Funktionalität von f: D1→(D2→(D3→...(Dn→D)...)) R Ausdruck (Term) vom Typ D induktiv wie folgt definiert: Funktionale Programmierung Rechenvorschriften Definition (Forts.): Elementare Bausteine: (1) E elementarer Typ und x E x Ausdruck vom Typ E (2) Für i=1,...,n ist xi Ausdruck vom Typ Di Konstruktoren: (3) g Rechenvorschrift der Funktionalität E'→E" und A Ausdruck vom Typ E' g(A) Ausdruck vom Typ E" (Konstruktor "Einsetzung" oder – für g=f – Konstruktor "Rekursion"). Funktionale Programmierung Rechenvorschriften Definition (Forts.): (4) A1 und A2 beliebige Ausdrücke vom Typ E und B ein Ausdruck vom Typ bool wenn B dann A1 sonst A2 ende Ausdruck vom Typ E (Konstruktor "Alternative", bedingter Ausdruck) (5) A Ausdruck vom Typ E (A) Ausdruck vom Typ E. Funktionen, die im Rumpf von f verwendet werden, heißen Stützfunktionen von f. Ein funktionales Programm ist eine Folge f1,...,fk von Funktionsdefinitionen. Funktionale Programmierung Beispiele 1. ggT (s. o.) funktion ggT a:nat b:nat → nat wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende. 2. Absolutfunktion: funktion abs x:real → real wenn x≥0 dann x sonst -x ende. 3. Signum-Funktion: typ vorzeichen {-1,0,1}; funktion sign x:real → vorzeichen wenn x<0 dann -1 sonst wenn x=0 dann 0 sonst 1 ende ende. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. 5. Konstanten als Funktionen: funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. weder Parameter, noch Typen angeben 5. Konstanten als Funktionen: funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. weder Parameter, noch Typen angeben 5. Konstanten als Funktionen: funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. 5. Konstanten als Funktionen: funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. 5. Konstanten als Funktionen: funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 4. Multiplikation und Verdoppelung: funktion mult x:int y:int → int funktion d x*y. mult 2. weder Parameter, noch Typ, da konstante 5. Konstanten als Funktionen: Funktion funktion pi → real 3.1415926; funktion kreisfläche r:real → real pi*r*r. Funktionale Programmierung Beispiele 6. Mischen: typ intlist {leer} | (int,intlist); funktion misch f:intlist g:intlist → intlist wenn f=leer dann g sonst wenn g=leer dann f sonst wenn (erstes f)<(erstes g) dann (erstes f,misch (rest f) g) sonst (erstes g,misch f (rest g)) ende ende ende . Funktionale Programmierung Applikation • Operation auf Rechenvorschriften, die zu Werten führt • Gegeben: funktion f x1:D1 ... xn:Dn → D • R. Anwendung/Applikation/Aufruf: f a1 a2 ... an • Substitution: Umwandlung des Rumpfs R in einen auswertbaren Ausdruck durch Ersetzung der formalen Parameter xi durch aktuelle Parameter ai Funktionale Programmierung Substitution - Beispiel • ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende • Bei Aufruf ggT 40 12 geht Rumpf über in wenn 40=12 dann 40 sonst wenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende Funktionale Programmierung Substitution - Beispiel • ggT: Beachte Klammerfunktion ggT a: nat b: natsetzung → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende • Bei Aufruf ggT 40 12 geht Rumpf über in wenn 40=12 dann 40 sonst wenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende Funktionale Programmierung Substitutionsregeln Gegeben: funktion f x:D → D' Aufruf: R. fE Freiheitsgrade bei der Substitution: • • wann wird E ausgewertet • • vor der Substitution von x durch E • • an jeder Stelle, an der x vorkommt nach der Substitution von x durch E wie oft wird E ausgewertet einmalig Funktionale Programmierung Call by value - Wertübergabe Vorschrift: Um f(E) zu berechnen, werte zunächst E aus. Ersetze x überall im Rumpf R durch Wert von E und werte den so modifizierten Rumpf aus. Funktionale Programmierung Call by value - Wertübergabe Beispiel: Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) d(d 6) Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) d(d 6) d(6+6) Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) d(d 6) d(6+6) d 12 Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) d(d 6) d(6+6) d 12 12+12 Funktionale Programmierung Call by value - Wertübergabe Beispiel: d(d(d 3)) d(d(3+3)) d(d 6) d(6+6) d 12 12+12 24 Funktionale Programmierung Call by value - Wertübergabe Vorteil: entspricht mathematischer Tradition Nachteil 1: manchmal ineffizient Beispiel: funktion null x:int → int null(d(d(d 3))) null(d(d 6)) 0. null(d(d(3+3))) null(12+12) null 24 0 umfängliche Auswertung, obwohl Ergebnis 0 von Anfang an feststeht Funktionale Programmierung Call by value - Wertübergabe Nachteil 2: Inkonsequenz erforderlich. Beispiel: wenn b dann e sonst e' ende=wenn(b,e,e') Betrachte: funktion p x:int → int wenn x=0 dann 1 sonst p(x-1) ende =wenn(x=0,1,p(x-1)) Dann p x=1 für alle x≥0, aber p 0 wenn(0=0,1,p(-1)) wenn(true,1,p(-1=0,1,p(-2)))=wenn(true,1,p (false,1,p(-2))) ... Funktionale Programmierung Call by value - Wertübergabe Nachteil 2: Inkonsequenz erforderlich. Beispiel: wenn b dann e sonst e' ende=wenn(b,e,e') Betrachte: funktion p x:int → int wenn x=0 dann 1 sonst p(x-1) ende =wenn(x=0,1,p(x-1)) Dann p x=1 für alle x≥0, aber Abweichung von call-by-value p 0 wenn(0=0,1,p(-1)) nötig, um bed. Ausdruck überhaupt auswerten zu können wenn(true,1,p(-1=0,1,p(-2)))=wenn(true,1,p (false,1,p(-2))) ... Funktionale Programmierung Call by name - Namensübergabe Vorschrift: Um f(E) zu berechnen, ersetze x überall im Rumpf R durch den Text von E und werte den so modifizierten Rumpf aus. Funktionale Programmierung Call by name - Namensübergabe Beispiel: Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 6 3+3 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 3+3 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) 3+3 3+3 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) 3+3 3+3 6 6 (d 3)+(d 3) Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) 3+3 3+3 6 6 (d 3)+(d 3) 3+3 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) (d 3)+(d 3) 3+3 3+3 3+3 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) (d 3)+(d 3) 3+3 3+3 3+3 6 6 6 3+3 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) (d 3)+(d 3) 3+3 3+3 3+3 3+3 6 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) 12= (d 3)+(d 3) (d 3)+(d 3) =12 3+3 3+3 3+3 3+3 6 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) d(d 3)+d(d 3) =24 12= (d 3)+(d 3) (d 3)+(d 3) =12 3+3 3+3 3+3 3+3 6 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) =24 d(d 3)+d(d 3) =24 12= (d 3)+(d 3) (d 3)+(d 3) =12 3+3 3+3 3+3 3+3 6 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Beispiel: d(d(d 3)) =24 ineffizient durch d(d wiederholte Auswertung desselben 3)+d(d 3) =24 Ausdrucks 12= (d 3)+(d 3) (d 3)+(d 3) =12 3+3 3+3 3+3 3+3 6 6 6 6 Funktionale Programmierung Call by name - Namensübergabe Funktionale Programmierung Call by name - Namensübergabe Andererseits: Funktionale Programmierung Call by name - Namensübergabe Andererseits: Beispiel: funktion null x:int → int null(d(d(d 3))) 0. 0 (sehr effizient) Funktionale Programmierung Call by name - Namensübergabe Andererseits: Beispiel: funktion null x:int → int null(d(d(d 3))) 0. 0 (sehr effizient) 3. Strategie kombiniert beide Aspekte Funktionale Programmierung Call by need - lazy evaluation Vorschrift: Um f(E) zu berechnen, ersetze x überall in R textuell durch E und werte den modifizierten Rumpf aus. Sobald E zum ersten Mal ausgewertet wird, ersetze E im Rumpf überall durch den berechneten Wert. Funktionale Programmierung Call by need - lazy evaluation Beispiel: Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) =12 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) (d 3)+(d 3) =12 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) d(d 3)+d(d 3) =24 (d 3)+(d 3) =12 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Beispiel: d(d(d 3)) =24 d(d 3)+d(d 3) =24 (d 3)+(d 3) =12 3+3 6 Funktionale Programmierung Call by need - lazy evaluation Realisierung: Vorkommen von formalen Parametern durch Verweise auf zugehörige Argumente ersetzen Funktionale Programmierung Call by need - Sonderfall - lazy lists Beispiel: null(2 div 0)=0 und nicht undefiniert Gefeierte Anwendung: lazy lists Möglichkeit, prinzipiell unendliche Objekte zu definieren und mit ihnen zu operieren Funktionale Programmierung Substitutionsregeln Rest der Vorlesung: call by value neue (funktionale) Programmiersprache FUN: • Typkonzept aus Kapitel 9 • Funktionskonzept aus Kapitel 10 • call-by-value-Substitution Funktionale Programmierung Formularmaschine • Formularmaschine = algorithmisches Verfahren zur systematischen Auswertung von funktionalen Programmen • fomularmäßige Darstellung von Funktionsdefinitionen • geordnete Auswertung von Funktionen • graphische übersichtliche Darstellung • anschaulicher Beleg für Automatisierbarkeit funktionaler Programmierung Funktionale Programmierung Formularmaschine Definition: Geg.: Rechenvorschrift funktion f x1:D1 ... xn:Dn → D R. Ein Formular für f ist ein (geordnetes) Paar geordneter markierter Bäume (B0,B(R))mit: Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: Funktionsbezeichner f Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: formale Parameter xi Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: Funktionale Programmierung Formularmaschine B0 repräsentiert Kopf der Rechenvorschrift: konkrete Werte Funktionale Programmierung Formularmaschine B(R) repräsentiert Rumpf der Rechenvorschrift und ist induktiv wie folgt aufgebaut: 1. x Konstante, dann Baum B(x) 2. x formaler Parameter, dann Baum B(x) Funktionale Programmierung Formularmaschine 3. A1,...,Ak Ausdrücke mit zugehörigen Formularen B(A1),...,B(Ak). Aufruf (f A1 ... Ak) einer k-stelligen Funktion f, dann Baum B(f): Funktionale Programmierung Formularmaschine 4. b boolescher Ausdruck mit Formular B(b), A und A' beliebige Ausdrücke mit Formularen B(A) und B(A'). Zum Ausdruck wenn b dann A sonst A' ende gehört das Formular B(wenn) mit: Funktionale Programmierung Formularmaschine 4. b boolescher Ausdruck mit Formular B(b), A und A' beliebige Ausdrücke mit Formularen B(A) und B(A'). Zum Ausdruck wenn b dann A sonst A' ende gehört das Formular B(wenn) mit: gestrichelte Linien für Alternative Funktionale Programmierung Formularmaschine 5. A1,...,Ak Ausdrücke mit zugehörigen Formularen B(A1),...,B(Ak). Für Tupelausdruck (A1,...,Ak) ist das zugehörige Formular B((A1,...,Ak)) der Baum: Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende Funktionale Programmierung Beispiele 1. Absolutfunktion funktion abs x:real→real wenn x≥0 dann x sonst -x ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende 2. ggT: funktion ggT a: nat b: nat → nat; wenn a=b dann a sonst wenn a<b dann ggT b a sonst ggT (a-b) b ende ende Funktionale Programmierung Formularmaschine - Anwendung • Wie rechnet man mit der Formularmaschine? • Excel-Paradigma • Formularfelder mit Werten belegen • Felder verknüpfen, Ergebnisse in andere Felder übertragen • Ergebnisse aus-/ablesen Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 -7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 -7 -7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 -7 -7 +7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 false -7 -7 +7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) -7 false -7 -7 +7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) +7 -7 false -7 -7 +7 -7 Funktionale Programmierung Formularmaschine - Beispiel abs abs(-7) +7 +7 -7 false -7 -7 +7 -7 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 6 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 4 6 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 4 6 4 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 4 6 4 4 6 6 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 4 6 4 4 6 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 6 6 4 6 4 4 6 4 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 6 4 4 6 4 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 4 6 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 4 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 4 2 4 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 4 2 4 4 2 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 2 2 4 2 4 4 2 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 2 4 4 2 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 4 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 2 4 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 2 4 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 2 4 2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 2 4 2 2 4 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 4 4 2 4 2 2 4 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 4 2 2 4 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 true 2 2 2 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 true 2 2 2 false 2 2 2 2 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 true 2 2 2 false 2 2 2 2 0 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 true 2 2 2 false 2 2 2 2 0 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 true 2 2 2 false 2 2 2 2 0 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 2 2 2 2 2 true 2 2 2 false 2 2 2 2 0 2 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 false 4 2 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 4 2 false 4 4 2 2 false 4 2 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 2 4 2 false 4 4 2 2 false 4 2 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 4 2 2 4 2 2 false 4 4 2 2 false 4 2 2 2 4 2 4 2 2 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 true 2 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 4 false 2 2 4 2 true 2 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 2 4 false 2 2 4 2 true 2 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 2 4 2 2 2 4 false 2 2 4 2 true 2 2 4 4 2 -2 2 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 false 6 2 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 6 4 false 6 6 4 2 false 6 2 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 2 6 4 false 6 6 4 2 false 6 2 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 2 6 2 4 false 6 6 4 2 false 6 2 4 4 6 2 6 4 4 Funktionale Programmierung Formularmaschine - Beispiel ggT 6 4 2 6 2 4 2 false 6 6 4 2 false 6 2 4 4 6 2 6 4 4 Funktionale Programmierung Abstraktion • Abstraktion = Operation zum Übergang von Ausdrücken zu Rechenvorschriften durch Parametrisierung • Beispiel: Aus PRO bekannt: Mischen wurde abstrahiert Funktionale Programmierung Abstraktion Beispiel Ausdruck πr2h besitzt festen Wert oder • • • • • • • ist Funktion f: IN3→IN mit f(π,r,h)=πr2h oder ist Funktion f: IN→(IN→(IN→IN)) mit f π r h=πr2h oder ist Funktion g: Z→IR mit g(r)=πr2h oder ist Funktion h: IR→IR mit h(x)=πr2h oder ist Funktion mit der intendierten Bedeutung V: IR→(IR→IR) mit V r h=πr2h Funktionale Programmierung Abstraktion 1. Abstraktion: funktion V r:real h:real → real pi*r*r*h 2. Abstraktion funktion F r: real→real pi*r*r 3. Vereinfachung funktion V r:real h:real → real (F r)*h Funktionale Programmierung Baukasten für funkt Programmierung • Abstraktion, Applikation und Substitution bilden die grundlegenden Konstruktoren für die funktionale Programmierung • sie reichen aus, um alle berechenbaren Funktionen zu beschreiben Funktionale Programmierung Bindung Funktionale Programmierung Bindung Motivation: Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real pi*a*a*b Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real • funktion V h:real r:real → real pi*a*a*b pi*h*h*r Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real • funktion V h:real r:real → real • funktion V pi:real r:real → real pi*a*a*b pi*h*h*r pi*pi*pi*r Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real pi*a*a*b • funktion V h:real r:real → real pi*h*h*r • funktion V pi:real r:real → real pi*pi*pi*r • a und b bzw. h und r sind gebunden; pi ist frei Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real pi*a*a*b • funktion V h:real r:real → real pi*h*h*r • funktion V pi:real r:real → real pi*pi*pi*r • a und b bzw. h und r sind gebunden; pi ist frei Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real pi*a*a*b • funktion V h:real r:real → real pi*h*h*r • funktion V pi:real r:real → real pi*pi*pi*r • a und b bzw. h und r sind gebunden; pi ist frei Funktionale Programmierung Bindung Motivation: • funktion V a:real b:real → real pi*a*a*b • funktion V h:real r:real → real pi*h*h*r • funktion V pi:real r:real → real pi*pi*pi*r • a und b bzw. h und r sind gebunden; pi ist frei Funktionale Programmierung Bindung Definition: Ein Bezeichner innerhalb des Rumpfes einer Funktionsdefinition heißt gebunden, wenn er formaler Parameter der Funktion ist, anderenfalls heißt er frei. Der Bindungsbereich eines gebundenen Bezeichners ist die gesamte Rechenvorschrift. Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real (F r)*h Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real (F r)*h Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real (F r)*h Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real Wo ist F? (F r)*h Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real Wo findet man F? Wo ist F? (F r)*h Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real Wo ist F? (F r)*h Wo findet man F? Was passiert, wenn man zwei verschiedene F findet? Funktionale Programmierung statische und dynamische Bindung Motivation: funktion V r:real h:real → real Wo ist F? (F r)*h Wo findet man F? Was passiert, wenn man zwei verschiedene F findet? Und wenn man F anwendet, wo findet man dann pi? Funktionale Programmierung statische und dynamische Bindung 1. Strategie: statische Bindung • Bezeichner werden bezgl. ihrer Definitionsstelle gebunden. • Bindungen zur Übersetzungszeit des Programms. 2. Strategie: dynamische Bindung • Bezeichner werden bezgl. ihrer Zugriffsstelle gebunden. • Bindungen zur Laufzeit des Programms. Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung statische und dynamische Bindung Statische Bindung funktion pi 3.1415; Dynamische Bindung funktion pi 3.1415; funktion F r pi*r*r; funktion F r pi*r*r; funktion V r h (F r)*h; funktion V r h (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V 17.0 3.0; funktion V (r,h) (F r)*h; V (17.0,3.0); funktion V12 V 12.0; V (17.0,3.0); funktion V12 V 12.0; funktion F r 0.5*pi*r*r; funktion F r 0.5*pi*r*r; V (17.0,3.0); V (17.0,3.0); Funktionale Programmierung Rekursion • Sonderfall: Stützfunktion ist die Funktion selbst • Geht das überhaupt? • Wann geht das? • Wann nützt das? Funktionale Programmierung Rekursion - Fakultät Beispiel: Fakultät f(n)=n!=1.2.....n. Rekursive Definition: f(n)= { 1, falls n=0, n.f(n-1), falls n>0. Funktionale Programmierung Rekursion - Fakultät f(4)= Funktionale Programmierung Rekursion - Fakultät f(4)= 4 . f(3) Funktionale Programmierung Rekursion - Fakultät f(4)= 4 . f(3) || 3 . f(2) Funktionale Programmierung Rekursion - Fakultät f(4)= 4 . f(3) || 3 . f(2) || 2 . f(1) Funktionale Programmierung Rekursion - Fakultät f(4)= 4 . f(3) || 3 . f(2) || 2 . f(1) || 1 . f(0) Funktionale Programmierung Rekursion - Fakultät f(4)= 4 . f(3) || 3 . f(2) || 2 . f(1) || 1 . f(0) || 1 Funktionale Programmierung Rekursion - Fakultät f(4)= 4 f(3) || 3 . f(2) || 2 . f(1) || 1 . f(0) || 1 = 4 . 3 . 2 . 1 . 1 = 24. . Funktionale Programmierung Rekursion - Allgemeines Vorgehen Bedingungen, damit das funktioniert: • In jedem Ersetzungsschritt einer Funktionsanwendung durch die rechte Seite der Definition “vereinfacht” sich das Argument der Funktion. (Fakultät: n auf n-1) • Ersetzung terminiert, d.h., es gibt mindestens einen einfachsten Fall (terminales Argument), für das der Wert der Funktion unmittelbar gegeben ist. (Fakultät: für n=0 Funktionswert direkt ablesbar) Funktionale Programmierung Rekursion - einfachste Fälle Typische Exemplare einfachster Fälle: bei Problemen auf Zahlen: Null oder Eins. Wie lautet die Lösung für Eingabe 0 oder 1? bei Problemen auf Folgen oder Files: leere Folge oder leeres File. Wie lautet die Lösung für Eingabe [ ]? bei Problemen auf Texten: leerer Text. Wie lautet die Lösung für die Eingabe ""? bei Problemen auf Bäumen: leerer Baum oder Baum mit einem Knoten. Wie lautet die Lösung für den leeren Baum? • • • • Funktionale Programmierung Rekursion - Reduz. auf Einfacheres Typische Überlegungen zwischen Problemgröße n und nächstkleinerem Problem: Bei Zahlen: Bekannt: Lösung für Zahlen der Größe n-1. Gesucht: Lösung für Zahlen der Größe n? Bei Folgen: Bekannt: Lösung für Folgen der Länge n-1. Gesucht: Lösung für Folgen der Länge n? Bei Texten: Bekannt: Lösung für Texte der Länge n-1. Gesucht: Lösung für Texte der Länge n? Bei Bäumen: Bekannt: Lösung für Bäume der Höhe n-1. Gesucht: Lösung für Bäume der Höhe n? • • • • Funktionale Programmierung Rekursion - Definition Definition: Die Definition eines Problems, eines Verfahrens oder einer Funktion durch sich selbst bezeichnet man als Rekursion. Erscheint im Rumpf einer rekursiven Funktion f ein Aufruf von f selbst in der Form funktion f ... ... f ... so spricht man von direkter Rekursion. Gibt es eine Folge von Funktionen f=f1,f2,f3,...,fn, n≥2 der Art, daß sich für 1≤i≤n-1 jeweils fi auf fi+1 und fn wiederum auf f=f1 abstützt, so spricht man von indirekter Rekursion. Funktionale Programmierung Rekursion - Addition 1. Addition add zweier natürlicher Zahlen. Abstützung auf die Nachfolgerfunktion +1. Einfachster Fall: x+0=x. Reduktionsschritt: x+y=(x+(y-1))+1 Definition: funktion add x:nat y:nat → nat • • • • wenn y=0 dann x sonst (add x (y-1))+1 ende. Nun ist z.B. add 5 3=(add 5 2)+1=(add 5 1)+1+1 =(add 5 0)+1+1+1=5+1+1+1=8. Funktionale Programmierung Rekursion - Multiplikation 2. Multiplikation mult zweier natürlicher Zahlen. Abstützung auf die Addition. • • • Einfachster Fall: x*0=0. Reduktionsschritt: x*y=(x*(y-1))+x Definition: funktion mult x:nat y:nat → nat wenn y=0 dann 0 sonst add (mult x (y-1)) x. Funktionale Programmierung Rekursion - Exponentiation 3. Exponentiation exp zweier natürlicher Zahlen. Abstützung auf die Multiplikation. • • • Einfachster Fall: x0=1. Reduktionsschritt: xy=xy-1*x Definition: funktion exp x:nat y:nat → nat wenn y=0 dann 1 sonst mult (exp x (y-1)) x ende. Funktionale Programmierung Rekursion - Konkatenation 4. Konkatenation zweier Folgen ganzer Zahlen. Einfachster Fall: Konkateniert man eine Folge y mit einer leeren Folge, so ist y das Ergebnis. Reduktionsschritt: Um x mit y zu konkatenieren, konkateniert man x ohne das erste Element mit y und stellt anschließend dieses erste Element dem Ergebnis voran. Definition: • • • typ intlist {leer} | (int,intlist); funktion concat x:intlist y:intlist → intlist wenn x=leer dann y sonst (erstes x,concat (rest x) y) ende. Funktionale Programmierung Rekursion - Spiegeln 5. Spiegeln einer Linkssequenz ganzer Zahlen, z.B. (2,(65,(54,(3,(1,leer))))) → (1,(3,(54,(65,(2,leer))))). • • • Einfachster Fall: Spiegelt man eine leere Folge, so ist die leere Folge das Ergebnis. Reduktionsschritt: Um eine Folge mit n Elementen zu spiegeln, trennt man das erste Element ab, spiegelt den Rest und fügt das erste Element hinten an das Ergebnis. Definition: typ intlist {leer} | (int,intlist); funktion spiegel x:intlist → intlist wenn x=leer dann x sonst concat (spiegel (rest x)) (erstes x,leer) ende. Funktionale Programmierung Rekursion - Mapping 6. Gesucht Funktional map, das Funktion f:int→int und Linkssequenz ganzer Zahlen als Parameter erwartet und die Linkssequenz als Ergebnis liefert, in der f auf jedes Folgenelement angewendet wurde, z.B. (2,(65,(54,(3,(1,leer))))) → (f 2,(f 65,(f 54,(f 3,(f 1, leer))))) • • Einfachster Fall: Für die leere Linkssequenz ist nichts zu tun; die leere Linkssequenz ist dann auch das Ergebnis. Reduktionsschritt: Bei einer nicht-leeren Linkssequenz wendet man f zunächst auf das erste Element an, wendet anschließend map auf den Rest der Linkssequenz an und verknüpft die Ergebnisse. Funktionale Programmierung Rekursion - Mapping • Definition: • Für • liefert der Aufruf • die Ergebnisfolge typ intlist {leer} | (int,intlist); funktion map f:[int→int] x:intlist → intlist wenn x=leer dann leer sonst (f (erstes x),map f (rest x)) ende. funktion plus7 add 7. map plus7 (2,(45,(26,(65,(54,leer))))) (9,(52,(33,(72,(61,leer))))). Funktionale Programmierung Rekursion - Generation 7. Erzeugung einer Folge von k+1 ganzen Zahlen durch wiederholte Anwendung einer Funktion f auf einen Startwert a; gesucht Funktional, das Folgen ganzer Zahlen der Form (a,(f a,(f2 a,(f3 a,(...,(fk a,leer)...)))) generiert, z.B. • • Einfachster Fall: Für k=0 ist (a,leer) das Ergebnis. Reduktionsschritt: Für k>0 bildet man die Folge der k Elemente ausgehend vom Startwert f(a) und ergänzt vorne den Startwert a. Funktionale Programmierung Rekursion - Generation • Definition: typ intlist {leer} | (int,intlist); funktion generate f:[int→int] a:int k:int → intlist wenn k=0 dann (a,leer) sonst (a,generate f (f a) (k-1)) ende. Funktionale Programmierung Rekursion - indirekte Rekursion 8. Gesucht zwei Funktionen gerade und ungerade mit jeweils einem Parameter und Ergebnistyp bool, die den Wert true liefern, falls der aktuelle Parameter eine gerade bzw. eine ungerade Zahl ist. • • Einfachster Fall: Hier ist nun ein Paar einfachster Fälle für beide Funktionen gesucht: gerade(0)=true, ungerade(0)=false. Reduktionsschritt: Für x>0 stehen gerade und ungerade folgender Beziehung: gerade(x)=ungerade(x-1), ungerade(x)=gerade(x-1). Funktionale Programmierung Rekursion - indirekte Rekursion • Definition: funktion gerade x:nat → bool wenn x=0 dann true sonst ungerade (x-1) ende. funktion ungerade x:nat → bool wenn x=0 dann false sonst gerade (x-1) ende. • Mit Formularmaschine selbst ermitteln, wie die Funktionen abgearbeitet werden ! Funktionale Programmierung Rekursion - Semantik Bemerkung: • Wie kann man sich überzeugen, daß eine Definition das gewünschte leistet? • Wie ermittelt man die Semantik eines funktionalen Programms? • Später: Kapitel 11 mit anspruchsvollen mathematischen Methoden. Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi n Scheiben Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi Platz 1: Anfangsplatz Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi Platz 2: Zielplatz Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi Platz 3: Hilfsplatz Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi je Zug eine Scheibe Funktionale Programmierung Rekursion - Türme von Hanoi je Zug eine Scheibe nur kleinere auf größeren Scheiben Funktionale Programmierung Rekursion - Türme von Hanoi je Zug eine Scheibe nur kleinere auf größeren Scheiben Funktionale Programmierung Rekursion - Türme von Hanoi Aufgabe: • Entwickle ein Programm, das zu jedem n≥1 nacheinander ausgibt, welche Scheibe von welchem Platz auf welchen anderen Platz bewegt werden soll. • Lösungsmethode: Rekursion • Hanoi ist ein Paradebeispiel für die Eleganz rekursiver Lösungsverfahren Funktionale Programmierung Rekursion - Türme von Hanoi • Einfachster Fall: n=1. Transportiere eine Scheibe vom Platz 1 auf Platz 2. Fertig. (Platz 3 wird nicht benötigt.) • Reduktionsschritt. Falls n>1 Scheiben von Platz 1 nach Platz 2 zu bewegen sind, bewege zunächst die n-1 obersten Scheiben von Platz 1 nach Platz 3, danach die noch auf Platz 1 liegende größte Scheibe auf endgültigen Platz 2, und anschließend die n-1 Scheiben von Platz 3 nach Platz 2, also an endgültige Position. Funktionale Programmierung Rekursion - Türme von Hanoi Funktionale Programmierung Rekursion - Türme von Hanoi Im Detail: Gesamtproblem: P = "Transportiere n Scheiben von Platz 1 nach Platz 2" zurückgeführt auf drei Teilprobleme: P1 = "Transportiere n-1 Scheiben von Platz 1 nach Platz 3" P2 = "Transportiere eine Scheibe von Platz 1 nach Platz 2" P3 = "Transportiere n-1 Scheiben von Platz 3 nach Platz 2" • • Funktionale Programmierung Rekursion - Türme von Hanoi Im Detail: Gesamtproblem: P = "Transportiere n Scheiben von Platz 1 nach Platz 2" zurückgeführt auf drei Teilprobleme: P1 = "Transportiere n-1 Scheiben von Platz 1 trivial nach Platz 3" P2 = "Transportiere eine Scheibe von Platz 1 nach Platz 2" P3 = "Transportiere n-1 Scheiben von Platz 3 nach Platz 2" • • Funktionale Programmierung Rekursion - Türme von Hanoi Im Detail: Gesamtproblem: P = "Transportiere n Scheiben von Platz 1 nach Platz 2" zurückgeführt auf drei Teilprobleme: P1 = "Transportiere n-1 Scheiben von Platz 1 nach Platz 3" P2 = "Transportiere eine Scheibe von Platz 1 nach Platz 2" P3 = "Transportiere n-1 Scheiben von Platz 3 nach Platz 2" • • Funktionale Programmierung Rekursion - Türme Hanoi P, P1,von P3 unterscheiden sich nur bei Zahl der Scheiben, Anfangsplatz und Zielplatz Im Detail: Gesamtproblem: P = "Transportiere n Scheiben von Platz 1 nach Platz 2" zurückgeführt auf drei Teilprobleme: P1 = "Transportiere n-1 Scheiben von Platz 1 nach Platz 3" P2 = "Transportiere eine Scheibe von Platz 1 nach Platz 2" P3 = "Transportiere n-1 Scheiben von Platz 3 nach Platz 2" • • Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: Aufzählungstyp für Plätze typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist ein Zug ist ein Paar von Plätzen leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); Zugfolge = Linkssequenz von Zügen funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist n-1 Scheiben von a nach 6-a-z bewegen wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist Scheibe von a nach z bewegen wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); n-1 Scheiben von 6-a-z funktion hanoi n:nat a:platz z:platz zuglist nach z→ bewegen wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi Programm: typ platz {1,2,3}; typ zug (platz,platz); typ zuglist leer | (zug,zuglist); funktion hanoi n:nat a:platz z:platz → zuglist wenn n=0 dann leer sonst concat (hanoi (n-1) a (6-a-z)) ((a,z),hanoi (n-1) (6-a-z) z). Funktionale Programmierung Rekursion - Türme von Hanoi • Übung an der Formularmaschine: s Skript Funktionale Programmierung Rekursion - Fibonacci-Funktion Iteration versus Rekursion • Oft kann man auch einfache nicht-rekursive Funktionen angeben: • • • • funktion gerade x:int → bool funktion ungerade x:int → bool x mod 2=0. x mod 2=1. Die Lösungen sind hier kürzer und effizienter. Extremes Beispiel für den falschen Einsatz von Rekursion: Fibonacci-Funktion. Funktionale Programmierung Rekursion - Fibonacci-Funktion Definition: f(n)= { 1, falls n=1 oder n=2, f(n-1)+f(n-2), sonst. funktion f n: nat → nat wenn n=1 oder n=2 dann 1 sonst f(n-1)+f(n-2) ende. n 1 2 3 4 5 6 7 8 ... f(n) 1 1 2 3 5 8 1321 ... Funktionale Programmierung Rekursion - Fibonacci-Funktion Anwendungen • Goldener Schnitt: Harmonielehre • Phyllotaxis: Lehre von den Blattständen • Wachstumsprozesse: Kaninchenvermehrung Funktionale Programmierung Rekursion - Fibonacci-Funktion • Effizienz: f(20) ist kaum noch zu berechnen (selbst probieren) • Ursache: vielfach wiederholte Auswertung immer gleicher Terme • Fibonacci läßt sich auch ohne Rekursion formulieren • Jede rekursive Funktion läßt sich auch ohne Rekursion formulieren (s. GdP II) Funktionale Programmierung Rekursion - Fibonacci-Funktion Funktionale Programmierung Rekursion - Fibonacci-Funktion Funktionale Programmierung Rekursion - Fibonacci-Funktion Funktionale Programmierung Rekursion - Fibonacci-Funktion Funktionale Programmierung Rekursion - Fibonacci-Funktion Funktionale Programmierung Polymorphie Motivation Bisher Linkssequenz für jeden Typ neudeklariert Wunsch: universelle Linkssequenz mit konkretem Typ als Parameter Bisher Sortieren für jeden Typ einzeln definieren Wunsch: eine Sortierfunktion für alle “sortierbaren” Objekte Gewisse Funktionen, z.B. Identität id, sind auf allen Datentypen vernünftig - Wunsch: nur einmal definieren Lösung: Polymorphie: Parametrisierung auf Typen ausdehnen • • • Funktionale Programmierung Polymorphie • griech.: Polymorphie = Vielgestaltigkeit • polymorphe Dinge (hier Typen, Funktionen) • • besitzen die Fähigkeit, unterschiedliche Gestalten anzunehmen, treten in unterschiedlichen Erscheinungsformen auf Übertrage Idee der Funktion (mit Parameter) auf Typen → Typfunktionen Schematisch: Tf: {Typen} → {Typen} Tf(t)=Typausdruck mit t Funktionale Programmierung Polymorphie • griech.: Polymorphie = Vielgestaltigkeit • polymorphe Dinge (hier Typen, Funktionen) • • besitzen die Fähigkeit, unterschiedliche Gestalten anzunehmen, treten in unterschiedlichen Erscheinungsformen auf Übertrage Idee der Funktion (mit Parameter) auf Typen → Typfunktionen Bez.: formale Schematisch: Typparameter - griech. Tf: {Typen} → {Typen} Buchstaben, meist Δ Tf(t)=Typausdruck mit t Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie Funktionale Programmierung Polymorphie - Definition Definition: Ein Datentyp heißt polymorph, wenn er einen Typparameter enthält. Eine Funktion heißt polymorph, wenn der Typ eines ihrer Argumente oder des Ergebnisses polymorph ist. Funktionale Programmierung Polymorphie - Typfunktionen Definition: Eine polymorphe Typdefinition der Form typ T Δ1 ... Δn R. heißt Typfunktion. Hierbei T Bezeichner der Typfunktion, Δ1,...,Δn formale Typparameter, R ist Rumpf der Typfunktion und ein Typausdruck, der induktiv wie folgt definiert ist: elementare Bausteine: (1) Jeder elementare Typ und jeder enumerierte Typ ist ein Typausdruck. (2) Für i=1,...,n ist Δi ein Typausdruck. Funktionale Programmierung Polymorphie - Typfunktionen Beachte: Definition: T ist gecurryt Eine polymorphe Typdefinition der Form typ T Δ1 ... Δn R. heißt Typfunktion. Hierbei T Bezeichner der Typfunktion, Δ1,...,Δn formale Typparameter, R ist Rumpf der Typfunktion und ein Typausdruck, der induktiv wie folgt definiert ist: elementare Bausteine: (1) Jeder elementare Typ und jeder enumerierte Typ ist ein Typausdruck. (2) Für i=1,...,n ist Δi ein Typausdruck. Funktionale Programmierung Polymorphie - Typfunktionen Definition (Forts.): Konstruktoren: (3) Sind A, B, A1 ,..., An Typausdrücke, so auch die durch Potenzmengenbildung, Aggregation, Generalisation und Funktionenraumbildung gewonnenen Ausdrücke 2A, (A1,...,An), A1 | ... | An und [A→B]. (4) Sind A1,...,An Typausdrücke und U eine Typfunktion definiert durch typ U Δ1' ... Δn' R', so ist auch (U A1 ... An) ein Typausdruck. (5) Ist A ein Typausdruck, so auch (A). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. ip ist (int,int) Erzeugung konkreter Datentypen: typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: bp ist (bool,bool) typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: ipaarvonpaar ist typ ip hpaare int; ((int,int),(int,int)) typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 1. Typ aller inhomogenen Paare D×D' für zwei beliebige Datentypen D und D': typ paare Δ Δ' (Δ,Δ'). Typfunktion paare, Typparameter Δ und Δ', Rumpf (Δ,Δ'). Typfunktion zur homogenen Paarbildung: typ hpaare Δ paare Δ Δ. Erzeugung konkreter Datentypen: typ ip hpaare int; typ bp hpaare bool; typ ipaarvonpaar hpaare (hpaare int). Funktionale Programmierung Polymorphie - Beispiele 2. Menge aller Abbildungen des Datentyps in sich (Automorphismen): typ automorph Δ [Δ→Δ]. nicht automorph bool swap automorph (hpaare Δ) mit funktion swap (x,y): paare Δ Δ'→paare Δ' Δ (y,x). Weitere polymorphe Funktionen: funktion id x:Δ→Δ x. funktion projx (x,y): paare Δ Δ'→Δ funktion projy (x,y): paare Δ Δ'→Δ' funktion null x: Δ→nat 0. x. y. Funktionale Programmierung Polymorphie - Beispiele 3. Polymorpher Typ list, der zu jedem Datentyp D die Menge aller endlichen Linkssequenzen mit Werten aus D zur Verfügung stellt: typ list Δ {leer} | (Δ,list Δ) . list int beschreibt Menge aller endlichen Linkssequenzen ganzer Zahlen. Bekannte (nun polymorphe) Funktion erstes: funktion erstes f: list Δ→Δ ... . Funktionale Programmierung Gleichheit auf Datentypen polymorphe Funktionen sind auch die Funktionen zum Test auf Gleichheit und Ungleichheit: =: Δ×Δ→bool ≠: Δ×Δ→bool Problem: Δ ist Funktionstyp [D→D']; zwei Gleichheiten möglich: intensionale Gleichheit extensionale Gleichheit • • Funktionale Programmierung Gleichheit auf Datentypen Definition: Zwei Funktionen f,g: D→D' heißen • intensional gleich, wenn ihre Beschreibungen identisch sind; • extensional gleich, wenn für alle x vom Typ D gilt: f x=g x. Funktionale Programmierung Gleichheit - Beispiel Die drei Funktionen • funktion double1 n:int→int • funktion double2 n:int→int • funktion double3 n:int→int 2n. n+n. 3n-n. sind extensional gleich und intensional paarweise verschieden. Funktionale Programmierung Gleichheit - Effizienz Beachte: • intensionale Gleichheit effizient zu überprüfen:Vergleich von Programmtexten • Anomalie: extensionale Gleichheit nicht berechenbar: Es gibt es keinen Algorithmus, der für zwei beliebige Funktionen entscheidet, ob sie die gleiche Funktion berechnen (extensional gleich sind). Funktionale Programmierung Gleichheit • In der Regel meint “=” extensionale Gleichheit, da es nur auf Werte ankommt, nicht wie Werte berechnet werden • Lösungsstrategien für Berechenbarkeitsanomalie erforderlich Funktionale Programmierung Gleichheit - volle Polymorphie 1. Strategie: Man erlaubt den Gleichheitstest in voller Polymorphie =: Δ×Δ→bool und nimmt in Kauf, daß = auf Typen Δ, in denen Funktionen vorkommen, undefiniert ist oder zu Fehlern führt. Funktionale Programmierung Gleichheit - Gleichheitstypen 2. Strategie: Schränke Polymorphie des Gleichheitstests ein; erlaube Test nur auf Typen, bei denen keine Berechenbarkeitsprobleme auftreten. Hierzu isoliert man aus dem Universum aller Typen die sog. Gleichheitstypen (equality types) und führt spezielle Typparameter ein, die man durch ein hochgestelltes Gleichheitszeichen markiert (z.B. Δ=). Nun ist = eine polymorphe Funktion nur auf Gleichheitstypen: =: Δ=×Δ=→bool. Funktionale Programmierung Gleichheit - Gleichheitstypen Gleichheitstypen definiert man induktiv durch: 1. Elementare Datentypen int, bool, nat, real, char und text sind Gleichheitstypen. 2. Jede Gleichheitstypvariable Δ= ist ein Gleichheitstyp. 3. Sind Δ,Δ1,...,Δn Gleichheitstypen, so auch Aggregation (Δ1,...,Δn), Generalisation Δ1 | ... | Δn und die Potenzmenge 2Δ. Funktionale Programmierung Gleichheit - Gleichheitstypen Beispiele: Gleichheitstypen sind (bool,char), 2(bool,char) int | char, (int,(Δ=,bool)), aber nicht (Δ,int) oder [bool→bool], obwohl es in [bool→bool] nur endlich viele Funktionen gibt, zwischen denen man ggf. Gleichheit überprüfen könnte. Funktionale Programmierung Typinferenz • • Zwang: Typdefinition für alle Objekte (auch in FUN) • Warum: Übersetzer kann vermöge leistungsfähigen Typinferenzsystems fast alle Typen aller beteiligten Objekte, Ausdrücke und Funktionen aus den Operationen und der Darstellung beteiligter Konstanten korrekt ableiten. • Voraussetzung: strenge Typisierung. Tatsächlich: Typangaben kann man nahezu überall weglassen. Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int×int→int int int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int×int→int int int×int→int int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int×int→int int int×int→int int int Funktionale Programmierung Typinferenz - Beispiel • (x+1)*(y-z) int×int→int int×int→int int int×int→int int int int Funktionale Programmierung Typinferenz - allgemeine Methode Bottom-up Analyse • ergänze Baum an den Blättern um konkrete Typen, soweit bekannt. • ergänze Baum an den Blättern um Typvariablen, wenn Typen nicht bekannt. • schiebe Typen schrittweise nach oben und eliminiere Typvariablen. • Ggf. sind mehrere Baumdurchläufe erforderlich. Funktionale Programmierung Typinferenz - Beispiel Funktionale Programmierung Typinferenz - Beispiel int Funktionale Programmierung Typinferenz - Beispiel Δ int Funktionale Programmierung Typinferenz - Beispiel Δ int Δ' Funktionale Programmierung Typinferenz - Beispiel Δ int Δ' Δ'' Funktionale Programmierung Typinferenz - Beispiel Δ'''×Δ'''→Δ''' Δ''' {int,real} Δ'''=Δ=int Δ int Δ' Δ'' Funktionale Programmierung Typinferenz - Beispiel Δ'''×Δ'''→Δ''' Δ''' {int,real} Δ'''=Δ=int Δ int Δ(5)×Δ(5)→Δ(5) Δ(5) {int,real} Δ(5)=Δ'=Δ'' Δ' Δ'' Funktionale Programmierung Typinferenz - Beispiel Δ(4)×Δ(4)→Δ(4) Δ(4) {int,real} Δ(4)=Δ(5)=Δ'''=int Δ'''×Δ'''→Δ''' Δ''' {int,real} Δ'''=Δ=int Δ int Δ(5)×Δ(5)→Δ(5) Δ(5) {int,real} Δ(5)=Δ'=Δ'' Δ' Δ'' Funktionale Programmierung Typinferenzregeln 1. Regel für Funktionsanwendung: Gilt (f x):Δ, dann setze x:Δ' und f: Δ'→Δ für einen neuen Typ Δ' (E:Δ bedeutet hier und im folgenden also: E besitzt den Typ Δ). 2. Regel für Gleichsetzung: Hat man x:Δ und x:Δ' abgeleitet, so setze Δ=Δ' (strenge Typisierung!) 3. Regel für Funktionalität: Falls Δ→Δ'=Δ"→Δ'" abgeleitet wurde, so setze Δ=Δ" und Δ'=Δ'". Funktionale Programmierung Typinferenzregeln - Beispiel 1 1. function comp f:Δ g:Δ' x:Δ"→Δ'" f(g(x)). Regel 1: g(x): Δ(4), f: Δ(4)→Δ'" für einen neuen Typ Δ(4). Analog: x: Δ(5), g: Δ(5)→Δ(4) für einen neuen Typ Δ(5). Mit Regel 2 aus dem Funktionskopf von comp: f: Δ=Δ(4)→Δ'" g: Δ'=Δ(5)→Δ(4) x: Δ"=Δ(5). Folglich besitzt comp den Typ: Δ→Δ'→Δ"→Δ'" =(Δ(4)→Δ'")→(Δ(5)→Δ(4))→Δ(5)→Δ'". Funktionale Programmierung Typinferenzregeln - Beispiel 2 2. function g f:Δ→Δ' f(g(f)). Regel 1: g(f): Δ", f: Δ"→Δ' für einen neuen Typ Δ". Analog: f: Δ'", g: Δ'"→Δ(4) für einen neuen Typ Δ(4). Mit Regel 2 aus dem Funktionskopf von g: f: Δ=Δ'"=Δ"→Δ' und g: Δ→Δ'=Δ→Δ"=Δ'"→Δ(4). also nach Regel 3: Δ=Δ'", Δ'=Δ"=Δ(4). Dies liefert als Typ von g: (Δ'→Δ')→Δ'.