Programmierparadigmen Tutorium 1 & 5 - 6. Tutorium am...
Transcript of Programmierparadigmen Tutorium 1 & 5 - 6. Tutorium am...
LEHRSTUHL PROGRAMMIERPARADIGMEN
Programmierparadigmen Tutorium 1 & 56. Tutorium am 27.11.2017
Roman Langrehr | 27.11.2017
KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft
www.kit.edu
λ-KalkülSyntax
Variablen x sind λ-Ausdrücke
Wenn t ein λ-Ausdruck und x eine Variable ist, ist λx . t einλ-Ausdruck (Abstraktion)
Wenn t1 und t2 λ-Ausdrücke sind, ist t1 t2 auch einer (Applikation)
Notation:
Applikation bindet stärker als Abstraktion.
Applikation ist linksassoziativ.
Für t1 := λx.x und t2 := y ist t1 t2 = (λx.x) y, nicht λx.xy
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 2
λ-KalkülÄquivalenzbegriffe
α-Äquivalenz: Gleich bis auf Variablenumbennung gebundenerVariablen
η-Äquivalenz: Extensionalitätsprinzipβ-Reduktion: Term entsteht durch Ausführung eines Redex((λx . t1) t2 ⇒ t1 [x 7→ t2])
Nur wenn Substitution [x 7→ t2] kollisionsfrei ist.
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 3
Übungsblatt - Aufgabe 1.4
Wohin kann
(λa.a)(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
auswerten
(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Ja, (λa.a) . . . ist ein Redex.
(λa.a) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Nein, (λb.b) . . . ist kein RedexImplizite Linksklammerung: ((λa.a)(λb.b)) . . .
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 4
Übungsblatt - Aufgabe 1.4
Wohin kann
(λa.a)(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
auswerten
(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Ja, (λa.a) . . . ist ein Redex.
(λa.a) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Nein, (λb.b) . . . ist kein RedexImplizite Linksklammerung: ((λa.a)(λb.b)) . . .
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 4
Übungsblatt - Aufgabe 1.4
Wohin kann
(λa.a)(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
auswerten
(λb.b) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Ja, (λa.a) . . . ist ein Redex.
(λa.a) ((λc.c) ((λd .d)(λe.e)(λf .f ))) (λg.g) ((λh.h)(λi.i))
Nein, (λb.b) . . . ist kein RedexImplizite Linksklammerung: ((λa.a)(λb.b)) . . .
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 4
Auswertungsstrategien
Normalreihenfolge: Immer linkester RedexWertet Terme vollständig aus.
Call-by-name: Immer linkester Redex, aber nur falls nicht von einemλ umgeben.
≈Lazy EvaluationEine Call-by-name Auswertung ist immer auch eine NormalreihenfolgeAuswertung.Wertet Terme nicht unbedingt vollständig aus
Call-by-value: Immer linkester Redex, der nicht von einem λumgeben ist und dessen Argument ein Wert (Abstraktion) ist.
≈Strikt EvaluationWertet Terme nicht unbedingt vollständig aus
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 5
Auswertungsstrategien
Normalreihenfolge: Immer linkester RedexWertet Terme vollständig aus.
Call-by-name: Immer linkester Redex, aber nur falls nicht von einemλ umgeben.
≈Lazy EvaluationEine Call-by-name Auswertung ist immer auch eine NormalreihenfolgeAuswertung.Wertet Terme nicht unbedingt vollständig aus
Call-by-value: Immer linkester Redex, der nicht von einem λumgeben ist und dessen Argument ein Wert (Abstraktion) ist.
≈Strikt EvaluationWertet Terme nicht unbedingt vollständig aus
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 5
Auswertungsstrategien
Normalreihenfolge: Immer linkester RedexWertet Terme vollständig aus.
Call-by-name: Immer linkester Redex, aber nur falls nicht von einemλ umgeben.
≈Lazy EvaluationEine Call-by-name Auswertung ist immer auch eine NormalreihenfolgeAuswertung.Wertet Terme nicht unbedingt vollständig aus
Call-by-value: Immer linkester Redex, der nicht von einem λumgeben ist und dessen Argument ein Wert (Abstraktion) ist.
≈Strikt EvaluationWertet Terme nicht unbedingt vollständig aus
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 5
Auswertungsstrategien
Gibt es einen λ-Term, mit folgenden Redexen?
Nein, ein Redex ist ein Teilbaum, daher können die nicht überlappen!Was ist die Call-by-name/Call-by-Value Auswertung von folgendem Term?
λx. xxxxxxxxxxxxxxxxxxxxx
Beide werten den Term nicht weiter aus.
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 6
Auswertungsstrategien
Gibt es einen λ-Term, mit folgenden Redexen?
Nein, ein Redex ist ein Teilbaum, daher können die nicht überlappen!
Was ist die Call-by-name/Call-by-Value Auswertung von folgendem Term?
λx. xxxxxxxxxxxxxxxxxxxxx
Beide werten den Term nicht weiter aus.
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 6
Auswertungsstrategien
Gibt es einen λ-Term, mit folgenden Redexen?
Nein, ein Redex ist ein Teilbaum, daher können die nicht überlappen!Was ist die Call-by-name/Call-by-Value Auswertung von folgendem Term?
λx. xxxxxxxxxxxxxxxxxxxxx
Beide werten den Term nicht weiter aus.
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 6
Auswertungsstrategien
Gibt es einen λ-Term, mit folgenden Redexen?
Nein, ein Redex ist ein Teilbaum, daher können die nicht überlappen!Was ist die Call-by-name/Call-by-Value Auswertung von folgendem Term?
λx. xxxxxxxxxxxxxxxxxxxxx
Beide werten den Term nicht weiter aus.
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 6
Konstrukte im λ-Kalkül
Chruch-Zahlen: cn := λs. λz.s (. . . (sz))︸ ︷︷ ︸n mal
Churcht-Booleans:ctrue := λt. λf.tcfalse := λt. λf.f
Church-Tupel (a, b): λf.f a bKonstruktor: pair := λa. λb. λf.fabDestruktor: fst := λp.p (λa. λb.a)Destruktor: snd := λp.p (λa. λb.b)
Church-Listen:Leere Liste: [] λc. λn.nNicht-leere Liste: [a, b, c] λc.λn.c a (c b (c c n))
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 7
Konstrukte im λ-Kalkül
Chruch-Zahlen: cn := λs. λz.s (. . . (sz))︸ ︷︷ ︸n mal
Churcht-Booleans:ctrue := λt. λf.tcfalse := λt. λf.f
Church-Tupel (a, b): λf.f a bKonstruktor: pair := λa. λb. λf.fabDestruktor: fst := λp.p (λa. λb.a)Destruktor: snd := λp.p (λa. λb.b)
Church-Listen:Leere Liste: [] λc. λn.nNicht-leere Liste: [a, b, c] λc.λn.c a (c b (c c n))
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 7
Konstrukte im λ-Kalkül
Chruch-Zahlen: cn := λs. λz.s (. . . (sz))︸ ︷︷ ︸n mal
Churcht-Booleans:ctrue := λt. λf.tcfalse := λt. λf.f
Church-Tupel (a, b): λf.f a bKonstruktor: pair := λa. λb. λf.fabDestruktor: fst := λp.p (λa. λb.a)Destruktor: snd := λp.p (λa. λb.b)
Church-Listen:Leere Liste: [] λc. λn.nNicht-leere Liste: [a, b, c] λc.λn.c a (c b (c c n))
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 7
Konstrukte im λ-Kalkül
Chruch-Zahlen: cn := λs. λz.s (. . . (sz))︸ ︷︷ ︸n mal
Churcht-Booleans:ctrue := λt. λf.tcfalse := λt. λf.f
Church-Tupel (a, b): λf.f a bKonstruktor: pair := λa. λb. λf.fabDestruktor: fst := λp.p (λa. λb.a)Destruktor: snd := λp.p (λa. λb.b)
Church-Listen:Leere Liste: [] λc. λn.nNicht-leere Liste: [a, b, c] λc.λn.c a (c b (c c n))
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 7
Fixpunkte im λ-KalkülY := λf. (λx.f (xx)) (λx.f (xx))
Erfüllt: ∃t : Y f ⇒∗ t ⇐∗ f (Y f )
Nächstes Übungsblatt: Θ mit Θ f ⇒∗ f (Θ f )
Schleifen:
while b do c
while True doif not b then
breakelse
c
f := 〈If not b then break else c; f 〉 – Wir haben eine Rekursion
F := λf . 〈If not b then break else c; f 〉 unsere Schleife ist damit: Y F
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 8
Fixpunkte im λ-KalkülY := λf. (λx.f (xx)) (λx.f (xx))
Erfüllt: ∃t : Y f ⇒∗ t ⇐∗ f (Y f )
Nächstes Übungsblatt: Θ mit Θ f ⇒∗ f (Θ f )
Schleifen:
while b do c
while True doif not b then
breakelse
c
f := 〈If not b then break else c; f 〉 – Wir haben eine Rekursion
F := λf . 〈If not b then break else c; f 〉 unsere Schleife ist damit: Y F
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 8
Fixpunkte im λ-KalkülY := λf. (λx.f (xx)) (λx.f (xx))
Erfüllt: ∃t : Y f ⇒∗ t ⇐∗ f (Y f )
Nächstes Übungsblatt: Θ mit Θ f ⇒∗ f (Θ f )
Schleifen:
while b do c
while True doif not b then
breakelse
c
f := 〈If not b then break else c; f 〉 – Wir haben eine Rekursion
F := λf . 〈If not b then break else c; f 〉 unsere Schleife ist damit: Y F
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 8
Fixpunkte im λ-KalkülY := λf. (λx.f (xx)) (λx.f (xx))
Erfüllt: ∃t : Y f ⇒∗ t ⇐∗ f (Y f )
Nächstes Übungsblatt: Θ mit Θ f ⇒∗ f (Θ f )
Schleifen:
while b do c
while True doif not b then
breakelse
c
f := 〈If not b then break else c; f 〉 – Wir haben eine Rekursion
F := λf . 〈If not b then break else c; f 〉 unsere Schleife ist damit: Y F
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 8
Fixpunkte im λ-KalkülY := λf. (λx.f (xx)) (λx.f (xx))
Erfüllt: ∃t : Y f ⇒∗ t ⇐∗ f (Y f )
Nächstes Übungsblatt: Θ mit Θ f ⇒∗ f (Θ f )
Schleifen:
while b do c
while True doif not b then
breakelse
c
f := 〈If not b then break else c; f 〉 – Wir haben eine Rekursion
F := λf . 〈If not b then break else c; f 〉 unsere Schleife ist damit: Y FRoman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 8
Übungsaufgaben
Church-Listen:Leere Liste: [] λc. λn.nNicht-leere Liste: [a, b, c] λc. λn.c a (c b (c c n))
Definiere für Church-Listen
null
head
length
append
tail
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 9
Typsystem
Definiert über Regelsystem (= Induktives Prädikat)
Dem λ-Kalkül werden jetzt Konstanten (true, false, N,...) hinzugefügt.Typsystem: Dreistelliges Prädikat Γ ` t : τ
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 10
Typsystem
Definiert über Regelsystem (= Induktives Prädikat)Dem λ-Kalkül werden jetzt Konstanten (true, false, N,...) hinzugefügt.
Typsystem: Dreistelliges Prädikat Γ ` t : τ
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 10
Typsystem
Definiert über Regelsystem (= Induktives Prädikat)Dem λ-Kalkül werden jetzt Konstanten (true, false, N,...) hinzugefügt.Typsystem: Dreistelliges Prädikat Γ ` t : τ
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 10
Typsystem
Definiert über Regelsystem (= Induktives Prädikat)Dem λ-Kalkül werden jetzt Konstanten (true, false, N,...) hinzugefügt.Typsystem: Dreistelliges Prädikat Γ ` t : τ
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 10
Polymorphie
Problem: Geht nicht in unserem Typsystem.Lösung: let-Konstrukt hinzufügen
let x = t1 in t2
Regel für let:
Zwei der anderen Regeln müssen angepasst werden:
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 11
Polymorphie
Problem: Geht nicht in unserem Typsystem.Lösung: let-Konstrukt hinzufügen
let x = t1 in t2
Regel für let:
Zwei der anderen Regeln müssen angepasst werden:
Roman Langrehr – Programmierparadigmen Tutorium 1 & 5 27.11.2017 11