• Keine Ergebnisse gefunden

Fortgeschrittene Funktionale Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Fortgeschrittene Funktionale Programmierung"

Copied!
22
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Fortgeschrittene Funktionale Programmierung

13. Vorlesung

Janis Voigtl¨ander

Universit¨at Bonn

Wintersemester 2015/16

(2)

Erweiterung um Datentypen

Typen: τ := · · · | Bool|[τ]

Terme: t:= · · · | False|True |[ ]τ |t :t |caset of {· · · } Γ`False : Bool , Γ`True : Bool , Γ`[ ]τ : [τ]

Γ`t :τ Γ`u : [τ] Γ`(t :u) : [τ]

Γ`t : Bool Γ`u1:τ Γ`u2 :τ Γ`(case t of {False→u1; True→u2}) :τ Γ`t : [τ0] Γ`u1:τ Γ,x10,x2 : [τ0]`u2

Γ`(caset of {[ ]→u1;x1:x2 →u2}) :τ Damit k¨onnen wir jetzt zum Beispiel die bekannte Funktion filter:: (α→Bool)→[α]→[α] schreiben, oder?

2

(3)

Rekursion in getyptem Lambda-Kalk¨ ul

Terme: t:= · · · | rec t

Γ`t :τ →τ Γ`(rec t) :τ Aus: filter:: (α→Bool)→[α]→[α]

filterp [ ] = [ ]

filterp (a:as) =if p a thena:filterp as else filterp as wird: rec (λf : (α→Bool)→[α]→[α].

λp : (α→Bool).λl : [α].

casel of {[ ] →[ ]α; a:as →casep a of

{False→f p as; True →a: (f p as)}}) Idee: f(::τ) =. . . f . . . −→ f=rec (λf :τ. . . . f . . .)

3

(4)

Weitere Erweiterungen unseres Lambda-Kalk¨ uls

Schließlich noch hinzu (weil semantisch interessant):

Terme: t:= · · · | seq t t

Γ`t:τ1 Γ`u :τ2

Γ`(seq t u) :τ2 und (weil f¨ur explizite Polymorphie interessant):

Typen: τ := · · · | ∀α.τ Terme: t:= · · · | Λα.t |t τ

α,Γ`t :τ Γ`(Λα.t) :∀α.τ

Γ`t :∀α.τ Γ`(t τ0) :τ[τ0/α]

4

(5)

Explizite Polymorphie: Beispiel

filter:

rec (λf :∀α.(α→Bool)→[α]→[α].

Λα.λp: (α→Bool).λl : [α].

casel of {[ ] →[ ]α;

a:as →case p a of

{False→f α p as; True →a: (f α p as)}})

5

(6)

GHC-Core

filter:

%rec

{f :: %forall alpha . (alpha -> Bool) ->

[] alpha ->

[] alpha =

\ @ alpha

(p :: alpha -> Bool) (l :: [] alpha) ->

%case ([] alpha) l

%of (_ :: [] alpha) {[] -> [] @ alpha;

(:) (a :: alpha) (as :: [] alpha) ->

%case ([] alpha) (p a)

%of (_ :: Bool)

{False -> f @ alpha p as;

True -> (:) @ alpha a (f @ alpha p as)}}};

6

(7)

Operationelle Semantik

(8)

Zur Erinnerung: eine DP-Klausuraufgabe

Gegeben seien die folgenden Funktionsdefinitionen:

f:: [Int]→[Int]

f[ ] = [ ]

f(x:xs) = (gx) : (fxs) g:: Int→Int

g3=g4 gn=n+1

sowie die vordefinierten Funktionenheadund tail.

Notieren Sie die einzelnen Haskell-Auswertungsschritte f¨ur folgenden Ausdruck (bis zum Endergebnis, und unter genauer Beachtung von Haskells Auswertungsstrategie!):

head(tail(f[3,3+1])) =

=

=...

8

(9)

Eine ausgew¨ ahlte Teilmenge des Kalk¨ uls:

Typen: τ :=α |τ →τ | ∀α.τ |[τ]

Terme: t:=x |λx :τ.t |t t |Λα.t |t τ |[ ]τ | t :t |case t of {· · · } |rec t |seq t t Γ,x:τ `x:τ Γ`[ ]τ : [τ] Γ,x :τ1 `t :τ2

Γ`(λx:τ1.t) :τ1 →τ2

Γ`t :τ1 →τ2 Γ`u :τ1 Γ`(t u) :τ2

α,Γ`t:τ Γ`(Λα.t) :∀α.τ

Γ`t:∀α.τ Γ`(t τ0) :τ[τ0/α]

Γ`t :τ →τ Γ`(rect) :τ Γ`t:τ Γ`u : [τ]

Γ`(t :u) : [τ]

Γ`t :τ1 Γ`u :τ2

Γ`(seq t u) :τ2 Γ`t : [τ0] Γ`u1:τ Γ,x10,x2 : [τ0]`u2

Γ`(caset of {[ ]→u1;x1 :x2→u2}) :τ

9

(10)

Small-Step Semantics – Werte/Reduktionsschritte

Werte: v :=λx :τ.t |Λα.t |[ ]τ |t:t (spezielle Terme) Reduktionen:

(λx :τ.t)u t[u/x] (Λα.t) τ t[τ /α]

case [ ]τ of {· · · } u1 case t1 :t2 of {· · · } u2[ti/xi]

rec t t (rec t) seq v u u

einfaches Beispiel:

(Λα.rec (λx :α.x))τ rec (λx :τ.x)

(λx:τ.x) (rec (λx :τ.x)) rec (λx :τ.x)

(λx:τ.x) (rec (λx :τ.x))

· · ·

10

(11)

Small-Step Semantics – Reduktion in Kontext

Kontexte: E := (−t) |(−τ)|(case − of {· · · }) |(seq − t) S :=Id |S◦E

Transitionen: (S,t) (S,t0) wennt t0 (S,E{t}) (S ◦E,t) wennt kein Wert (S◦E,v) (S,E{v})

Auswertung: t⇓v iff (Id,t) (Id,v) einfaches Beispiel:

(Id,(seq ((λx : [τ].x) [ ]τ) (λy : [τ].y)) [ ]τ) (Id◦(− [ ]τ),seq ((λx : [τ].x) [ ]τ) (λy : [τ].y)) (Id◦(− [ ]τ)◦(seq − (λy : [τ].y)),(λx : [τ].x) [ ]τ) (Id◦(− [ ]τ)◦(seq − (λy : [τ].y)),[ ]τ)

(Id◦(− [ ]τ),seq [ ]τ (λy : [τ].y)) (Id◦(− [ ]τ), λy : [τ].y)

(Id,(λy : [τ].y) [ ]τ) (Id,[ ]τ)

11

(12)

Small-Step Semantics – komplexeres Beispiel

(Id,(rec t) g [ ]τ) (Id◦(−[ ]τ),(rec t) g) (Id◦(−[ ]τ)◦(−g),rec t) (Id◦(−[ ]τ)◦(−g),t (rec t))

(Id◦(−[ ]τ)◦(−g), λp: (τ →Bool).λl : [τ].

casel of {[ ] →[ ]τ;

a:as →case p a of {· · · }})

12

wobeit =λf : (τ →Bool)→[τ]→[τ].

λp : (τ →Bool).λl : [τ].

case l of {[ ] →[ ]τ;

a:as →casep a of

{False→f p as; True →a: (f p as)}}

(13)

Small-Step Semantics – komplexeres Beispiel

(Id◦(−[ ]τ)◦(−g), λp: (τ →Bool).λl : [τ].

casel of {[ ] →[ ]τ;

a:as →case p a of {· · · }}) (Id◦(−[ ]τ),(λp: (τ →Bool).λl : [τ].

casel of {[ ] →[ ]τ;

a:as →case p a of {· · · }}) g) (Id◦(−[ ]τ), λl : [τ].case l of {[ ] →[ ]τ;

a:as →caseg a of {· · · }})

12

wobeit =λf : (τ →Bool)→[τ]→[τ].

λp : (τ →Bool).λl : [τ].

case l of {[ ] →[ ]τ;

a:as →casep a of

{False→f p as; True →a: (f p as)}}

(14)

Small-Step Semantics – komplexeres Beispiel

(Id◦(−[ ]τ), λl : [τ].case l of {[ ] →[ ]τ;

a:as →caseg a of {· · · }}) (Id,(λl : [τ].case l of {[ ] →[ ]τ;

a:as →caseg a of {· · · }}) [ ]τ) (Id,case [ ]τ of {[ ] →[ ]τ;

a:as →caseg a of {· · · }}) (Id,[ ]τ)

12

wobeit =λf : (τ →Bool)→[τ]→[τ].

λp : (τ →Bool).λl : [τ].

case l of {[ ] →[ ]τ;

a:as →casep a of

{False→f p as; True →a: (f p as)}}

(15)

Small-Step Semantics – Zusammenfassung

Werte: v :=λx :τ.t |Λα.t |[ ]τ |t:t

(spezielle Terme)

Reduktionen:

(λx :τ.t)u t[u/x] (Λα.t) τ t[τ /α]

case [ ]τ of {· · · } u1 case t1 :t2 of {· · · } u2[ti/xi]

rec t t (rec t) seq v u u

Kontexte: E := (−t) |(−τ)|(case − of {· · · }) |(seq − t) S :=Id |S◦E

Transitionen: (S,t) (S,t0) wennt t0 (S,E{t}) (S ◦E,t) wennt kein Wert (S◦E,v) (S,E{v})

Auswertung: t⇓v iff (Id,t) (Id,v) Divergenz: t⇑iff ¬∃v.t⇓v

13

(16)

Big-Step Semantics (direkte Definition von ⇓)

Werte: v :=λx :τ.t |Λα.t |[ ]τ |t:t (wie zuvor) Auswertung:

v⇓v t ⇓(λx :τ.t0) t0[u/x]⇓v

(t u)⇓v

t ⇓(Λα.t0) t0[τ /α]⇓v (t τ)⇓v

t⇓[ ]τ u1⇓v

(caset of {[ ] →u1;x1:x2 →u2})⇓v t⇓(t1 :t2) u2[ti/xi]⇓v (caset of {[ ] →u1;x1:x2 →u2})⇓v (t (rec t))⇓v

(rec t)⇓v

t ⇓v0 u⇓v (seq t u)⇓v

14

(17)

Big-Step Semantics – einfaches Beispiel

(λx: [τ].x)(λx : [τ].x) x[[ ]τ/x][ ]τ

((λx: [τ].x) [ ]τ)[ ]τ (λy: [τ].y)(λy : [τ].y)

(seq ((λx : [τ].x) [ ]τ) (λy: [τ].y))(λy : [τ].y) y[[ ]τ/y][ ]τ

((seq((λx : [τ].x) [ ]τ) (λy : [τ].y)) [ ]τ)[ ]τ

Vergleiche mit:

(Id,(seq ((λx : [τ].x) [ ]τ) (λy : [τ].y)) [ ]τ) (Id◦(−[ ]τ),seq ((λx : [τ].x) [ ]τ) (λy : [τ].y)) (Id◦(−[ ]τ)◦(seq − (λy: [τ].y)),(λx: [τ].x) [ ]τ) (Id◦(−[ ]τ)◦(seq − (λy: [τ].y)),[ ]τ)

(Id◦(−[ ]τ),seq [ ]τ (λy : [τ].y)) (Id◦(−[ ]τ), λy : [τ].y)

(Id,(λy : [τ].y) [ ]τ) (Id,[ ]τ)

15

(18)

Allgemeine Verbindung Small-Step/Big-Step

Beide Arten der Definition von⇓sind ¨aquivalent.

Ein struktureller Zusammenhang, f¨ur alle Sprachkonstrukte außer f¨urrec:

t ⇓v0 t0⇓v

(E{v0} t0) E{t} ⇓v

Vorteile/Nachteile von Small-Step/Big-Step?

16

(19)

Observational Equivalence

Frage: Wann sollten zwei Terme denn nun allgemein als semantisch ¨aquivalent angesehen werden?

Vorschlag? t≡t0 gdw. f¨ur jeden Wertv,t⇓v ⇔t0⇓v Problem: Verschiedene Terme gleichem

”extensionalen“

Verhalten w¨urden nicht immer als ¨aquivalent angesehen, z.B.heapsort6≡mergesort.

L¨osung: I Erlaube (nur) bestimmte Beobachtungen, zum Beispiel Auswertung/Termination auf

ausgew¨ahlten Typen.

I Aber verlange, dass ¨aquivalente Terme in jedem m¨oglichen Kontext zu gleichen Beobachtungen f¨uhren.

I Also, w¨ahle als≡ diegr¨oßte Kongruenzrelation, die bez¨uglich der erlaubten Beobachtungen

”ad¨aquat“ ist (noch zu definieren).

17

(20)

Kongruenz: Kompatibilit¨ at und Substitutivit¨ at

x≡x [ ]τ ≡[ ]τ

t≡t0

(λx:τ1.t)≡(λx:τ1.t0)

t ≡t0 u ≡u0 (t u)≡(t0 u0) t≡t0

(Λα.t)≡(Λα.t0)

t ≡t0 (t τ)≡(t0 τ)

t ≡t0 (rec t)≡(rec t0) t≡t0 u≡u0

(t:u)≡(t0 :u0)

t ≡t0 u ≡u0 (seq t u)≡(seqt0 u0) t≡t0 u1≡u10 u2 ≡u02

(caset of {· · · })≡(case t0 of {· · · }) t≡t0 u≡u0

t[u/x]≡t0[u0/x]

t ≡t0 t[τ /α]≡t0[τ /α]

18

(21)

Ad¨ aquatheit

Seiτ ein Typ und seient,t0 Terme mit`t:τ und `t0 :τ. Es gibt verschiedene m¨ogliche Ersatzalternativen f¨ur

”t≡t0 gdw. (oder: impliziert) f¨ur jeden Wertv,t⇓v ⇔t0⇓v“:

I t ≡t0 impliziertt⇓ ⇔t0

I t ≡t0 impliziertt⇓ ⇔t0⇓, gefordert lediglich f¨ur τ = [τ0]

I t ≡t0 impliziertt ⇓[ ]τ0 ⇔t0 ⇓[ ]τ0, gefordert lediglich f¨ur τ = [τ0] Sie induzieren alle die gleiche gr¨oßte Kongruenzrelation!

”Observational Equivalence“

Uberlegungen:¨

I Was w¨are wenn man die kleinste ad¨aquate Kongruenzrelation betrachten w¨urde?

I Was w¨are wenn man einfach die gr¨oßte Kongruenzrelation, ohne Ad¨aquatheitsforderung, betrachten w¨urde?

19

(22)

Einige Resultate zu Observational Equivalence

I Wenn t ≡t0, dann t⇓ ⇔t0⇓.

I Wenn t⇑,t0⇑, und t,t0 haben selben Typ, dann t≡t0.

I Wenn t ⇓v, dann t ≡v.

I Wenn t t0, dannt ≡t0.

I F¨ur Termet,t0 des selben Funktionstyps:

t≡t0 gdw. (∀u.(t u)≡(t0 u))∧(t⇓ ⇔t0⇓)

I F¨ur Termet,t0 des selben polymorphen Typs:

t ≡t0 gdw. (∀τ.(t τ)≡(t0 τ))∧(t⇓ ⇔t0⇓) Leider ist≡ jedoch f¨ur viele Beweise zu konkreten Programmen

schwer handhabbar, insbesondere da nicht

”direkt“ und kompositionell definiert.

20

Referenzen

ÄHNLICHE DOKUMENTE

[r]

I Klasseninstanzen und Typsynonyme werden immer importiert I Alle Importe stehen immer am Anfang des Moduls. PI3 WS 16/17 16 [37].. Java):

TCS | 05 Typklassen | SoSe 2020 26/82 Klassen & Instanzen Kinds & Konstruktorkl.. 0 Im GHC Defaulting: F¨ ur Zahlen ist dies der Typ Integer... , Klassenname n T V )

Impr¨ adikativer Polymorphismus: Typvariablen stehen auch f¨ ur polymorphe Typen (mit Quantoren!). Versuch \x -> const (x True) (x 'A')

TCS | 07 Typisierung | SoSe 2020 2/108 Motivation Typen Typisierungsverfahren..

kein Zusammenhang zwischen Zero und Succ auch der unsinnige Typ Vec Bool String ist erlaubt Ursache: Kind von Vec ist zu allgemein: * -> * -> *. Wunsch-Kind: Nat -> * ->

B. Збережіть список відтворення на SD-карту... Epson Projector Content Manager қолданбасын орнатыңыз. Төменде көрсетілген веб-сайттан Epson

Il software Epson Projector Content Manager consente di creare elenchi riproduzione e di salvarli su un dispositivo di archiviazione esterno.. È possibile scaricare e installare