Polymorphisme
Delia Kesner (Université Paris Diderot) Typage 2018 1 / 16
Motivations
Décrire le comportement d'une opération de façon générale, i.e. de façon indépendante de la nature (ou type) de ses paramètres.
Employer une même opération avec plusieurs types diérents. Ceci rend le programme plus claire et plus succint.
Faciliter la réutilisation.
Faire porter le même nom à des opérations qui se "ressemblent" d'un point de vue sémantique.
Les diérentes formes du polymorphisme
Polymorphisme ad-hoc ou surcharge Polymorphisme d'inclusion ou sous-typage Polymorphisme paramétrique ou générique
Delia Kesner (Université Paris Diderot) Typage 2018 3 / 16
Le polymorphisme ad-hoc
Dans les langages orientés objet ⇒ dénir des méthodes de même nom dans deux classes indépendantes.
Dans les langages procéduraux ⇒ dénir deux fonctions de même nom mais ayant des paramètres diérents (type ou nombre).
Exemple : Opérateur +pour réaliser l'addition entre deux nombres complexes,entiersou réels.
Diculté : Pour chaque utilisation de l'opérateur le compilateur doit décider quel code exécuter.
Le polymorphisme d'inclusion
Denition
Un type A0 est un sous-type(ou est inclusdans) un type A si n'importe quelle opération dénie sur A est aussi dénie sur A0.
Intuition : Un objet de type A0 peut remplacer sans danger un objet de type A.
Sous-typage entre objets :
Soient A=<m1 :A1;...;mn:An>et
A0 =<m1:A01;...;mn:A0n;mn+1:Cn+1;...;mk :Ck >. On dit que A0 est un sous-type de A, noté A0≤A, ssi A0i <Ai pour i ∈ {1, ...,n}.
Exemple : Le type colorpointest un sous-type du typepoint.
Delia Kesner (Université Paris Diderot) Typage 2018 5 / 16
Sous-typage dans les appels de fonctions : Si Γ`f :A→B,Γ`M :A0 et A0 ≤A alors fM:B.
Exemple : Le polymorphisme d'inclusion permet de construire des listes hétérogènes où chaque élément est sous-type du type des éléments de la liste. Ainsi, on peut construire une liste de points (de couleur ou pas) et appliquer une fonction sur cette liste.
Le polymorphisme paramétrique
Motivation :
Plusieurs fonctions identité :
Idint :int →int,Idbool :bool →bool, Idint→int : (int→int)→(int→int), . . .
Plusieurs fonctions pour rajouter un élément à une liste : Ajint :int×list(int)→list(int),
Ajbool :bool ×list(bool)→list(bool), . . .
Delia Kesner (Université Paris Diderot) Typage 2018 7 / 16
Idée:
Id :∀α.α→α et donc Idint =Id[int] Idbool =Id[bool]
Idint→int =Id[int→int]
Remarque : Ce qui caractérise le polymorphisme paramétrique est la relation d'instantiation qui existe entre le type général de la fonction polymorphe α, et le type particulier de chaque spécialisation
int,bool,int →int.
Le polymorphisme à la Girard-Reynolds
Types :A::=T |α|A×A|A→A|∀α.A Notation : ∀α∀β.A=∀(α, β).A.
Expressions :
M ::= x |cte | hM,Mi |M M |
λx :A.M |let x :A=M in M | M[A]|Λα.M
Delia Kesner (Université Paris Diderot) Typage 2018 9 / 16
Règles de réduction
(λx :A.M)N ⇒ M{x/N} let x :A=N in M ⇒ M{x/N}
x M ⇒ M (x M)
fsthM,Ni ⇒ M
sndhM,Ni ⇒ N
if true then M else N ⇒ M if false then M else N ⇒ N (Λα.M)[A] ⇒ M{α/A}
Exemple
Id = Λα.λx :α.x
(Id[int]) ⇒ λx :int.x
(Id[int])3 ⇒ (λx :int.x)3⇒3
Delia Kesner (Université Paris Diderot) Typage 2018 11 / 16
Denition
Les variables libres d'un typesont dénies par : VarLib(T) = ∅
VarLib(α) = {α}
VarLib(∀α.A) = VarLib(A)\ {α}
VarLib(A×B) = VarLib(A)∪VarLib(B) VarLib(A→B) = VarLib(A)∪VarLib(B) Un type A estclos ssi VarLib(A) =∅.
Exemple : VarLib(β →(∀α.α×γ)) ={β, γ} et ∀α∀β.(α→β) est clos.
Règles du typage polymorphe à la Church
L'ensemble devariables libres d'un environnement est donné par VarLib(Γ) =S
x∈ΓVarLib(Γ(x)).
Pour obtenir les règles du typage polymorphe à la Church on rajoute aux règles monomorphes :
Γ`M :A α /∈VarLib(Γ) Γ`Λα.M :∀α.A
Γ`M :∀α.A Γ`M[B] :A{α/B}
Delia Kesner (Université Paris Diderot) Typage 2018 13 / 16
Exemple :
x :α`x :α
`λx :α.x :α→α
`Λα.λx :α.x :∀α.(α →α)
`(Λα.λx :α.x)[int] :int →int 3:int
`((Λα.λx :α.x)[int])3:int
Algorithme de typage
Étant donné un terme M, leproblème de l'inférence de types consiste à savoir si ∃Γ et∃A t.q. Γ`M :A.
Théorème : (Schubert) Le problème de l'inférence de types dans le système de Girard estindécidable.
Idée :Réduire la grammaire de types→ polymorphisme à la ML.
Delia Kesner (Université Paris Diderot) Typage 2018 15 / 16
Le polymorphisme à la ML
Type matrice : M ::=T |α|M×M |M →M Type : S ::=∀α1. . .∀αn.M
Un type matrice est un cas particulier de type.
Expressions : Comme les expressions à la Curry
Typage de constantes
TC(+) : int×int →int TC(fst) : ∀(α, β).(α×β)→α TC(snd) : ∀(α, β).(α×β)→β TC(ifthenelse) : ∀α.(bool ×α×α)→α TC(x) : ∀α.(α→α)→α
Delia Kesner (Université Paris Diderot) Typage 2018 17 / 16
Instances d'un type
Denition
Le type Aest une instance du type ∀(α1, . . . , αn).B, noté A≤ ∀(α1, . . . , αn).B ssi ils existent C1, . . . ,Cn t.q.
A=B{α1, . . . , αn/C1, . . . ,Cn}.
En particulier, pour n=0, on a A≤B ssi A≡B.
Exemple :
int →int ≤ ∀α.α→α bool →int≤ ∀(α, β).α→β bool →int6≤ ∀α.α→α
Généralisations d'un type
Denition
L'opérateur Gen est donné par Gen(A,Γ) =∀(α1, . . . , αn).A, où {α1, . . . , αn}=VarLib(A)\VarLib(Γ).
Exemple : SoitA=α→β et Γ=x :β,y :∀α.α. Alors Gen(A,Γ) =∀α.α→β.
Delia Kesner (Université Paris Diderot) Typage 2018 19 / 16
Règles du typage polyomorphe à la Curry
A≤Γ(x) Γ`x :A
A≤TC(cte) Γ`cte :A Γ`M :A→B Γ`N :A
Γ`M N :B
Γ,x :A`M :B Γ`λx.M :A→B
Γ`M :A Γ`N :B Γ` hM,Ni:A×B
Γ`M :A Γ,x :Gen(A,Γ)`N :B Γ`let x =M in N :B
Exemple de dérivation
Soit A=∀α.α→α
y :α`y :α
`λy.y :α→α
int →int≤A
f :A`f :int →int f :A`1:int f :∀α.α→α`f 1:int
`let f =λy.y in f 1:int
Delia Kesner (Université Paris Diderot) Typage 2018 21 / 16
Propriétés
(Stabilité) : SiΓ,x :∀(α1, . . . , αn).B `M :A et Γ`N :B, alors Γ`M{x/N}:A.
(Préservation): SiΓ`M :A et M ⇒M0, alorsΓ`M0 :A.
Inférence de types polymorphes
Soit M ≡let x =λy.y in x.
On considère l'ensemble d'équations : {αM .
=αx, αx .
=Gen(αB,∅), αB .
=αy →αy} où αB est le type de B ≡λy.y.
Si l'on traite la deuxième équation on obtientαx ≡ ∀αB.αB,incorrect car αx doit être un type fonctionnel.
Delia Kesner (Université Paris Diderot) Typage 2018 23 / 16
Vers un algorithme de typage : notations
Soit Γ =x1:A1, . . . ,xn:An un environnement et soitσ une substitution de types. Alors σ(Γ)=x1:σ(A1), . . . ,xn:σ(An).
On note inst(∀(α1, . . . , αn).A) le type A{α1, . . . , αn/β1, . . . , βn}, où β1, . . . , βn sont de variablesfraiches.
Sécication de l'algorithme
Entrée : Un environnementΓet un terme M t.q. FV(M)⊆Γ.
Sortie: Un type A et une substitutionσ t.q.σ(Γ)`M :A.
Delia Kesner (Université Paris Diderot) Typage 2018 25 / 16
Algorithme de Damas-Milner-Tofte
W((∆,x :A),x) = (inst(A),id)
W(∆,cte) = (inst(A),id)où A est le type de la constante cte
W(∆,λx.N) = (ρ(α)→B, ρ), où W((∆,x :α),N) = (B, ρ)et α est une variable fraiche
W(∆,N L) = (µ(α), µ◦ρC ◦ρB), où W(∆,N) = (B, ρB), W(ρB(∆),L) = (C, ρC),α est une variable fraiche et µ=MGU(ρC(B) .
=C →α)
W(∆,hN,Li) = (ρC(B)×C, ρC ◦ρB), W(∆,N) = (B, ρB), W(ρB(∆),L) = (C, ρC)
W(∆,let x =N in L) = (C, ρC◦ρB), où W(∆,N) = (B, ρB), W((ρB(∆),x :Gen(B, ρB(∆))),L) = (C, ρC).
Premier exemple
W(∅, λx.x +x)= (int →int,{α/int, β/int}) W(x :α,x +x)= (int,{α/int, β/int}) W(x :α,+) = (int×int →int,id) W(id(x :α),hx,xi)= (α×α,id) W(x :α,x) = (α,id)
MGU(int×int →int .
=α×α→β) ={α/int, β/int}
Delia Kesner (Université Paris Diderot) Typage 2018 27 / 16
Deuxième exemple
W(∅,let f =λx.x in f 2)= (int,{β/int, γ/int}) W(∅, λx.x)= (α→α,id)
W(x :α,x) = (α,id)
W(f :∀α.α→α,f 2)= (int,{β/int, γ/int}) W(f :∀α.α→α,f) = (β →β,id)
W(f :∀α.α→α,2) = (int,id) MGU(β →β .
=int→γ) ={β/int, γ/int}
Propriétés de l'algorithme
Théorème : (Correction) Si W(∆,M) = (A, σ), alorsσ(∆)`M :A.
Théorème : (Complétude) Siτ(∆)`M :B, alors W(∆,M) = (A, σ), où B est une instance de A et τ est une instance de σ
Corollaire : ∅ `M :A ssi W(∅,M) = (B, σ) et A est une instance de B.
Delia Kesner (Université Paris Diderot) Typage 2018 29 / 16