• Aucun résultat trouvé

Théorie des types inductifs

Dans le document Typage et contrôle de la mobilité (Page 57-62)

Nous avons étudié jusqu’à maintenant les propriétés des types coinductifs. Mais les types qui apparaissent explicitement dans les processus et systèmes sont bien entendu toujours des types inductifs, afin de pouvoir être décrits de façon finie, avec des récurseurs. Nous allons donc prouver que les propriétés données sur les types coinductifs peuvent être ramenées au niveau des types inductifs en plusieurs étapes : définition de règles inductives pour le sous-typage et les opérateurs u et t ; identification d’une caractéristique-clef des types inductifs ; et enfin preuve de la coïncidence des versions coinductive et inductive du sous-typage et des opérateurs u et t, en utilisant la caractéristique-clef.

On se donne donc des systèmes de règles d’inférence permettant de prouver le sous-typage et de calculer les bornes inférieures et supérieures directement sur les types inductifs. Ces règles prennent la forme Σ ` T1 <: T2 ou Σ ` T1u T2 = T3. L’intuition de ces jugements est de rajouter une « mémoire », Σ, pour prendre en compte les récurseurs : des jugements déjà prouvés sont accumulés dans cette mémoire pour éviter de boucler dans l’application des règles d’inférence. Ces ajouts dans la mémoire sont opérés par les règles autorisant le dépliage des récurseurs dans les types. À part ces règles de dépliage, les règles correspondent cas par cas aux définitions des fonctions Sub et MeetJoin. Les règles de sous-typage inductif sont données à la figure 2.4, celles de calcul des bornes inférieure et supérieure sont données aux figures 2.5 et 2.6. Concernant les canaux, de nombreuses règles sont nécessaires. Ainsi, figure 2.4, la règle (sr-canal) condense tous les cas mais l’hypothèse complète Σ ` Tw2 <: Tw1 <: Tr1 <: Tr2 n’est utile que pour déduire Σ ` rwhTr

1, Tw1i <: rwhTr2, Tw2i. Seules les parties utiles de cette prémisse sont requises pour les autres conclusions : par exemple Σ ` Tw

2 <: Tw1 <: Tr1 suffit à déduire Σ ` rwhTr1, Tw1i <: whTw2i. De façon similaire, figures 2.5 et 2.6, seuls quelques cas sont donnés, mais la formulation exacte des cas manquants est très facile à extraire de la définition de MeetJoin. On a donc deux façons d’obtenir un résultat comme T1 <: T2 quand les types T1et T2 sont inductifs : montrer que unfold(T1) <: unfold(T2) en utilisant la définition coinductive du sous-typage ; ou prouver le résultat ` T1 <: T2 directement à l’aide des règles d’inférence pour le sous-typage inductif. Il en va de même pour les bornes supérieures et inférieures. Afin de résoudre ce dilemme, vérifions que ces deux solutions coïncident. Ces preuves de coïncidence reposent

Fig. 2.4 Règles inductives de sous-typage

(sr-ax) Σ, T1 <: T2` T1<: T2 (sr-loc) Σ ` loc <: loc

(sr-canal) Σ ` Tw 2 <: Tw1 <: Tr1<: Tr2 Σ ` rwhTr1, Tw1i <: rwhTr2, Tw2i Σ ` rwhTr 1, Tw1i <: whTw2i Σ ` rwhTr1, Tw1i <: rhTr2i Σ ` whTw1i <: whT w 2i Σ ` rhTr1i <: rhTr2i (sr-uplet) Σ ` Ti<: T0i pour tout i Σ ` (~T) <: ( ~T0) (sr-dep) Σ ` T1<: T2 Σ `P ~x : ~loc. T1<:P ~x : ~loc. T2 (sr-canal-loc) Σ ` C1<: C2 Σ ` C1@s <: C2@s (sr-rec-g) Σ, rec Y. T1<: T2` T1{rec Y. T1/Y} <: T2 Σ ` rec Y. T1<: T2 (sr-rec-d) Σ, T1<: rec Y. T2` T1<: T2{rec Y. T2/Y} Σ ` T1<: rec Y. T2

intuitivement sur un dépliage de la preuve inductive pour obtenir une preuve coinductive, et inversement sur un repli de la preuve coinductive en y trouvant les cycles. L’argument autorisant ce repli vient du fait que les types arborescents correspondant à des types inductifs sont réguliers, et que le nombre de sous-arbres différents d’un arbre régulier, même infini, est fini. Cet argument sera appliqué à un ensemble de sous-termes d’un type inductif afin de garantir que la preuve inductive construite par la preuve est effectivement finie.

Définition 2.19 (Sous-termes d’un type inductif). L’ensemble des sous-termes

d’un type inductif est SousTermes(T) où SousTermes est la fonction associant à T le plus petit ensemble de types inductifs tel que les équations suivantes soient vérifiées :

SousTermes(rhTri) = {rhTri} ∪ SousTermes(Tr)

SousTermes(whTwi) = {whTwi} ∪ SousTermes(Tw)

SousTermes(rwhTr, Twi) = {rwhTr, Twi} ∪ SousTermes(Tr) ∪ SousTermes(Tw)

SousTermes(loc) = {loc}

SousTermes(C@s) = {C@s} ∪ SousTermes(C)

SousTermes((T1, . . . , Tn)) = {(T1, . . . , Tn)} ∪SiSousTermes(Ti)

SousTermes(P ~x : ~loc. T) = {P ~x : ~loc. T} ∪ SousTermes(T)

SousTermes(rec Y. T) = {rec Y. T} ∪ SousTermes(T{rec Y. T/Y})

La définition du cas récursif, le type rec Y. T, repose directement sur la définition de la fonction sur le type T{rec Y. T/Y}. Ce choix ne pose pas de

Fig. 2.5 Règles inductives pour u (meet-ax) Σ, T1u T2 = T3` T1u T2= T3 (meet-canal-r-r) Σ ` Tr1u T r 2= T r 3 Σ ` rhTr 1i u rhTr2i = rhTr3i . . . (meet-canal-rw-rw) Σ ` Tr1u T r 2= T r 3 Σ ` T w 1 t T w 2 = T w 3 ` T w 3 <: T r 3 Σ ` rwhTr1, Tw1i u rwhTr2, Tw2i = rwhTr3, Tw3i

(meet-loc) Σ ` loc u loc = loc

(meet-uplet) Σ ` Tiu T 0 i= T 00 i Σ ` (~T) u (~T0) = (~T00) (meet-dep) Σ ` T1u T2= T3

Σ `P ~x : ~loc. T1uP ~x : ~loc. T2=P ~x : ~loc. T3

(meet-canal-loc) Σ ` C1u C2= C3 Σ ` C1@s u C2@s = C3@s (meet-rec-1) Σ, rec Y. T01u T2= T3` T 0 1{rec Y. T 0 1/Y} u T 2= T3 Σ ` rec Y. T01u T2= T3 (meet-rec-2) Σ, T1u rec Y. T02= T3` T1u T02{rec Y. T 0 2/Y} = T3 Σ ` T1u rec Y. T02= T3 (meet-rec-3) Σ, T1u T2= rec Y. T03` T1u T2= T03{rec Y. T 0 3/Y} Σ ` T1u T2= rec Y. T03

problème majeur dans la mesure où l’on donne la définition d’une fonction et non d’un algorithme et que pour tout type T, SousTermes(T) est défini comme le plus petit point fixe vérifiant les équations de définition de SousTermes. Ainsi, si on considère le type rec Y. T et que T ne contient pas de récurseur, on se convainc aisément que les équations de définition de SousTermes imposent que SousTermes(rec Y. T) soit une union de singletons et, éventuellement, de SousTermes(rec Y. T). Par exemple,

SousTermes(rec Y. rhYi) =

{rec Y. rhYi} ∪ {rhrec Y. rhYii} ∪ SousTermes(rec Y. rhYi) Sous cette forme développée, le plus petit ensemble vérifiant l’équation devient évident, {rec Y. rhYi} ∪ {rhrec Y. rhYii} dans l’exemple. Par induction dans le cas où T contient d’autres récurseurs, on obtient simplement le fait que l’ensemble des sous-termes de rec Y. T est fini.

Cette notion permet de prouver les deux propositions suivantes.

Fig. 2.6 Règles inductives pour t (join-ax) Σ, T1t T2= T3` T1t T2= T3 (join-canal-r-r-r) Σ ` Tr1t T r 2= T r 3 Σ ` rhTr 1i t rhTr2i = rhTr3i . . . (join-canal-rw-rw-rw) Σ ` Tr 1t Tr2= Tr3 ` Tw 1 <: Tr1 Σ ` Tw 1 u Tw2 = Tw3 ` Tw 2 <: Tr2 Tr1↑Tr 2 Tw1↓Tw2 Σ ` rwhTr 1, Tw1i t rwhTr2, Tw2i = rwhTr3, Tw3i (join-loc) Σ ` loc t loc = loc (join-uplet) Σ ` Tit T0i= T 00 i Σ ` (~T) t (~T0) = (~T00) (join-dep) Σ ` T1t T2= T3

Σ `P ~x : ~loc. T1tP ~x : ~loc. T2=P ~x : ~loc. T3

(join-canal-loc) Σ ` C1t C2= C3 Σ ` C1@s t C2@s = C3@s (join-rec-1) Σ, rec Y. T01t T2= T3 ` T 0 1{rec Y. T 0 1/Y} t T 2= T3 Σ ` rec Y. T01t T2= T3 (join-rec-2) Σ, T1t rec Y. T02= T3 ` T1t T02{rec Y. T 0 2/Y} = T3 Σ ` T1t rec Y. T02= T3 (join-rec-3) Σ, T1t T2 = rec Y. T 0 3 ` T1t T2= T 0 3{rec Y. T 0 3/Y} Σ ` T1t T2= rec Y. T03

Proposition 2.20 (Le sous-typage coinductif sur les types inductifs est le

sous-typage inductif). Quels que soient les types inductifs T1 et T2, (unfold(T1), unfold(T2)) ∈ νSub

si et seulement si ` T1<: T2 est prouvable.

La preuve de cette proposition est très similaire à la preuve de la suivante, elle est donc laissée au lecteur.

Proposition 2.21 (Les bornes inférieures et supérieures coinductives sur des

types inductifs sont les bornes inductives). Quels que soient les types inductifs T1, T2 et T3,u(unfold(T1), unfold(T2), unfold(T3)) ∈ νMeetJoin si et seulement

si ` T1u T2= T3 est prouvable. Il en va de même pour t.

Démonstration. Commençons par prouver que l’on peut extraire une preuve de

` T1uT2= T3deu(unfold(T1), unfold(T2), unfold(T3)) ∈ νMeetJoin, et son dual pour t. Considérons pour cela des types T1, T2, et T3et un jeu d’hypothèses Σ0

de la forme T01u T0

2 = T03 ou T01t T20 = T03 où T0i est un sous-terme de Ti et oùu(unfold(T01), unfold(T02), unfold(T03)) out(unfold(T01), unfold(T02), unfold(T03)), suivant le cas, est dans νMeetJoin.

Prouvons que u(unfold(T01)unfold(T02), unfold(T03)) ∈ νMeetJoin implique que Σ0 ` T0

1u T02= T03. Construisons donc la preuve en raisonnant suivant la forme des types T0i. L’ordre bien fondé assurant la terminaison de cette construction est l’ordre lexicographique (|SousTermesT1| · |SousTermesT2| · |SousTermesT3| − |Σ0|, |T0

1| + |T02| + |T03|) où |SousTermesTi| est le cardinal de l’ensemble des sous- termes de Ti et |T01| la taille du type T01.

– Supposons que l’un des T0i soit de la forme rec Y. T. Si T01u T02= T03 est une hypothèse de Σ0, la preuve peut être conclue directement par l’axiome (meet-ax). Sinon, la règle (meet-rec-i) peut être appliquée. La mémoire Σ0 est alors remplacée par Σ0, T01u T0

2= T03 avec |Σ0, T01u T02= T03| > |Σ0|, ce qui garantit la décroissance stricte suivant l’ordre choisi. On peut donc conclure avec l’hypothèse d’induction.

– Si aucun des T0i n’est de la forme rec Y. T, la définition de unfold(T0i) implique que unfold(T0i) et T0ipartagent le même constructeur de tête. Quel que soit le cas de la définition de MeetJoin pour le triplet

u(unfold(T01), unfold(T02), unfold(T03)) on utilise alors la règle qui correspond pour Σ0` T0

1u T02= T03. Regardons un cas typique :

– Si tous les T0i sont de la forme rhT00ii, par définition de MeetJoin, on sait queu(unfold(T001), unfold(T002), unfold(T003)) doit être dans νMeetJoin. |T00

i| < |T0i|, on peut donc utiliser l’hypothèse d’induction pour conclure Σ0 ` T00

1u T002 = T003 d’où les règles (meet-canal-· · · ) donnent Σ0 ` T01u T0

2= T03.

Le raisonnement est similaire pour t.

Réciproquement, considérons une preuve de ` T1u T2= T3et la relation R = {u(unfold(T01), unfold(T02), unfold(T03))

| ∃Σ0 tel que Σ0` T0

1u T02= T03

apparaît dans la preuve de ` T1u T2= T3} ∪ {t(unfold(T01), unfold(T02), unfold(T03))

| ∃Σ0 tel que Σ0` T0

1t T02= T03

apparaît dans la preuve de ` T1u T2= T3}

Prouvons que R est un post-point fixe de MeetJoin. Considérons pour cela un triplet de R et raisonnons sur la dernière règle utilisée pour obtenir le jugement correspondant dans la preuve de ` T1u T2= T3.

(meet-ax) T01u T0

2= T03 doit alors avoir été introduit dans Σ0 par une applica- tion préalable d’une des règles (meet-rec-i) dans la même branche de la preuve. Considérons la première règle au-dessus de cette règle (meet-rec- i) qui ne soit pas elle-même une règle (meet-rec-j). Puisque les types sont contractifs, on sait qu’il en existe une avant la règle axiome. Quelle que soit cette règle, on sait aussi que sa conclusion est de la forme T001u T00

2 = T003 où unfold(T0k) = unfold(T00k), pour k dans {1, 2, 3}, car la définition de unfold(·) impose unfold(rec Y. T) = unfold(T{rec Y. T/Y}). On peut donc appliquer le même raisonnement que dans le cas de cette règle pour prouver que u(unfold(T01), unfold(T02), unfold(T03)) doit être dans R.

(meet-rec-i) Le raisonnement est très similaire au cas précédent : la contrac-

tivité des types assure en effet qu’une règle distincte des (meet-ax) et (meet-rec-j) soit utilisée au-dessus de la série de (meet-rec-j) à laquelle (meet-rec-i) appartient. Puisque les règles (meet-rec-j) ne modifient pas les types coinductifs associés aux types inductifs apparaissant dans le jugement, la « preuve coinductive », c’est-à-dire la déconstruction d’un constructeur de type, peut procéder en suivant le schéma de la première règle non (meet-rec-j) au-dessus de (meet-rec-i).

(meet-canal-r-r) Si T0

1u T02 = T03 est de la forme rhT001i u rhT002i = rhT003i, la preuve de Σ0 ` T0

1 u T02 = T03 contient forcément une preuve de Σ0 ` T00

1 u T002 = T003. Le triplet u(unfold(T001), unfold(T002), unfold(T003)) de R permet alors de conclure que u(unfold(T01), unfold(T02), unfold(T03)) est dans MeetJoin(R).

Tous les autres cas sont similaires.

La coïncidence des deux théories, l’inductive et la coinductive, permet donc de choisir la version la plus intuitive pour chaque preuve. Ainsi, pour de nombreuses preuves comme celles établissant que l’opérateur u calcule effectivement la borne inférieure dans l’ensemble des types ordonné par le sous-typage, l’approche coinductive permet de procéder suivant les intuitions habituelles sur les inductifs, c’est-à-dire par cas suivant la forme des types, sans devoir prendre en compte les récurseurs. L’absence des récurseurs permet aussi d’utiliser directement l’égalité extensionnelle sur les types au lieu d’utiliser une fastidieuse équivalence.

Maintenant que la théorie des types associés aux noms et variables est cohérente et bien établie, intéressons-nous au typage des processus et systèmes qu’elle autorise.

Dans le document Typage et contrôle de la mobilité (Page 57-62)