Funktionale
Programmierung
•
Funktionen und Phänomene•
Funktionen höherer Ordnung - Funktionale•
Parameterübergabe•
Formularmaschine - Auswertung von Funktionen•
Rekursion•
PolymorphieFunktionale Programmierung
Motivation
•
Daten Funktionen Operationen auf Daten•
Verwischen der Trennung von Daten und Operationen•
Verwischen der Unterscheidung vonObjektbeschreibung und Handlungsanweisung
•
Verschmelzen von Daten und OperationenFunktionale Programmierung
Funktionen höherer Ordnung
•
Bekanntlich: Funktionenraum typ D [D'→D"]•
Falls D', D'' wieder Funktionenräume, sobildet f D Funktionen aus D' auf Funktionen aus D" ab
•
f heißt Funktion höherer Ordnung (higher order function, Abk. HOF) oder FunktionalFunktionale 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:
∫(f)=F mit
∫ f(t) dt=F(x)
∫ [[real→real]→[real→real]].
0 x
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:
Σ f(i)=f(a)+f(a+1)+f(a+2)+...+f(b).
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 S(f,a,b)= Σ f(i).
S ist vom Datentyp D mit
typ D [([int→int], int, int)→int].
i=a b
i=a b
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 dasMaximum 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:
2. Die Konstante 17 besitzt Ordnung 0. Man kann sie interpretieren als nullstellige
Funktion
17: unit→nat mit 17()=17.
twice: [int→int]→[int→int]
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ührtwerden
Funktionale Programmierung
Currying - Motivation
•
Multiplikationmult: 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)•
oderDollarDM: IR→IR mit DollarDM=mult(1.521,·)Funktionale Programmierung
Currying - Motivation
•
Multiplikationmult: 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)•
oderDollarDM: IR→IR mit DollarDM=mult(1.521,·)Dies darf man so nicht schreiben
Funktionale Programmierung
Currying - 2-stellig
•
Currying: Übergang von 2-stelliger Funktion f: A×B→C mit f(a,b)=c•
zu Funktion 2. OrdnungF: 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. OrdnungF: 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)
Uncurrying
Funktionale Programmierung
Currying - n-stellig
•
Currying: Übergang von n-stelliger Funktion f: A1×...×An→B•
zu Funktion n-ter OrdnungF: 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 SchreibweiseFunktionale 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
a, falls a=b,
ggT(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
a, falls a=b,
ggT(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.
{
Ist diese Def. sinnvoll?
(selbstbezüglich, rekursiv)
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 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:Kopf Rumpf
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 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:vollständig gecurryed
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 x*y.
funktion d 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 x*y.
funktion d mult 2.
5. Konstanten als Funktionen:
funktion pi → real 3.1415926;
funktion kreisfläche r:real → real pi*r*r.
weder Parameter, noch Typen angeben
Funktionale Programmierung
Beispiele
4. Multiplikation und Verdoppelung:
funktion mult x:int y:int → int x*y.
funktion d mult 2.
5. Konstanten als Funktionen:
funktion pi → real 3.1415926;
funktion kreisfläche r:real → real pi*r*r.
weder Parameter, noch Typen angeben
Funktionale Programmierung
Beispiele
4. Multiplikation und Verdoppelung:
funktion mult x:int y:int → int x*y.
funktion d 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 x*y.
funktion d 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 x*y.
funktion d mult 2.
5. Konstanten als Funktionen:
funktion pi → real 3.1415926;
funktion kreisfläche r:real → real pi*r*r.
weder Parameter, noch Typ, da konstante
Funktion
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 ineinen 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 sonstwenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende
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 sonstwenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende
Beachte Klammer- setzung
Funktionale Programmierung
Substitutionsregeln
Gegeben: funktion f x:D → D' R.
Aufruf: f E
Freiheitsgrade bei der Substitution:
•
wann wird E ausgewertet•
vor der Substitution von x durch E•
nach der Substitution von x durch E•
wie oft wird E ausgewertet•
an jeder Stelle, an der x vorkommt•
einmaligFunktionale 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
d(d(d 3)) Beispiel:
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
d(d 6)
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
d(d 6) d(6+6)
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
d(d 6) d(6+6)
d 12
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
d(d 6) d(6+6)
d 12 12+12
Funktionale Programmierung
Call by value - Wertübergabe
d(d(d 3)) d(d(3+3)) Beispiel:
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 0.
null(d(d(d 3))) null(d(d(3+3)))
null(d(d 6)) 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 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))) ...
Abweichung von call-by-value nötig, um bed. Ausdruck
überhaupt auswerten zu können
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
d(d(d 3)) Beispiel:
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) Beispiel:
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
Beispiel:
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
Beispiel:
3+3
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
(d 3)+(d 3) 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
(d 3)+(d 3) 3+3
12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6 3+3 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 6 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6
=12 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 6 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6
=12
=24 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 6 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6
=12
=24
=24 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 6 12=
Funktionale Programmierung
Call by name - Namensübergabe
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
6
=12
=24
=24 Beispiel:
3+3 3+3 6
(d 3)+(d 3)
6
3+3 3+3 6 12=
ineffizient durch wiederholte
Auswertung desselben Ausdrucks
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 0.
null(d(d(d 3))) 0 (sehr effizient)
Funktionale Programmierung
Call by name - Namensübergabe
Andererseits:
Beispiel: funktion null x:int → int 0.
null(d(d(d 3))) 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
d(d(d 3)) Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6
=12 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6
=12 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6
=12
=24 Beispiel:
Funktionale Programmierung
Call by need - lazy evaluation
d(d(d 3))
d(d 3)+d(d 3) (d 3)+(d 3)
3+3 6
=12
=24
=24 Beispiel:
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-SubstitutionFunktionale Programmierung
Formularmaschine
•
Formularmaschine = algorithmischesVerfahren zur systematischen Auswertung von funktionalen Programmen
•
fomularmäßige Darstellung von Funktionsdefinitionen•
geordnete Auswertung von Funktionen•
graphische übersichtliche Darstellung•
anschaulicher Beleg für Automatisierbarkeit funktionaler ProgrammierungFunktionale 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-/ablesenFunktionale 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
-7 -7
-7 +7
false
Funktionale Programmierung
Formularmaschine - Beispiel abs
abs(-7)
-7
-7 -7
-7 +7
false
Funktionale Programmierung
Formularmaschine - Beispiel abs
abs(-7)
-7
-7 -7
-7 +7
false
+7
Funktionale Programmierung
Formularmaschine - Beispiel abs
abs(-7)
-7
-7 -7
-7 +7
false
+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 6
6 4
6
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 6
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
6
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4 6
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
false
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
false
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
false
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
false
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 6 4
6 4
6
6 6
6 4
4 4
4
4 6
false
false
2
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 2
2 4
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4 2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
true
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
true
-2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
true
-2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
true
-2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 2 4
2 4
2
2 2
2 4
4 4
4
4 2
false
true
-2
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 4
4 2
4
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 4
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
4
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2 4
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2
2 4
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2
2 4
false
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2
2 4
false
false
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2
2 4
false
false
2
Funktionale Programmierung
Formularmaschine - Beispiel ggT 4 2
4 2
4
4 4
4 2
2 2
2
2 4
false
false
2