• Aucun résultat trouvé

Mini-ML Mini language fonctionnel, pur: (types

N/A
N/A
Protected

Academic year: 2022

Partager "Mini-ML Mini language fonctionnel, pur: (types"

Copied!
19
0
0

Texte intégral

(1)

Mini-ML

Mini language fonctionnel, pur:

(types)

τ ::= Int | Bool | τ

1

→ τ

2

(exps)

e ::= c | x | λx → e | e

1

e

2

| e : τ

let x = e

1

in e

2

| if e

1

then e

2

else e

3

Ajout d’effets de bord:

(types)

τ ::= ... | ref τ | Unit

(expressions)

e ::= ... | ref e | !e | e

1

:= e

2

| e

1

; e

2

(2)

Typage bidirectionnel

Au lieu de

Γ ` e : τ

Le typage bidirectionnel utilise 2 jugements:

Γ ` e ⇒ τ Γ ` e ⇐ τ

R `egle habituelle: constructeurs v ´erifi ´es, ´eliminations inf ´er ´ees Souvent suffisant pour ´eliminer annotations sauf sur

let

Exprime un algorithme avec 2 fonctions mutuellements r ´ecursives:

infer

:

Ctx

Exp

Typ

check

:

Ctx

Exp

Typ

Unit

(3)

S ´emantique statique de Mini-ML pur

(type ctx)

Γ ::= • | Γ, x : τ Γ(x) = τ

Γ ` x ⇒ τ

Γ ` e

1

⇒ τ

1

→ τ

2

Γ ` e

2

⇐ τ

1

Γ ` e

1

e

2

⇒ τ

2

Γ, x : τ

1

` e ⇐ τ

2

Γ ` λx → e ⇐ τ

1

→ τ

2

Γ ` e ⇐ τ Γ ` e : τ ⇒ τ

Γ ` e ⇒ τ Γ ` e ⇐ τ

Γ ` e

1

Bool Γ ` e

2

⇐ τ Γ ` e

3

⇐ τ Γ ` if e

1

then e

2

else e

3

⇐ τ

Γ ` e

1

⇒ τ

1

Γ, x : τ

1

` e

2

a

τ

2

Γ ` let x = e

1

in e

2

a

τ

2

(4)

Pseudocode de l’algorithme bidirectionnel

infer Γ e = case e

| Evar x => lookup Γ x

| Eapply e

1

e

2

=> case infer Γ e

1

| Tarw t

1

t

2

=> check Γ e

2

t

1

; t

2

| Eannot e t => check Γ e t; t ...

check Γ e t = case e

| Elam x e => case t

| Tarw t

1

t

2

=> check (extend Γ x t

1

) e t

2

| Eif e

1

e

2

e

3

=>

check Γ e

1

Tbool; check Γ e

2

t; check Γ e

3

t ...

| _ => assert (t = infer Γ e)

(5)

S ´emantique dynamique de Mini-ML pur

(values)

v ::= λx → e | c v

1

... v

n

R ´eductions primitives:

(+) n

1

n

2

; n

3 where

n

3

= n

1

+ n

2

(λx : τ → e) v ; e[v/x]

let x = v in e ; e[v/x]

e : τ ; e

if True then e

2

else e

3

; e

2

if False then e

2

else e

3

; e

3

(6)

S ´emantique dynamique de Mini-ML pur (suite)

R `egles de congruence:

e

1

; e

01

e

1

e

2

; e

01

e

2

e ; e

0

v e ; v e

0

e

1

; e

01

let x = e

1

in e

2

; let x = e

01

in e

2

e

1

; e

01

if e

1

then e

2

else e

3

; if e

01

then e

2

else e

3

Ou aussi:

(exps avec trou)

E ::= • | E e | v E | let x = E in e |

if E then e

2

else e

3

(7)

Typage avec effets de bord

...

Γ ` e ⇒ τ

Γ ` ref e ⇒ ref τ

Γ ` e ⇒ ref τ Γ ` !e ⇒ τ

Γ ` e

1

Unit Γ ` e

2

a

τ

2

Γ ` e

1

; e

2

a

τ

2

Γ ` e

1

ref τ Γ ` e

2

⇐ τ

Γ ` e

1

:= e

2

Unit

(8)

S ´emantique dynamique avec effets de bord?

e ; e

0 n’est plus suffisant, on a besoin de m ´emoire!

Nouvelles valeurs, renvoy ´ees par

ref e

et

e

1

:= e

2: (values)

v ::= ... | () | `

(heap)

M ::= • | M, ` 7→ v

Voyons d’abord une s ´emantique `a grands pas:

(M ; e) ↓ (M

0

; v )

Evaluer´

e

dans le tas

M

renvoie la valeur

v

avec un nouveau tas

M

0

(9)

Effets de bord `a grands pas, partie pure

(M ; v) ↓ (M ; v) (M ; e) ↓ (M

0

; v) (M ; e : τ ) ↓ (M

0

; v)

(M ; e

1

) ↓ (M

1

; λx → e) (M

1

; e

2

) ↓ (M

2

; v

2

) (M

1

; e[v

2

/x]) ↓ (M

0

; v) (M ; e

1

e

2

) ↓ (M

0

; v)

(M ; e

1

) ↓ (M

1

; v

1

) (M

1

; e

2

[v

1

/x]) ↓ (M

0

; v) (M ;

let

x = e

1 in

e

2

) ↓ (M

0

; v)

(M ; e

1

) ↓ (M

1

; v

1

) (M

1

; e) ↓ (M

0

; v) e =

e

2

if v

1

= True e

3

if v

1

= False (M ;

if

e

1 then

e

2 else

e

3

) ↓ (M

0

; v)

¡L’existence de

:=

oblige `a changer les r `egles pures!

(10)

Effets de bord `a grands pas, partie impure

(M ; e) ↓ (M

0

; v) ` fresh (M ;

ref

e) ↓ (M

0

, ` 7→ v; `)

(M ; e) ↓ (M

0

; `) M

0

(`) = v (M ; !e) ↓ (M

0

; v)

(M ; e

1

) ↓ (M

1

; `) (M

1

; e

2

) ↓ (M

0

; v) (M ; e

1

:= e

2

) ↓ (M

0

, ` 7→ v; v)

(M ; e

1

) ↓ (M

1

; v

1

) (M

1

; e

2

) ↓ (M

0

; v)

(M ; e

1

; e

2

) ↓ (M

0

; v))

(11)

Des expressions et des valeurs

Le r `egle d’ ´evaluation des valeurs est formellement incorrecte

(M ; v) ↓ (M ; v)

Parce qu’ `a gauche on doit avoir une expression:

Les valeurs

v

ne sont plus un sous-ensemble des expressions

e

! Il faut

(M ; c) ↓ (M ; c)

,

(M ; λx → e) ↓ (M ; λx → e)

, ...

Pour les petits pas, c¸a ne suffit pas; il faut ´etendre

e

: (exps)

e ::= ... | `

ou m ˆeme

(exps)

e ::= ... | v

(12)

Effets de bord `a petits pas, partie pure

R ´eductions primitives:

(M ; (+) n

1

n

2

) ; (M ; n

3

)

where

n

3

= n

1

+ n

2

(M ; (λx : τ → e) v) ; (M ; e[v/x])

(M ; let x = v in e) ; (M ; e[v/x]) (M ; e : τ ) ; (M ; e)

(M ; if True then e

2

else e

3

) ; (M ; e

2

) (M ; if False then e

2

else e

3

) ; (M ; e

3

)

Rien de chang ´e, mis `a part l’ajout du

M

partout

(13)

Effets de bord `a petits pas, partie impure

R ´eductions primitives:

(M ; ref v ) ; (M, ` 7→ v; `)

where

` fresh (M ; !`) ; (M ; v)

where

M (`) = v (M ; ` := v ) ; (M, ` 7→ v; ())

(M ; (); e) ; (M ; e)

(exps avec trou)

E ::= • | E e | v E | let x = E in e

| if E then e

2

else e

3

| ref E | !E | E := e | v := E | E ; e

(14)

R `egles de typage valides?

Comment s’assurer de la validit ´e des r `egles de typage?

Si

e : τ

, la valeur

v

retourn ´ee par

e

devrait avoir type

τ

La coh ´erence (soundness) des r `egles peut se d ´ecomposer en:

pr ´eservation des types: Si

e : τ

et

e ; e

0 alors

e

0

: τ

progr `es: Si

e : τ

, ou

e ; e

0 ou

e

est une valeur Ensemble, cela donne:

Si

e : τ

et

e ;

e

0

,

alors

e

0 n’est pas stuck: ou

e

0

; e

00 ou

e

0 est une valeur

“well-typed programs do not go wrong”

(15)

Coh ´erence du typage de Mini-ML?

En g ´en ´eral, progr `es ne s’applique que dans un environnement vide:

Si

• ` e : τ

, alors ou

(M ; e) ; (M

0

; e

0

)

ou

e

est une valeur Pr ´eservation des types implique, par exemple:

Vu que

• `

ref

4 :

ref Int et

(M ;

ref

4) ; (M, ` 7→ 4; `)

alors

• ` ` :

ref Int

Il nous faut donc une r `egle de typage pour

`

:

?

Γ ` ` : τ Ψ

donnera un type `a chaque adresse:

(heap type)

Ψ ::= • | Ψ, ` : τ

(16)

Nouveaux jugements de typage

Il faut v ´erifier que

Ψ

est bien le type de

M

, avec

` M : Ψ

:

Ψ ` M : Ψ

` M : Ψ Ψ ` • : •

Ψ ` M : Ψ

0

Ψ; • ` v ⇐ τ Ψ ` M, ` 7→ v : Ψ

0

, ` : τ

Et les jugements prennent maintenant la forme:

Ψ; Γ ` e ⇔

a

τ Γ(x) = τ

Ψ; Γ ` x ⇒ τ · · · Ψ(`) = τ

Ψ; Γ ` ` ⇒ ref τ

Aucun jugement ne modifie

Ψ

, e.g.:

Ψ; Γ ` e ⇒ τ

Ψ; Γ ` ref e ⇒ ref τ

Ψ; Γ ` e

1

ref τ Ψ; Γ ` e

2

⇐ τ

Ψ; Γ ` e

1

:= e

2

Unit

(17)

Coh ´erence du typage de Mini-ML

Progr `es:

Si

` M : Ψ ∧ Ψ; • ` e ⇐ τ

alors

(M ; e) ; (M

0

; e)

0

∨ e

est une valeur Pr ´eservation des types:

Si

` M : Ψ ∧ Ψ; Γ ` e ⇐ τ ∧ (M ; e) ; (M

0

; e)

0

alors

∃Ψ

0

. ` M : Ψ

0

∧ Ψ

0

; Γ ` e

0

⇐ τ

(18)

Preuve de pr ´eservation des types

Dans le cas o `u

e = (λx : τ → e

1

) v

et

e

0

= e

1

[v/x]

, on doit prouver

Ψ; Γ ` e

1

[v/x] ⇐ τ

2,

sachant que

Ψ; Γ, x : τ

1

` e

1

⇐ τ

2 et

Ψ; Γ ` v ⇐ τ

1

Lemme de substitution ressemble habituellement `a:

Si

Ψ; Γ, x : τ

1

, Γ

0

` e : τ

2

∧ Ψ; Γ ` v : τ

1

alors

Ψ; Γ, Γ

0

` e[v/x] : τ

2

Ce genre de lemme est r ´ecurrent dans les preuves de pr ´eservation

(19)

Preuve de progr `es

Dans le cas

e = e

1

e

2, si

e

1 ou

e

2 n’est pas une valeur,

alors on trouve imm ´ediatement un pas

e ; e

0 par induction,

sinon il nous faut prouver que

e = (λx → e

3

) e

2 pour appliquer

β

Lemme de formes canoniques ressemble habituellement `a:

Si

Ψ; • ` v : τ

1

→ τ

2

alors

v = λx → e

Ce genre de lemme est r ´ecurrent dans les preuves de progr `es

Références

Documents relatifs

Façade de couleur corten pour platine Quadra à boutons mécaniques. 4793MB FAÇADE NOIRE POUR QUADRA

C'est pourquoi nous ne devons pas vous habituer à violer votre serment et vous, vous ne devez pas prendre cette habitude: nous serions les uns et les

Branchez le câble audio de 3,5mm à la prise 3,5mm de l’enceinte et l’autre extrémité du câble à votre lecteur personnel.. Appuyez sur le bouton lecture de votre lecteur

• Nehmen Sie die Batterien aus dem Gerät, wenn Sie es für längere Zeit nicht benutzen. EN Important information about the batteries and how to dispose

Place la sonde du thermomètre dans le compartiment contenant l’eau distillée sans qu’elle ne touche le fond.. Démarre la congélation en allumant le générateur, déclenche

Une fois la durée de vie prévue écoulée, Mercado Medic AB ne peut plus garantir la conformité et la sécurité du produit, car Mercado Medic AB n’a aucun contrôle sur la façon

Le travail devra être envoyé par mail (deadline fixée ultérieurement) sous forme d’archive compressée.. Nom1-Nom2.tar.gz La structure de l’archive sera la

Using the DB-25/DB-25 to HDI-30 SCSI cable supplied by Asante plug one end of the cable into the PowerBook SCSI port and the other end into the EN/SC PB or EN/SC-IOT PB adapter