Programmierparadigmen Tutorium 1 & 5 - 6. Tutorium am...

Post on 18-Oct-2020

4 views 0 download

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