• Aucun résultat trouvé

1. Dans ce cas, on a infer Γ (M) = NF(C ′ [M 2 /x]) 6=

1.3.2 Système F stratifié

On appelle Système F stratifié le CTS défini par la spécification suivante : SSFα = {⋆i, i|i < α}

ASFα = {(⋆i, j)|i < j < α}

RSFα = {(⋆i, ⋆j, ⋆k)|i, j ≤ k < α} ∪ {(i, ⋆j, ⋆k)|0 < i, j ≤ k < α} CSFα = {(⋆i, ⋆j)|i < j < α} ∪ {(i, j)|0 < i < j < α}

Tout comme λ⋆α, le système SFα admet une présentation plus succincte équivalente : SSFα′ = SSFα

ASFα′ = {(⋆i, i+1)|i + 1 < α}

RSFα′ = {(⋆i, ⋆i, ⋆i)|i < α} ∪ {(i, ⋆i, ⋆i)|0 < i < α} CSFα′ = CSFα

et on peut prouver que SFα′ est le plus petit sous-CTS P de SFα tel que P = SFα. Ce système se plonge naturellement dans Système F : la fonction

ψ : SSFα −→ SF

i 7→

i 7→ 

est trivialement un morphisme de SFα dans système F. Il peut être vu comme la version “prédicative” de système F, puisqu’il a été obtenu en stratifiant la sorte des types. On peut par ailleurs prouver que tous les WCTS prédicatifs qui se plongent dans F se plongent dans SFα pour un certain α :

1.3.26 Lemme

Soit P un WCTS prédicatif tel que P ֒→ϕF, alors il existe un morphisme χ tel que P ֒→χSFRang(P) et ϕ = ψ ◦ χ.

Démonstration Soit χ la fonction définie par :

χ : SP −→ SSFRang(P)

s 7→

(

Rang(s) si ϕ(s) = ⋆ Rang(s) si ϕ(s) =  Posons α = Rang(P) et montrons que P ֒→χSFα :

– Soit (s, r) ∈ AP, on doit montrer que (χ(s), χ(r)) ∈ ASFα. Or comme ϕ est un morphisme, on a (ϕ(s), ϕ(r)) ∈ AF et donc (ϕ(s), ϕ(r)) = (⋆, ). On en déduit donc que (χ(s), χ(r)) = (⋆Rang(s), Rang(r)). Or par définition de <P, on a s <P r et donc d’après le lemme1.3.12, on en déduit Rang(s) < Rang(r). On a donc bien (⋆Rang(s), Rang(r)) ∈ ASFα.

– Soit (s1, s2, s3) ∈ RP, on doit montrer que (χ(s1), χ(s2), χ(s3)) ∈ RSFα. Or comme ϕ est un morphisme, on a (ϕ(s1), ϕ(s2), ϕ(s3)) ∈ RF. Deux cas sont alors possibles :

1. Soit (ϕ(s1), ϕ(s2), ϕ(s3)) = (⋆, ⋆, ⋆) et dans ce cas on a :

2. Soit (ϕ(s1), ϕ(s2), ϕ(s3)) = (, ⋆, ⋆) et dans ce cas on a :

(χ(s1), χ(s2), χ(s3)) = (Rang(s1), ⋆Rang(s2), ⋆Rang(s3))

Donc pour prouver (χ(s1), χ(s2), χ(s3)) ∈ RSFα il suffit de montrer que Rang(s1) ≤ Rang(s3) et Rang(s2) ≤ Rang(s3). Or c’est exactement le lemme1.3.14.

– Soit (s, r) ∈ CP, on doit montrer que χ(s) 4SFα χ(r). Or comme ϕ est un morphisme et comme CF = ∅, on a ϕ(s) = ϕ(r). Donc il suffit de montrer que Rang(s) ≤ Rang(r). On utilise pour ça

le lemme1.3.13. ,

Ce système a été introduit par [Sta81] afin de contourner l’imprédicativité de Système F : En effet, contrairement à système F, l’absence d’imprédicativité permet de donner des modèles ensemblistes simples.

Le système SFα vérifie les propriétés suivantes : 1.3.27 Lemme 1. SFα |= CTS, 2. SFα |= SRβ, 3. SFα |= MINLOC, 4. SFα |= PRINCIPAL, 5. SFα |= UPSTABLE, 6. SFα |= STRENGTHENING, 7. SFα |= PREDICATIVE, 8. SFω |= DECIDABLE,

Démonstration 1. La relation CSFα est une relation transitive. 2. C’est une conséquence directe du lemme1.1.42.

3. La vérification est immédiate.

4. La relation CSFα est un ordre strict bien-fondé. 5. La vérification deUPSTABLE est immédiate. 6. C’est une conséquence directe du lemme1.2.42.

7. La relation <SFα est égale à la la relation {(⋆i, ⋆j), (⋆i, j)|i < j < α} que l’on peut représenter par :

0 0 1 1 2 2 3 3

On a ⋆i <SFα j car ASFα ⊆ <SFα et ⋆i <SFα j car (j, ⋆j, ⋆j) ∈ RSFα et ⋆i <SFα j. 8. Tous les CTS prédicatifs sont fortement normalisables (théorème 1.3.23) et on implémente

faci-lement les tests d’appartenance aux paramètres en comparant des entiers. , Ce CTS ne vérifie néanmoins pas la conditionFULLet donc l’algorithme infer de la sous-section1.2.10

ne peut pas être utilisé directement pour résoudre le problème de l’inférence du type principal.

Or le fait que SFω ne soit pas un CTS dépendant (c’est-à-dire nous n’avons pas la règle de la forme (⋆i, j, k)), nous permet de montrer facilement par inversion (lemme1.1.32) qu’on ne trouve jamais de redex dans les types. On en déduit alors que l’ensemble des habitants de ⋆i est décrit par :

InhabΓ(⋆i) = {α|α : ⋆j ∈ Γ ∧ j ≤ i }

∪ {A → B|A ∈ InhabΓ(⋆i) ∧ B ∈ InhabΓ, :A(⋆i)} ∪ {∀α : ⋆j.A|A ∈ InhabΓ,α:⋆j(⋆i) ∧ j < i}

et donc que l’appartenance à InhabΓ(⋆i) est décidable : il suffit simplement de vérifier récursivement que le terme a la bonne forme. De la même façon, on se convainc que l’appartenance à ensemble

S

i<ωInhabΓ(⋆i) est décidable.

On en déduit alors sans difficulté que l’algorithme suivant est correct et complet pour le problème de l’inférence du type principal dans SFω.

inferΓ(x) =

(

A si x : A ∈ Γ

sinon inferΓ(⋆i) = i+1 inferΓ(i) = inferΓ(λx : A.M) =

∀x : A. inferΓ,x:A(M) s’il existe i ∈ N et j ∈ N tels que A ∈ InhabΓ(⋆i) ∨ A = ⋆i inferΓ,x:A(M) ∈ InhabΓ(⋆j)

sinon inferΓ(M N) = B[N/x] si inferΓ(M) = ∀x : A.B,

et s’il existe i ∈ N tel que inferΓ(N) = ⋆i B si inferΓ(M) = ∀x : A.B

et s’il existe i ∈ N tel que inferΓ(N) ∈ InhabΓ(⋆i)

sinon inferΓ(∀x : A.B) =

max(i,j) si si= inferΓ(A) avec s ∈ {⋆, } et ⋆j = inferΓ,x:A(B)

sinon

Cet algorithme traite les abstractions et les applications en distinguant deux cas : les abstrac-tions/applications de type (dans le cas où le domaine de l’abstraction est égal à ⋆i ou dans le cas où l’argument de l’application appartient à InhabΓ(⋆i)).

Programmation. On peut représenter les entiers en suivant l’encodage habituel des entiers de Church paramétré par le niveau du type. Si n est un entier, on notera ni l’expression

λα : ⋆i, f : α → α, x : α.

n fois

z }| {

f (f · · · (f x) · · · )

et on notera nati son type principal, c’est-à-dire :

nati = ∀α : ⋆i.(α → α) → α → α On a ⊢ nati: ⋆i+1et, pour tout entier n, la règle suivante est admissible :

⊢ ni : nati

On peut implémenter la fonction retournant le successeur des entiers : succi : nati→ nati

succi = λn : nati, α : ⋆i, f : α → α, x : α.f (n α (f x)) succi ni D n + 1i

Et on peut itérer cette fonction via l’encodage des entiers pour implémenter l’addition : plusi : nati+1→ nati → nati

plusi = λn : nati+1.n nati succi plusi ni+1mi D n + mi

On note au passage que le niveau du type de l’argument sur lequel on effectue l’itération doit être incrémenté pour que le terme soit bien typé. On peut alors voir les entiers de type nati comme étant des entiers que l’on peut utiliser pour construire par itération d’une fonction des entiers de niveau strictement inférieur à i.

On utilise alors les fonctions coercionj

i pour j < i afin de plonger la représentation d’un entier vers un niveau inférieur :

coercionji : nati→ natj

coercionji = λn : nati, α : ⋆j, f : α → α, x : α.n α f x coercionji ni D nj

On remarque que si on accepte “d’ouvrir la représentation des entiers” (en introduisant à gauche la quantification de type), on peut parvenir à implémenter certaines opérations avec un type plus souple. Comme par exemple pour l’addition :

plusi : nati → nati → nati

plusi = λn m : nati, α : ⋆i, f : α → α, x : α.n α f (m α f x) plusi nimi D n + mi

De même pour la multiplication :

multi : nati→ nati→ nati

multi = λn m : nati, α : ⋆i, f : α → α, x : α.n α (m α f ) x multi nimi D n × mi

L’implémentation de l’exponentiation est un peu plus difficile, mais l’idée est la même : il faut repousser le plus tard possible l’utilisation de l’abstraction de type.

expi : nati → nati→ nati expi = λn : nati, m : nati, α : ⋆i.

m ((α → α) → α → α)

(λk : (α → α) → α → α, f : α → α.n α (k f)) (λf : α → α, x : α.f x)

expi nimi D nmi

La fonction qui permet de représenter les tours d’exponentielles de hauteur arbitraire peut être implémentée par le terme ci-dessus de type nati+1→ nati → nati.

toweri : nati+1→ nati→ nati

toweri = λn : nati+1, m : nati.n (nati) (expi 2i) m toweri ni+1mi D 22...mi

(la tour est de hauteur n)

On verra plus tard qu’on atteint ce qui semble être les limites de l’itération dans ce système, puisqu’on montrera qu’elle ne peut pas être implémentée avec un type de la forme nati → nati→ nati.

On peut également utiliser l’encodage standard pour encoder le produit cartésien à l’aide de la quantification du second-ordre. On notera donc σ ×kτ le type ∀γ : ⋆k.(σ → τ → γ) → γ. On notera que le type du produit doit être indexé par le niveau de la conclusion. On a alors α : ⋆i, β : ⋆j ⊢ α ×kβ : max(k+1,i,j) :

α : ⋆i, β : ⋆j ⊢ ⋆k: k+1

Γ ⊢ α : ⋆i Γ ⊢ β : ⋆i Γ ⊢ γ : ⋆k Γ ⊢ (α → β → γ) → γ : ⋆max(k,i,j) α : ⋆i, β : ⋆j ⊢ α ×kβ : ⋆max(k+1,i,j)

Cette famille de types est alors munie des fonctions de construction et destructions suivantes : proj1i : ∀α β : ⋆i.α ×iβ → α

proj1i = λα β : ⋆i, c : α ×iβ.c α (λx : α, y : β.x) proj2i : ∀α β : ⋆i.α ×iβ → β

proj2i = λα β : ⋆i, c : α ×iβ.c α (λx : α, y : β.y) pairi : ∀α β : ⋆i.α → β → α ×iβ

On notera hA, Bii le terme pairi σ τ A B où σ et τ seront les types principaux de A et B dans le contexte considéré (il peut toujours être inféré). De la même façon, on notera (A)k

i le terme projk i σ τ A quand σ ×iτ sera le type de A. On montre alors facilement que les dérivations de typage suivantes sont admissibles : Γ ⊢ M : τ Γ ⊢ N : σ Γ ⊢ τ : ⋆i Γ ⊢ σ : ⋆i Γ ⊢ hM, Nii: τ ×iσ Γ ⊢ M : τ1×iτ2 Γ ⊢ τ1 : ⋆i Γ ⊢ τ2 : ⋆i Γ ⊢ (M)k i : τk Et on vérifie facilement les règles de réduction suivantes :

(hA1, A2ii)1

iA1 (hA1, A2ii)2

iA2

On peut en déduire par une technique standard une implémentation du prédécesseur sur les entiers : predi : nati+1→ nati

predi = λn : nati+1, α : ⋆i, f : α → α, x : α.

 n (α ×iα) (λc : α ×iα.hf (c)1i, (c)1ii) hx, xi2 i predi n + 1i+1 D ni predi 0i+1 D 0i

Et, en suivant la même technique, on peut implémenter l’itérateur “rec” qui nous donne un schéma de récursion général :

reci : ∀α.(α → nati→ α) → α → nati+2→ α reci = λα : ⋆i, f : α → nati→ α, x : α, n : nati+2.



n (α ×i+1nati)

(λc : α ×i+1nati.hf (c)1i+1(c)2

i+1, succi(c)2 i+1ii+1) hx, 0iii+11 i+1 reci α f x 0i+2 D x reci α f x n + 1i+2 D n + 1 fois z }| { f (f · · · (f x0i) · · · n − 1i) ni

On peut utiliser ce schéma de récurrence pour implémenter des schémas de produit, de somme et de “tétration” bornés :

sumi : (nati→ nati) → nati+2→ nati

sumi = λ(f : nati→ nati)(n : nati+2). reci nati(λr n : nati. plusi r (f n))0i n sumi fini+2 D f (0) + · · · + f (n − 1)i

prodi : (nati→ nati) → nati+2→ nati

prodi = λ(f : nati→ nati)(n : nati+2). reci nati(λr n : nati. multi r (f n)) 1in prodi fini+2 D f (0) × · · · × f (n − 1)i

treti : (nati→ nati) → nati+2→ nati

treti = λ(f : nati→ nati)(n : nati+2). reci nati(λr n : nati. expi r (f n)) 1in treti fini+2 D f (n − 1)(f (n−2)...f (0))

i

où fi désigne un terme de type nati → nati représentant une fonction numérique f : N −→ N (c’est-à-dire tel que pour tout n, finiDf (n)i).

On ne peut néanmoins pas utiliser le schéma reci pour itérer sur des fonctions qui ne sont pas de la forme α → nati → α. En particulier, on ne peut pas l’utiliser sur la fonction toweri vue plus haut.

Daniel Leivant [Lei91] a prouvé que les fonctions représentables dans ce système sont exactement les fonctions super-élémentaires correspondant au quatrième étage ξ4 de la hiérarchie de Grzegorczyk (voir [Ros] par exemple). Cet ensemble de fonctions est strictement inclus dans l’ensemble des fonctions primitives récursives qui est lui-même strictement plus petit que l’ensemble des fonctions représen-tables dans système F. En particulier, la fonction d’Ackermann ack, connue pour ne pas être primitive récursive, est représentable dans système F.