Les calculs à la Church usuels (tels que3.1) vérifient la propriétéd’unicité du typage:
pour tout contexte Γ et tout terme t, il existe au plus un type tel queΓ ⊢t:T.
Les systèmesà la Church tels que nous les définissons ne sont en fait pas exactement
équivalents aux systèmes à la Church usuels. En particulier, l’unicité du typage est plus
forte : puisque le type des variables est fixé a priori, le type d’un terme est indépendant
du contexte de typage.
Lemme 3.3.20 (Unicité du typage) Soit ty∈{⇒, 2} ett∈Λ
Ctyh. Alors
Γ ⊢t:T et Γ
′⊢t:T
′implique T =T
′.
Remarque 3.3.21 Pour les systèmes à la Church tels que nous les définissons, si
Γ ⊢ t:T etΓ
′⊢t:T alorsΓ etΓ
′coïncident sur FV(t). Lorsque le contexte le permet,
nous écrivons t:T au lieu deΓ ⊢t:T.
Les propriétés énoncées par3.3.15et3.3.16sont aussi satisfaites par les systèmesà la
Church.
Lemme 3.3.22 (Préservation du type par réduction) Pour tout ty ∈ {⇒, 2}, si
Γ ⊢
Chty
t:T ett→
βualors Γ ⊢
Chty
u:T.
Théorème 3.3.23 (Normalisation forte) Pour tout ty∈{⇒, 2}, si Γ ⊢
Chty
t:T alors
t∈ SN
β.
3.4 Types de données dans le système F
Le système F est suffisamment puissant pour encoder beaucoup de types de données
intéressants. On peut trouver dans [GLT89,Kri90] plus de détails à ce sujet.
Dans cette section, nous voyons comment encoder dans le système F les types de
données présentés à la section 1.1 dans le cadre de la réécriture au premier ordre. Les
explications sur les codages imprédicatifs mélangent volontairement les constructions
algébriques et les λ-termes.
3.4.1 Booléens
Les booléens algébriques sont construits à partir de deux constructeurs true et false.
Le type des booléens est donc le plus petit type T tel qu’on a un élément de T dès lors
qu’on a trueou false. On pose
T
Bool=
def∀X. X⇒X⇒X .
On représente trueetfalse par les deux habitants les plus simples possibles deT
Bool:
Chapitre 3 Réécriture et lambda-calcul
On les élimine avec un termeIter
Boolu v ttel queIter
Boolu v TrueetIter
Boolu v False
simulent les comportements respectifs deiter
Bool(u, v,true)et deite
Bool(u, v,false).
C’est-à-dire :
Iter
Boolu v True →
∗βu et Iter
Boolu v False →
∗βv .
Il doit donc pouvoir être typé comme suit :
u, v:U, b:T
Bool⊢
2Iter
Boolu v b:U
Ces deux contraintes sont satisfaites en posantIter
Boolu v t=
deft u v.
3.4.2 Paires
Les paires algébriques sont construites à partir d’un constructeur binaire(_,_). Donc
le type des paires A×B est le plus petit type T construit à partir d’une fonction dans
A⇒B⇒T. On pose
T
A×B=
def∀X. (A⇒B⇒X)⇒X .
On peut alors représenter(_,_) par
Pair =
defλxλyλp.p x y : A⇒B⇒T
A×B.
Le terme(a, b)correspond à Pair a b, dont la forme→
whβ-normale estλp.p a b.
Les deux projections sont codées à partir d’un itérateur de paires. C’est un terme
Iter
_×_u ptel que
Iter
_×_u(Pair a b) →
βu a b ,
et qui doit donc être typé de la manière suivante :
u:A⇒B⇒U, p:T
A×B⊢
2Iter
_×_u p:U .
On poseIter
_×_u p=
defp uet on code les projections par
Fst t =
defIter
_×_True t et Snd t =
defIter
_×_False t .
Alors on a
Fst(Pair a b) = (λp.p a b)True →
β(λxy.x)a b →
βa
Snd(Pair a b) = (λp.p a b)False →
β(λxy.y)a b →
βb
ainsi que
a:A, b:B ⊢
2Fst(Pair a b) : A
a:A, b:B ⊢
2Snd(Pair a b) : B .
Remarque 3.4.1 Ce typage utilise True et False avec les types A ⇒ B ⇒ A et
A ⇒ B ⇒ B respectivement. Ce n’est pas leur type en tant que booléens. Dans le
système Fà la Church nous ne pourrions pas utiliser ces termes comme sélecteurs dans
les paires : dans ce système True et False sont les termes ΛX.λx
Xy
X.x etΛX.λx
Xy
X.y
3.4 Types de données dans le système F
3.4.3 Entiers
Le type des entiers est le plus petit type T construit à partir d’une constante et d’un
symbole de fonction unaire. On pose donc
T
Nat=
def∀X. X⇒(X⇒X)⇒X .
Les termes
Zero =
defλxf.x et Succ =
defλn.λxf.f(n x f)
sont de type T
Natet représentant respectivement les constructeurs 0 etS(_). Pour tout
n∈N, le terme S
n(0) est représenté par le terme Succ
nZero, dont la formeβ-normale
est l’entier de Church λxf.f
nxde type T
Nat.Le système F permet aussi de coder l’itérateuriter(u, v, n) : avec
Iter u v n =
defn u v ,
on a
Iter u v Zero = (λxf.x)u v →
βu
Iter u v(Succ n) = (λxf.f(n x f))u v →
βv(n u v) = v(Iter u v n)
et
u:U, v:U⇒U, n:T
Nat⊢
2Iter u v n:U .
3.4.4 Vers une extension du lambda-calcul
Nous avons vu comment coder dans leλ-calcul des types de données et leur schémas
d’itération. De plus, ces codages sont typables grâce aux types imprédicatifs du système F.
Cependant, ils souffrent de certaines limitations.
3.4.4.(a) Paires surjectives
Certaines interprétations catégorielles du λ-calcul valident les équations suivantes sur
les paires et les projections : étant donnés deux objets A
1,A
2, on a deux morphismes
π
i: A
1×A
2→ A
i(i ∈ {1, 2}) tels que pour tout objet B, pour tout f
i: A
i→ B
(i∈{1, 2}) et touth:B→A
1×A
2,
π
1◦(f
1, f
2) = f
1π
2◦(f
1, f
2) = f
2(π
1◦h, π
2◦h) = h .
(3.2)
On a vu en 3.1.4 une définition algébrique des paires et projections dans laquelle les
deux premières équations sont implantées par les règles 7→
πet la dernière par la règle
7
→
SP. En 3.4.2, on a vu comment coder le système de réécriture→
πdans la syntaxe du
λ-calcul pur et comment typer ce codage grâce aux types imprédicatifs du système F.
Cependant, Barendregt a montré que la règle 7→
SPn’est pas codable par laβ-conversion
dans le λ-calcul (voir [Bar84]).
Chapitre 3 Réécriture et lambda-calcul
3.4.4.(b) Schéma de récursion
Le récurseur rec présenté à l’exemple 3.1.17.(ii)n’est pas définissable en temps borné
dans le système F : il n’y a pas de terme Rec tel qu’il existe k ∈ N tel que pour tout
termen,
Rec u v 0 →
kβu et Rec u v(Succ n) →
kβv(Rec u v n)n . (3.3)
Cela provient d’un résultat de [Par89] disant qu’il n’y a pas, dans le λ-calcul (donc à
fortioridans le système F), de terme calculant le prédécesseur d’un entier de Church en
temps borné. Or, un tel terme serait définissable s’il existait un termeRecvérifiant (3.3).
En effet :
Rec 0(λ_.λx.x)0 →
kβ0 et Rec 0(λ_.λx.x) (Succ n) →
kβ+2n .
Dans le document
Définitions par réécriture dans le lambda-calcul : confluence, réductibilité et typage
(Page 77-80)