Funktionale Programmierung

Werbung
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:
(Δ'→Δ')→Δ'.
Herunterladen