Institut Galilée. P. Boudes, J. Le Roux et V. Mogbil Master 1 informatique 2015-2016
Fondements de la programmation Exercices 9 et 10 lambda-calcul
Stratégie d’évaluation : appel par valeur.
Nous allons maintenant restreindre la β-réduction de façon à ce qu’elle corresponde à la façon dont les programmes sont évalués dans la plupart des langages de programmation. On distingue un en- semble particulier de termes appelés valeurs au delà desquels on ne (β-)réduit plus. En l’ab- sence d’extensions du lambda-calcul, qui viendront après, les valeurs sont tous les termes qui corres- pondent à une abstraction :
v:=λx.t
Intuitivement, on ne réduit pas dans le corps des fonctions tant qu’elles ne sont pas complètement appliquées.
On se donne ensuite des règles d’évaluation qui déterminent exactement l’ordre dans lequel il faut faire les réductions dans un terme.
(λx.t1 v2)→t1[x:=v2] t1→t01
(t1t2)→(t01 t2)
t2 →t02 (v1 t2)→(v1 t02) Le point important dans cet ensemble de règles est qu’il n’y a pas de règle qui permette de réduire sous une abstraction.
Nous reviendrons plus en détails sur les diffé- rentes stratégies d’évaluation possibles.
Unicité du typage.Nous utilisons désormais une version du lambda-calcul simplement typé où chaque variable liée par un lambda est annotée par un type, comme ceci :λx[T].t, de telle sorte queT soit le type associé à la variable x au moment du jugement de typage :
Γ, x:A`t:B Γ`λx[A].t:A→B abs.
De cette façon, étant donné un contexte de typage Γ, et un terme t ainsi annoté il existe au plus un type T tel que Γ`t:T.
Nous allons maintenant donner des exten- sions du lambda-calcul simplement typé de façon à en faire un langage de programmation, Turing-complet et ayant les caractéristiques d’un langage de type ML (les langages ML comme SML, CAML sont inspirés des extensions du lambda- calcul et en particulier du langage PCF,program- ming computable functions).
Unit. On ajoute une valeur unit de type, Unit.
t:=. . .|unit v:=. . .|unit T :=. . .|Unit
Γ`unit:Unit
Ceci nous permet d’introduire uneforme dérivée : t1;t2
def= (λx[Unit].t2 t1) (x /∈F V(t2)).
Cette mise en séquence, t1;t2 a pour effet d’éva- luer t1, de jeter son résultat, puis d’évaluer t2. Les règles d’évaluation et de typage induites sur la forme sont :
t1 →t01
t1;t2 →t01;t2 unit;t2→t2
Γ`t1 :Unit Γ`t2:T2
Γ`t1;t2 :T2
Let in. On peut également se donner la forme syntaxiquelet in
t:=. . .|let x=t in t let x=v1 in t2 →t2[x:=v1]
t1 →t01
let x=t1 in →let x=t01 in t2
Γ`t1:T1 Γ, x:T1`t2:T2
Γ`let x=t1 in t2 :T2
Au premier abord, cette forme let x = t1 in t2 est juste du sucre syntaxique pour (λx[T1].t2 t1). Pourdésugariser il faudra toutefois trouver l’annotation de type pour λx, donc faire l’inférence de type avant.
Combinateur de point fixe. Pour chaque type T1 on se donne un opérateur sur les termes 1
Institut Galilée. P. Boudes, J. Le Roux et V. Mogbil Master 1 informatique 2015-2016
fix tel que :
t:=. . .|(fix t)
(fix λx[T1].t2)→t2[x:= (fix λx[T1].t2)]
t1 →t01 fix t1 →fix t01 Γ`t1 :T1 →T1 Γ`(fix t1) :T1
Forme dérivée :
letrec x=t1 in t2
def= let x= (fix λx[T1].t1) in t2
On peut construire des types de données com-
posées, le plus simple d’entre eux étant lespaires: t:=. . .| {t, t} |t.1|t.2
v:=. . .| {t, t}
T :=. . .|T1×T2
Règles de réduction des paires : t→t0
i= 1,2
t.i→t0.i
i= 1,2 {v1, v2}.i→vi
t1 →t01 {t1, t2} → {t01, t2}
t2→t02 {v1, t2} → {v1, t02}
Règles de typage des paires : Γ`t1:T1 Γ`t2:T2
Γ` {t1, t2}:T1×T2
Γ`t:T1×T2
Γ`t.i:Ti
1 Exercices
Question A. Typage. Typer les termes suivants en utilisant les extensions appropriées du lambda- calcul.
1. let f =λxy.x in λabc.(f (f a b)c).
2. (λxy.x(yunit) (λz.z));λxy.y 3. (fix λxy.x)
4. letrec f =λghx.(g x(f g h(h x)) (h x)) in (f (λxyz.z) (λz.z)) 5. λx.x.1
6. λxy.{x, y}
1.1 Letrec
Question B. Question de partiel. Dans un letrec qu’est-ce qui s’apparente à du sucre syntaxique (ou une forme dérivée) et qu’est ce qui est une véritable extension du lambda-calcul simplement typé ? Question C. Fonctions récursives. Définir factorielle à l’aide d’un letrec puis supprimer le sucre syntaxique. De même pour la fonction de Fibonacci.
Question D. Récursion. La plupart du temps un letrec sert à définir une fonction, c’est à dire un terme de type T1 → T2, pour un certain T1 et un certain T2. Pouvez-vous trouver une expression définie récursivement et qui soit d’un type autre qu’une flèche ?
1.2 Preuves par induction sur les jugements de typage
Question E. Affaiblissement (importation dans d’autres contextes). Prouver que, en lambda-calcul simplement typé, si Γ`t:T alors pour n’importe quel x6∈F V(t),Γ, x:T0 `t:T.
En déduire que si Γ`t :T alorsΓ, x1 :T1, . . . , xn :Tn `t:T, pour n’importe quelsx1, . . . , xn 6∈
F V(t).
Question F. Substitution (modularité et liaison.) Prouver que si Γ, x: T0 ` t :T et Γ ` t0 :T0, alorsΓ`t[x:=t0] :T.
2