• Keine Ergebnisse gefunden

DerCHF-Kalk¨ulalsModellf¨urConcurrentHaskell Nebenl¨aufigenProgrammierung DerCHF-Kalk¨ul DerCHF-Kalk¨ul:Syntax ¨Ubersicht

N/A
N/A
Protected

Academic year: 2021

Aktie "DerCHF-Kalk¨ulalsModellf¨urConcurrentHaskell Nebenl¨aufigenProgrammierung DerCHF-Kalk¨ul DerCHF-Kalk¨ul:Syntax ¨Ubersicht"

Copied!
9
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prinzipien, Modelle und Algorithmen der Nebenl¨aufigen Programmierung

Wintersemester 2019/20

Der CHF-Kalk¨ul als Modell f¨ur Concurrent Haskell

Prof. Dr. David Sabel

LFE Theoretische Informatik

Letzte ¨Anderung der Folien: 6. Februar 2020

Ubersicht¨

1 Der CHF-Kalk¨ul Syntax Typisierung Semantik Fairness Gleichheit

TCS | 14 CHF-Kalk¨ul | WS 2019/20 2/36 Der CHF-Kalk¨ul

Der CHF-Kalk¨ul

CHF = Concurrent Haskell erweitert um (implizite) Futures Shared Memory Modell

Speicher vorhanden durch MVars

Futures = Nebenl¨aufige Threads mit R¨uckgabewert Wie in Haskell: Seiteneffekte durch IO-Monade

Der CHF-Kalk¨ul: Syntax

Zweistufige Syntax: Oben Prozesskomponenten, unten (funktionale) Ausdr¨ucke

ProzesseP Proc:

P, Pi Proc ::= P1||P2 parallele Komposition

| νx.P Namensbeschr¨ankung

| xe nebenl. Thread (Futurex)

| x=e globale Bindung

| xme gef¨ullte MVar

| xm leere MVar Dabei:x Variable,eAusdruck

Ein Spezialthread m¨oglichxmain==ederMain-Thread

(2)

Datenkonstruktoren

Es gibt Datenkonstruktoren cT ,i

T ist der zugeh¨orige Typkontruktor (z.B. Bool, List, etc.) Pro Typ gibt es KonstruktorencT,1, . . . ,cT ,|T| (z.B. True, False)

Konstruktoren haben eine festeStelligkeit ar(cT ,i)IN0 Konstruktoren d¨urfen nurges¨attigtauftreten:

(cT ,i e1 . . . ear(c

T ,i))

Annahme: Es gibt Typ() mit nullstelligem Konstruktor()

TCS | 14 CHF-Kalk¨ul | WS 2019/20 5/36 Der CHF-Kalk¨ul

Ausdr¨ucke

Funktionale Ausdr¨ucke

e, ei Exp::=x Variable

| me monad. Ausdruck

| λx.e Abstraktion

| (e1 e2) Anwendung

| c e1. . . ear(c) Konstruktoranw.

| seqe1 e2 seq-Ausdruck

| letrec x1=e1, . . . , xn=en ine letrec-Ausdruck

| caseT eof (cT ,1 x1. . . xar(cT ,1) e1) case-Ausdruck . . .

(cT,|T| x1. . . xar(c

T ,|T|)e|T|) Monadische Ausdr¨ucke

meMExp::=returne|e1>>=e2 |futuree

|takeMVare|newMVare|putMVare1e2

TCS | 14 CHF-Kalk¨ul | WS 2019/20 6/36 Der CHF-Kalk¨ul

Nebenbedingungen

caseT eof

case-Alternative

z }| {

(cT,1 x1. . . xar(c

T ,1)

| {z }

Pattern

e1)

. . .

(cT,|T| x1. . . xar(c

T ,|T|)e|T|) Nur Variablen im Pattern erlaubt

Variablen m¨ussen paarweise verschieden sein.

ProcT,i genau eine Alternative

letrec x1 =e1

| {z }

letrec-Bindung

, . . . xn=en in e

|{z}

in-Ausdruck

Bindungsbereich vonxi: Alle ei und e Allexi ussen paarweise verschieden sein.

Wohlgeformtheit, Strukturelle Kongruenz

Eingef¨uhrte Variablen: der Name eines Threads, der Name einer MVar, die linke Seite einer Bindung

Ein Prozess ist wohlgeformtgdw. alle eingef¨uhrten Variablen paarweise verschieden sind und es maximal einen Main-Thread gibt.

Strukturelle Kongruenz

ist die kleineste Kongruenz auf Prozessen, die die Regeln erf¨ullt:

P1||P2 P2||P1 P1||(P2||P3) (P1||P2)||P3

(νx.P1)||P2 νx.(P1||P2), fallsx6∈FV(P2) νx1.νx2.P νx2.νx1.P

P1 P2, fallsP1 undP2 α-¨aquivalente (P1 =α P2)

(3)

Typisierung

CHF ist monomorphtypisiert

τ, τi Typ::=IOτ |(T τ1. . . τar(T)) |MVarτ |τ1τ2 Konstruktoren werden wie polymorph behandelt:Cons::List Bool,Cons :: List (List Bool)etc.

Monadische Operatoren werden ebenfalls mit mehreren Typen verwendet.

Annahme: Variablen xhaben einen eingebauten Typ Γ(x)Typ

Γ`P ::wt gdw. ProzessP ist wohlgetypt

Γ`e::τ gdw. Ausdruckeist wohlgetypt mit Typτ.

TCS | 14 CHF-Kalk¨ul | WS 2019/20 9/36 Der CHF-Kalk¨ul

Typisierung (2)

Einige Typisierungsregeln Γ`P1 ::wt,Γ`P2 ::wt

Γ`P1||P2::wt

Γ`P ::wt Γ`νx.P ::wt

Γ`x::τ,Γ`e::IO τ Γ`xe::wt

Γ`x::τ,Γ`e::τ Γ`x=e::wt

Γ`x::MVar τ,Γ`e::τ Γ`xme::wt

Γ`x::MVarτ Γ`xm::wt

Γ`e::τ Γ`returne::IOτ

Γ`e1 ::IOτ1,Γ`e2::τ1IO τ2 Γ`e1>>=e2::IOτ2

Γ`e::IO τ Γ`futuree::IOτ

Γ`e::MVar τ Γ`takeMVare::IOτ

Γ`e1 ::MVar τ,Γ`e2 ::τ Γ`putMVare1 e2::IO()

Γ`e::τ

Γ`newMVare::IO(MVar τ)

TCS | 14 CHF-Kalk¨ul | WS 2019/20 10/36 Der CHF-Kalk¨ul

Typisierung: Beispiele

Γ(x) =τ

Γ`x::τ,Γ(x) =τ Γ`x::τ Γ`(λx.x) ::τ τ

Γ(x) =τ Γ`x::τ,

Γ(x) =τ

Γ`x::τ,Γ(x) =τ Γ`x::τ (x x) ::?

λx.(x x) ::τ →?

Γ`e1::τ1τ2, Γ`e2::τ1

Γ`(e1e2) ::τ2

id=λx.x||y=idTrue ||z=idNil id=λx.x

| {z }

τ→τ

|

|y= id

Bool→Bool|{z}

True ||z= id

|{z}

List τ→List τ

Nil

id=λx.x

| {z }

Bool→Bool

|

|id0=λx0.x0

| {z }

List τ→List τ

|

|y= id

Bool→Bool|{z}

True ||z= id0

|{z}

Listτ→List τ

Nil

Operationale Semantik: Kontexte

Prozesskontexte:

DPC::= [·]|D||P |P||D|νx.D Monadische Kontexte:

MMC::= [·]|M>>=e Evaluations- und Forcingkontexte

EEC::= [·]|(E e) |(case Eofalts) |(seqEe) FFC::=E|(takeMVarE) |(putMVarEe)

(4)

Operationale Semantik: LC-Kontexte

LLC::=xM[F]

|xM[F[xn]]||xn=En[xn−1]||. . .||x2 =E2[x1]||x1=E1

wobei E2, . . .En nicht der leere Kontext sind.

LbLCd::=xM[F]

|xM[F[xn]]||xn=En[xn−1]||. . .||x2 =E2[x1]||x1=E1

wobei E1,E2, . . .En nicht der leere Kontext sind.

TCS | 14 CHF-Kalk¨ul | WS 2019/20 13/36 Der CHF-Kalk¨ul

Standardreduktion −→CHF

Monadische Berechnungen:

(CHF,lunit) yM[returne1>>= e2]−−→CHF yM[e2 e1]

(CHF,tmvar)yM[takeMVarx]||xme−−→CHF yM[returne]||xm (CHF,pmvar)yM[putMVarx e]||xm−−→CHF yM[return ()]||xme (CHF,nmvar)yM[newMVare]−−→CHF νx.(yM[returnx]||xme) (CHF,fork) yM[futuree]−−→CHF νz.(yM[return z]||ze)

wobeiz ein neuer Name ist und der erzeugte Thread kein Main-Thread ist

(CHF,unIO) yreturn e−−→CHF y=e,

wenn Thread y kein Main-Thread ist

TCS | 14 CHF-Kalk¨ul | WS 2019/20 14/36 Der CHF-Kalk¨ul

Standardreduktion −→CHF (2)

Funktionale Auswertung:

(CHF,cp) Lb[x]||x=v−−→CHF bL[v]||x=v,

fallsv eine Abstraktion oder eine Variable ist (CHF,cpcx) Lb[x]||x=c e1. . . en,

−−→CHF νy1, . . . yn.(bL[cy1. . .yn]||x=c y1. . .yn||y1=e1||. . .||yn=en) fallsc ein Konstruktor, oder ein monadischer Operator ist (CHF,mkbinds)L[letrecx1 =e1, . . . , xn=en in e]

−−→CHF νx1, . . . , xn.(L[e]||x1 =e1||. . .||xn=en)

(CHF,lbeta)L[((λx.e1)e2)]−−→CHF νx.(L[e1]||x=e2)

(CHF,case) L[caseT (ce1 . . . en) of . . .(cy1 . . . yne). . .]

−−→CHF νy1, . . . , yn.(L[e]||y1 =e1||. . .||yn=en]) (CHF,seq) L[(seqve)]−−→CHF L[e]

wennv ein funktionaler Wert ist

Standardreduktion: Abschluss

P1D[P10],P2D[P20]undP10 −−→CHF P20 P1−−→CHF P2

(5)

Erfolgreiche Prozesse

Definition

Ein wohlgeformter Prozess P ist genau dann erfolgreich, wenn er von der Formνx1, . . . , xn.xmain==return e||P0 ist.

CHF,+

−−−→bezeichnet die transitive H¨ulle von−−→CHF (eine oder mehr Reduktionen)

CHF,∗

−−−→bezeichnet die reflexiv-transitive H¨ulle (null oder mehr Reduktionen)

TCS | 14 CHF-Kalk¨ul | WS 2019/20 17/36 Der CHF-Kalk¨ul

May- und Should-Konvergenz

Definition May-Konvergenz:

P↓CHF g.d.w. ∃P0:P −−−→CHF,∗ P0 undP0 ist erfolgreich Should-Konvergenz:

P⇓CHF g.d.w. ∀P0 :P −−−→CHF,∗ P0 = P0CHF Must-Konvergenz:

P should-konvergent

und es gibt keine unendlich lange Reduktion vonP aus

TCS | 14 CHF-Kalk¨ul | WS 2019/20 18/36 Der CHF-Kalk¨ul

Should-Konvergenz 6= Must-Konvergenz

Beispiel mit syntaktischem Zucker

xmain==do future(loopP utTrue)Thread, der wiederh.Truein MVarxschreibt future(loopP utFalse)Thread, der wiederh.Falsein MVarxschreibt loop

|

|loop=do takeMVarx1x Lesen w takeMVarx1x Lesen

ifwwenn True, dann terminiere, sonst von vorne then return True

elseloop

|

|loopP ut=λz.do putMVar x z loopP ut z

|

|xm−

Prozess ist should-konvergent, aber nicht must-konvergent

May- und Must-Divergenz

Must-Divergenz: P⇑CHF gdw.¬PCHF May-Divergenz: PCHF gdw. ¬P⇓CHF Satz

ur alle Prozesse P gilt:PCHF ⇐⇒ ∃P0 :P −−−→CHF,∗ P0P0CHF

(6)

Kontextuelle Gleichheit

Kontextuelle Approximation:

P1CHF P2 gdw.P1CHF P2 undP1CHF P2, wobei P1CHF P2 gdw.DPC:D[P1]CHF = D[P2]CHF P1CHF P2 gdw.DPC:D[P1]CHF = D[P2]CHF Kontextuelle GleichheitCHF auf Prozessen:

P1 CHF P2 gdw.P1CHF P2 und P2 CHF P1

TCS | 14 CHF-Kalk¨ul | WS 2019/20 21/36 Der CHF-Kalk¨ul

May-Konvergenz alleine reicht nicht

P1:=νz.(zmain==return True) P2:=νx, z, y1, y2, loop.

(zmain==takeMVarx>>=λw.caseBoolw(Truereturn True) (Falseloop)

|

|loop=loop||y1⇐putMVarxFalse ||y2putMVarxTrue ||xm−)

D[P1]ist f¨ur alleD direkt erfolgreich ur D[P2]kann man zeigen:

D[P2]

CHF,∗

yy

CHF,∗

&&

D0[zmain==return True] D00[zmain==loop||loop=loop]

Daher gilt:

ur alle DPC:D[P1]↓CHF ⇐⇒ D[P2]CHF Aber:P1CHF ahrendP2CHF

TCS | 14 CHF-Kalk¨ul | WS 2019/20 22/36 Der CHF-Kalk¨ul

Should-Konvergenz alleine reicht nicht

P1 :=νz, loop.(zmain==loop)||loop=loop) P2 :=νx, z, y1, y2, loop.

(zmain==takeMVarx>>=λw.caseBool w(Truereturn True) (Falseloop)

|

|loop=loop||y1putMVarxFalse ||y2putMVarxTrue ||xm−)

D[P1]ist f¨ur alleDmust-divergent urD[P2]kann man zeigen:

D[P2]

CHF,∗

yy

CHF,∗

&&

D0[zmain==return True] D00[zmain==loop||loop=loop]

Daher gilt:

ur alleDPC:D[P1]CHF ⇐⇒ D[P2]⇓CHF Aber:P1CHF ahrendP2CHF

Fairness

Die Reduktion−−→CHF beachtet keine Fairness.

Beispiel:

xmain==takeMVarz||zmTrue ||yloop||loop=loop

CHF,cp

−−−→ xmain==takeMVarz||zmTrue ||yloop||loop=loop

CHF,cp

−−−→ xmain==takeMVarz||zmTrue ||yloop||loop=loop

CHF,cp

−−−→ xmain==takeMVarz||zmTrue ||yloop||loop=loop

CHF,cp

−−−→ . . .

(7)

Fairness (2)

Ausf¨uhrbarer Thread: F¨ur einen Prozess P D[xe]ist der Thread x ausf¨uhrbar, wenn es eine ReduktionP −−→CHF P0 gibt, die entweder innerhalb des Ausdrucksereduziert, oder eine Reduktion ausf¨uhrt, an der Threadx beteiligt ist (z.B. eine MVar liest oder schreibt, oder in ewird der Wert einer Bindung kopiert).

Definition

ur einen ProzessP ist die Reduktionsfolge

S =P −−→CHF P1−−→CHF P2. . .unfair, wenn S einen unendlich langen Suffix S0 hat, in dem ein Threadx unendlich oft ausf¨uhrbar ist, aber niemals reduziert wird. Eine Reduktionsfolge ist fair, wenn sie nicht unfair ist.

TCS | 14 CHF-Kalk¨ul | WS 2019/20 25/36 Der CHF-Kalk¨ul

Fairness (3)

Faire May-KonvergenzPCHF,f und Faire Should-KonvergenzP⇓CHF,f Wie May-Konvergenz und Should-Konvergenz, aber nur faire

Reduktionsfolgen sind erlaubt.

Satz

CHF = CHF,f und CHF = CHF,f Beweis: Siehe Skript

Vorteil: Wir brauchen uns um die Fairness nicht zu k¨ummern Theorem

Kontextuelle ¨Aquivalenz inCHF bleibt unver¨andert, wenn unfaire Reduktionssequenzen verboten sind.

Resultat giltnichtur die Must-Konvergenz!

TCS | 14 CHF-Kalk¨ul | WS 2019/20 26/36 Der CHF-Kalk¨ul

Programmtransformationen

EineProgrammtransformation T ist eine bin¨are Relation auf Prozessen

T istkorrekt, gdw. f¨ur alleP, P0:P T P0 = P CHF P0 Korrektheitwiderlegen ist eher einfach, daein Kontext als Gegenbeispiel gen¨ugt

Korrektheitbeweisen ist eher schwierig, daalleKontexte betrachtet werden m¨ussen

Satz

Der Nachweis und die Widerlegung der Korrektheit einer Programmtransformation ist unentscheidbar.

Beweis: Reduktion des Halteproblems: Die Aussage (P 6∼CHF xmain==letrec y=y iny)entspricht dem Halteproblem

Ungleichheit - Beispiel

P1:=xreturn True P2:=xreturn False

D:= [·]||ymain==caseBool x

(True returnTrue)

(Falseletrecw=win w) D[P1]CHF aber D[P2]⇑CHF.

DaherP16∼CHF P2

(8)

Einige korrekte Programmtransformationen

Satz

Die Reduktionen(CHF, lunit),(CHF, nmvar),(CHF, f ork), (CHF, unIO),(CHF, mkbinds) sind korrekte

Programmtransformationen.

Beweis:

Sei P10 a P20 wobeiawie im Satz undP1D[P10]und P2 D[P20] Wir m¨ussen vier Implikationen zeigen:

(1) P1CHF = P2CHF (2) P2CHF = P1CHF (3) P1CHF = P2CHF (4) P2CHF = P1CHF

TCS | 14 CHF-Kalk¨ul | WS 2019/20 29/36 Der CHF-Kalk¨ul

Einige korrekte Programmtransformationen

Vor¨uberlegungen:

Wenn P1 a P2 und P1 ist erfolgreich, dann muss auchP2 erfolgreich sein, da die →-Transformation nicht im main-Threada reduzieren kann.

Wenn P1 a P2, dann auchP1−−→CHF P2, da die→-Transformationa auch eine Standardreduktion ist.

Untersuche P0←−−CHF P1 a P2 (alle F¨alle):

Man stellt fest:

P1

CHF

a //P2

CHF

P0 a //P3

TCS | 14 CHF-Kalk¨ul | WS 2019/20 30/36 Der CHF-Kalk¨ul

Einige korrekte Programmtransformationen (2)

(1) Zeige P1CHF = P2CHF:

Da P1CHF, gibt es P1 −−→CHF P1,1 −−→CHF . . .−−→CHF P1,n mitP1,n erfolgreich.

Induktion ¨ubern

n= 0:P1 ist erfolgreich. Dann muss auchP2 erfolgreich sein.

Aussage gilt.

Induktionsschritt:

P1

CHF

a //P2

CHF

P1,1 a //

CHF,∗

P2,1

Induktionshypothese

OOOO

P1,n P2,n0

Einige korrekte Programmtransformationen (3)

(2) Zeige P2CHF = P1CHF:

Gilt sofort, da die Transformation P1a P2 auch eine Standardreduktion ist:

Jede konvergente Reduktionsfolge f¨urP2 kann durchP1a P2 verl¨angert werden zu einer konvergenten Reduktionsfolge f¨ur P1.

(3) Zeige P1CHF = P2CHF:

¨aquivalente Aussage P2CHF = P1CHF

Offensichtlich, da wiederum jede divergierende Folge f¨urP2 durchP1a P2 zu eine divergierenden Folge f¨urP1 verl¨angert werden kann.

(9)

Einige korrekte Programmtransformationen (4)

(4) Zeige P2CHF = P1CHF:

¨

aquivalente AussageP1CHF = P2CHF: P1 −−→CHF P1,1 −−→CHF . . .−−→CHF P1,n wobeiP1,nCHF Induktion ¨ubern

Induktionsbasis:P1CHF = P2CHF: Das folgt aus (2) des Beweises!

Indukionsschritt:

P1

CHF

a //P2

CHF

P1,1 a //

CHF,∗

P2,1

Induktionshypothese

OOOO

P1,n P2,n0

TCS | 14 CHF-Kalk¨ul | WS 2019/20 33/36 Der CHF-Kalk¨ul

Gleichheit auf Ausdr¨ucken

Definition

Kontextuelle Approximation CHF undkontextuelle Gleichheit

CHF ur gleich getypteAusdr¨ucke ist in CHF definiert also:

CHF:=CHF ∩ ≤CHF und CHF:=CHF∩ ≥CHF, wobei f¨ur Ausdr¨ucke e1, e2 vom Typ τ:

e1 CHF e2 gdw. Cτ]CC:C[e1]↓CHF = C[e2]↓CHF e1 ⇓,CHF e2 gdw. Cτ]CC:C[e1]⇓CHF = C[e2]CHF

TCS | 14 CHF-Kalk¨ul | WS 2019/20 34/36 Der CHF-Kalk¨ul

Monadische Gesetze

Satz

In CHF gelten f¨ur alle (korrekt getypten) Ausdr¨ucke e1, e2, e3 die folgenden Gleichheiten:

returne1 >>= e2 CHF e2 e1 e1 >>= λx.returnx CHF e1

e1 >>= (λx.(e2 x >>= e3)) CHF (e1 >>= e2) >>= e3

Weitere Eigenschaften von CHF

Call-by-name Auswertung ist ¨aquivalent zu call-by-need Auswertung

Es wurden noch weitere Programmtransformationen als korrekt bewiesen

CHF erweitert die pure funktionale Teilsprache konservativ:

Alle Gleichheiten die in der puren funktionalen Sprache gelten, gelten auch in CHF

Lazy Futures verletzen die Konservativit¨at!

Referenzen

ÄHNLICHE DOKUMENTE

Hinweis: Statt SML k¨onnen Sie auch eine andere Programmiersprache verwen- den (Scheme, Haskell,. z x) λzz als B¨aume dar.. Aufgabe P-2 (Lokal-namenlose Repr¨ asentation

Aufgabe H-6 (Lokale Konfluenz von surjektiven Paaren): Betrachten Sie die Erweiterung des λ-Kalk¨uls um einen Konstruktor und Destruktoren f¨ur Paare, d.h., um drei Konstanten fst,

Institut f¨ur Informatik WS 2008/09 der Universit¨at

Aufgabe H-14 (Starke und schwache Normalisierung identisch in λI, 6 Punkte): Der λI-Kalk¨ul ist folgende Einschr¨ankung des λ-Kalk¨uls: F¨ur jedem Abstraktionsterm λxt gilt x

Aufgabe H-16 (W-B¨ aume I): Als W-Baum bezeichnet man einen λ-Term, gesehen als Baum, in dem der rechte Teilbaum jedes Applikationsknotens ein- fach ist, d.h. selbst keine

Aufgabe P-19 (Typisierung): Finden Sie, falls existent, eine Typisierung f¨ur die Terme λxyz. [Hinweis: Es gen¨ugt, normale Terme

Aufgabe P-21 (Beweisterme): Der einfach getypte λ-Kalk¨ul entspricht der konstruktiven Aussagenlogik. Der Funktionspfeil entspricht der Implikation, ein Term eines Typs entspricht

I Getypter λ-Kalk¨ ul als Grundlage der Metalogik, Modellierung von Logiken durch Einbettung. I Isabelle: Korrektheit durch Systemarchitektur I Beweis: R¨ uckw¨