• Aucun résultat trouvé

Extension aux types inductifs

2.1 Syntaxe et définitions

2.1.1 Définition (Système de types cumulatifs avec inductif)

On appellera système de types cumulatifs avec inductif (CTSI en abrégé), la donnée P de : – Un CTS (SP, AP, RP, CP),

– D’un ensemble IP d’identifiants des inductifs,

– D’un ensemble EP ⊆ IP× SP qui décrira l’ensemble des éliminations autorisées, – À chaque identifiant d’inductif I ∈ I, on associera :

– Un entier p qui désignera le nombre de paramètres,

– Une famille de p termes Q1, . . . , Qp désignant les types des paramètres, – Un terme A que l’on appelle l’arité de I,

– Un entier k qui désignera le nombre de constructeurs,

– Une famille de k identifiants c0, . . . , ck de constructeurs frais,

– Un ensemble ordonné de termes C1, . . ., Ck qui désigneront les types respectifs de chacun des constructeurs.

Et on note cette association Ind(x1 : Q1, . . . , xp : Qp, I : A, c0 : C0, . . . , ck : Ck). On demandera de plus que les identifiants de constructeurs soient associés à au plus un identifiant d’inductif.

On étend de plus les termes par la grammaire suivante : A, B, ... := · · · | I[−→ P ] nom | c[−→ P ] constructeur | fixf : A,−−−→ x : B.M point-fixe | caseI(M, P , λ−−−→ y : B, i : C.T, −−−−−−→ λ−−−→

z : E.F ) analyse par cas

où x parcourt un ensemble de variables V, I l’ensemble des noms de types inductifs I, c parcourt l’ensemble des identifiants de constructeurs. On notera simplement I et c pour désigner les identifiants I[] et les constructeurs c[] des inductifs sans paramètre.

Notation vectorielle. La notation vectorielleA désigne une famille finie A1, . . ., Anque l’on notera égalementAnpour spécifier sa taille. On imbriquera parfois cette notation pour désigner les familles de familles de termes. Par exemple, les expressions de la forme caseI(M,Pp, λ−−−→

y : Bn, i : C.T, −−−−−−−→ λ−−−→ z : Em.F k ) se déplient en : caseIM, P1, . . . , Pp, λy1 : B1, . . . yn: Bn, i : C.T, λz1,1: E1,1, . . . , z1,m1 : E1,m1.F1, .. . λzk,1: Ek,1, . . . , zk,mk : Ek,mk.Fk

Cette notation est également étendue aux substitutions ; ainsi, on notera M[Nn/−xn] les substitutions successives M[N1/x1, . . . , Nn/xn].

Nouvelles règles de réduction. Nous étendons la relation de réduction (et donc de conversion) aux règles suivantes :

– La règle de réduction qui permet de réduire case vers la branche correspondant au constructeur analysé : caseI(cj[Pp]Mmj,−→ Qp, λ−−−→ y : Bn, i : C.T, −−−−−−−→ λ−−−→ z : Em.F k ) ⊲ Fj[Mmj/−zmj] – La règle de réduction du point-fixe :

((fix f : A,−−−→x : Bl+1.M ) −→

Nl+1) ⊲ M[fix f : A,−−−→x : Bl+1.M/f,−→

Nl+1/−xl+1]

Puis, nous définissons également deux notations qui permettent d’instancier l’arité et les constructeurs avec une valeur concrète de paramètres. Dans le cas où I est un inductif Ind(x1 : Q1, . . . , xp : Qp, I : A, c0: C0, . . . , ck: Ck) on notera :

ArityI(Pp) = A[Pp/−xp] ConstrjI(Pp) = Cj[Pp/−xp]

(Γ ⊢ Pi : Qi[P1/x1, · · · , Pi−1/xi−1] )i=1...p

p > 0 ∨ Γ = hi Inductif

Γ ⊢ I[Pp] : ArityI(Pp) (Γ ⊢ Pi : Qi[P1/x1, · · · , Pi−1/xi−1] )i=1...p

p > 0 ∨ Γ = hi Constructeur Γ ⊢ cj[Pp] : Constrj I(Pp) Γ ⊢ M : I[Pp]Gn Γ,−−−→y : Bn, i : I[−→ Pp] −yn⊢ T : r  Γ,−−−→z : Ej mj ⊢ Fj : T [Dj n /−yn , cj[Pp] −zmj /i] j=1...k (*) Case Γ ⊢ caseI(M,Pp, λ−−−→ y : Bn, i : I[−→ Pp] −yn.T, −−−−−−−→ λ−−−→ z : Em.F k ) : T [Gn/−yn , M/i]

Où (*) est la condition suivante :

(I, r) ∈ E

k est le nombre de constructeurs de I ArityI(Pp) = ∀−−−→y : Bn.s

ConstrjI(Pp) = ∀−−−→z : Ej mj

.I[−→ Pp] Dj Figure 2.1 – Les règles des types inductifs.

Γ, f : A ⊢ λ−−−→x : Bl+1.M : A

f est gardé Point-Fixe Γ ⊢ fix f : A,−−−→x : Bl+1.M : A

Et on ajoute également les quatre règles de typage présentées dans les figures 2.1 et 2.2. La règle Caseà k+2 prémisses est particulièrement difficile à lire, cette règle est paramétrée par E ; ce paramètre permet donc de restreindre les utilisation de case selon l’inductif détruit et la sorte du type de retour de chacune des branches. Le lecteur qui n’est pas habitué au typage des inductifs pourra commencer par lire la sous-section 2.2où nous détaillons quelques exemples. Les règles Inductif et Constructeur ont p prémisses, il est de plus nécessaire de rajouter la contrainte Γ = hi dans le cas où p = 0 pour éviter la dérivation de séquent dont le contexte est mal-formé.

Remarque sur les lieurs dans la règle case. La syntaxe de la construction case peut paraître surprenante au premier abord car elle contient des lieurs explicites. Bien que nous ayons utilisé le symbole λ, la règle de typage Case ne requiert pas que ces “pseudo-abstractions” soient typables par un produit autorisé. De la même façon, nous pouvons alors voir la notation c[·] comme une “pseudo-application” ne vérifiant pas que le produit ∀−−−→x : Qp.A est autorisé, dans ce type, A désigne l’arité de l’inductif associée au constructeur.

Néanmoins, dans les systèmes qui vérifient la propriétéFULL, on peut présenter les inductifs en rem-plaçant ces “pseudo-applications” et ces “pseudo-abstractions” par des applications et des abstractions puis, en remplaçant la règle Case par la règle ci-dessous :

Γ ⊢ M : IPp−→ Gn Γ ⊢ T : ∀−−→y : An.I−→ Pp−→yn → r  Γ ⊢ Fj : ∀−−−→z : Ejmj.T−→ Djn(cjPp−→zmj) j=1...k Γ ⊢ caseI(M,Pp, T,−→ Fk) : TGnM

Bonne formation des inductifs Les inductifs sont rajoutés au système incrémentalement, c’est pourquoi nous introduisons la définition suivante :

2.1.2 Définition (Ajout d’une déclaration d’inductif)

Soient P un CTSI et I 6∈ IP, c0, . . . , ck k identifiants frais, et soient Q0, . . ., Qp, A, C0, . . . , Ck p + k + 1 termes de P, on notera

P + Ind(x1 : Q1, . . . , xp : Qp, I : A, c0 : C0, . . . , ck : Ck)

le CTSI P obtenu en posant IP = IP∪{I} et en associant dans P à I la déclaration : Ind(x1: Q1, . . . , xp : Qp, I : A, c0 : C0, . . . , ck: Ck)

On dira qu’un CTSI est bien-formé s’il existe un façon d’ordonner les inductifs afin de les définir les uns après les autres de façon à ce que l’arité et les types des constructeurs soient bien typés et de la bonne forme.

2.1.3 Définition (CTSI bien-formé)

– Cas fini : Soit P un CTSI tel que I est fini. On définit le fait que P soit bien formé par récurrence sur la taille de I :

– S’il existe I ∈ I et P bien formé tel que P se décompose en

P = P+ Ind(x1 : Q1, . . . , xp : Qp, I : A, c1: C1, . . . , ck: Ck) et que

1. Si on note ΓP le contexte x1 : Q1, . . . , xp : Qp, alors A est un type bien formé de P dans le contexte ΓP (c’est-à-dire WFΓP(A)).

2. A de la forme ∀−−−→y : Bn.s, on dira alors que A est une arité de sorte s et que I est un inductif de sorte s.

3. pour tout j, Cj est de la forme C

j[I[−xp]/αI] avec I n’apparaissant pas dans C

j. On demande également à ce que C

j soit un type bien formé de P et de sorte s dans le contexte ΓP, αI : A, c’est-à-dire ΓP, αI : A ⊢P C

j : s. On substitue ici les occurrences de I[·] par une variable de type αI car l’inductif I n’est pas encore déclaré comme un inductif bien formé.

4. pour tout j, Cj aura la forme

−−−→y : Ej mj

.I[−xp]Dj n

où I ne peut apparaître à l’intérieur de Ej que comme une conclusion. Cette restriction s’appelle la condition de stricte positivité. En pratique, cette condition sera suffisante pour garantir la monotonicité de l’opérateur de type dont on prend implicitement le point fixe lorsque que l’on introduit un nouveau type inductif (voir par exemple [CP88,Wer94, Coq04]).

– Cas général : On dira que P est bien formé si pour tout I ∈ I il existe un ensemble fini I ⊆ I contenant I tel que P restreint à I soit bien formé.

On remarque que notre présentation traite uniquement les inductifs définis dans un contexte vide. Nous pourrions l’étendre facilement pour prendre en compte les définitions des types inductifs dans un contexte non vide, mais cela alourdirait les notations qui sont déjà bien assez complexes. Cette présentation n’en est pas moins générale, puisqu’il est toujours possible d’ajouter le contexte dans les paramètres des types inductifs. De plus, notre cadre ne permet pas de prendre en compte les inductifs mutuellement définis ; cela pourrait aisément être fait au prix d’un nouvel alourdissement des notations (voir par exemple le manuel de Coq [Coq04] pour une présentation des inductifs mutuellement définis). 2.1.4 Convention

Par la suite, nous ferons systématiquement l’hypothèse que les CTSI que l’on considère sont bien formés.

Nous nous permettrons donc d’énoncer des lemmes sans expliciter le fait que nous nous plaçons dans un CTSI bien formé. Comme dans l’exemple suivant :

2.1.5 Lemme

Si Ind(x1: Q1, . . . , xp : Qp, I : A, c1 : C1, . . . , ck: Ck), alors 1. WFx1:Q1,...,xp:Qp(A)

2. A est de la forme ∀−−−→ y : Bn.s

3. pour tout j, x1 : Q1, . . . , xp: Qp ⊢ Cj : s, 4. pour tout j, Cj est de la la forme

−−−→y : Ejmj.I[−xp]Djn

où I ne peut apparaître à l’intérieur de Ej que comme une conclusion.

Démonstration Il s’agit d’une conséquence directe de la définition précédente, et aussi du fait qu’en ajoutant des éléments dans I, on ne type pas moins de termes (on a également besoin d’invoquer le lemme de substitution pour prouver que x1 : Q1, . . . , xp : QpP Cj : s à partir de x1 : Q1, . . . , xp : Qp, αI : A ⊢P Cj[I[−xp]/αI] : s mais sa preuve ne pose aucun problème). , Condition de garde pour la construction fix. On dira que fix f : A,−−−→x : Bl, i : C.M vérifie la condition de garde si M satisfait un critère syntaxique assurant que :

– C est un type inductif complètement appliqué (c’est-à-dire de la forme I[Pp]Dn), et

– les appels récursifs à l’intérieur de M sont de la forme fTk(yQ ) où y est une variable introduite par une suite de destructions de x.

Moralement y est “structurellement plus petit que x”, ce qui devrait assurer la terminaison de la fonction ainsi définie. On trouvera une formalisation plus rigoureuse de cette décroissance dans [Gim94] (bien qu’elle ne soit plus vraiment fidèle aux critères plus généraux implémentés aujourd’hui dans l’assistant de preuve Coq).