-1-INF 554 Luc MarangetPolymorphismeLuc.Maranget@inria.frhttp://www.enseignement.polytechnique.fr/profs/informatique/Luc.Maranget/TLP/-2-A Polymorphisme.B Inf´erence des types polymorphes.-3-Limitation des types simplesL’identit´e Fun x -> x a plusieurs types.Type principal X -> X.Mais Let id = Fun x -> x In id id n’est pas typable.[id : X -> X]⊢ id; X -> X, ∅ [id : X -> X]⊢ id; X -> X, ∅[id : X -> X]⊢ id id; Y, (X -> X) = ((X -> X) -> Y)Ce qui conduit finalement a` l’´equation X = X -> X, qui n’a pas desolution.Et pourtant, puisque id poss`ede tous les types A -> A, les typessuivants sont possibles pour la premi`ere et la seconde occurrencede id.(Z -> Z) -> (Z -> Z) Z -> ZEt l’application id id a pour type Z -> Z.-4-SolutionAutoriser des instances diff´erentes σ(A) d’un mˆeme type.Enrichir les types :A ∈T A ∈T A∈T1 2Nat∈T X ∈TA -> A ∈T ∀X[A]∈T1 2Ajouter une r`egle « d’´elimination » de ∀.E ⊢t :∀X[A]E ⊢t :A[X 7!B]On parle aussi d’instanciation (de la variable li´ee X).(Il nous faut aussi une r`egle « d’introduction » de ∀, mais laissonscela de coˆt´e pour le moment).-5-En passant...Les types contienent maintenant un lieur (∀), comme les termes(Fun etc.)Ceci complique la d´efinition de la substitution qui doit ´eviter lescaptures des variables libres.F(X) ={X} F(Nat) =∅ F(A -> B) =F(A)∪F(B)F(∀X[A]) =F(A)\{X}Et pour la substitution(∀X[A])[X 7!B] =∀X[A](∀X[A])[Y 7!B] =∀X[A[Y 7!B]] avec X 62F(B) (Gros bug !)-6-Identitit´e ...
◮D´efinir: l e t(>>>)f g=funx->f(g x) comp : (’a -> ’b) -> (’c -> ’a) -> ’c -> ’b
◮Emploi : l e tf= string_of_int>>> (funx->x+2) >>>int_of_string f : string -> string
f"5" - : string = "7"
-8-
Structuresdedonn´eespolymorphes
La liste deX(nepye´toesnttu∀’a.)’a listpira´efinml.DenCa deux«tsurcnorseuct»
◮Nil ([]), de type (∀’a.)’a list.
◮Cons (::), de type (∀’a.)’a-> ’a list-> ’a list.
Toutes les fonctions qui ne«regardent pas»directement les ´ele´ments(detype’a) sont polymorphes. l e t rec f y0 xsfold right=matchxswith _ | [] ->y0 |x::xs->f x(fold_right f y0 xs) fold_right : (’a -> ’b -> ’b) -> ’b -> ’a list -> ’b
Calculef(x1 f(x2 . . . f(xn y0))). Ou (plus classique) un tri : sort : ’a list -> (’a -> ’a -> bool) -> ’a list
-9-
Int´erˆetthe´oriquedupolymorphisme
Des constructions classiques duλat`r´CFuiedluP(accl-Fun, application et variables) sont typables.
Par exemple, l’encodage suivant des entiers, montre que nos constantesetop´erateurssurlesentierssontinutiles(dumoinsen the´orie).
◮Les entiers (dits de Church) Letzero=Funf->Funx->x Letun=Funf->Funx->f x . . .
L’entiernest le terme
Funf ->Funx -> f(f (f x)) { } noitacilpapsn
◮Le type des entiers estN=∀X[(X -> X) -> X -> X].
-10-
Type des entiersN=∀X[(X -> X) -> X -> X]
Certaines primitives (toutes ?) sur les entiers sont alors typables:
◮uSccseesur Letsucc=Funn->Funf->Funx->n f(f x)
TypeN -> N.
◮Addition et multiplication.
Letadd= Funn1->Funn2-> Funf->Funx->n1 f(n2 f x) Letmul= Funn1->Funn2-> Funf->Funx->n1(n2 f)x
De typesN -> N -> N.
-11-
Introduction du∀
Revenons sur le typage desucc
N=∀X[(X -> X) -> X -> X]
E⊢n:N
Z -> Z)-
E⊢n: (Z -> Z)-> Z -> ZE⊢f:Z -> Z
E⊢(n f) :Z -> Z
[n:N;f:Z -> Z;x:Z]⊢n f (f x):Z
.
E⊢(f x) :Z
[n:N;f:Z -> Z]⊢(Fun f (f x)x -> n) :Z -> Z
[n:N]⊢(Funf ->Funx -> n f (f x)) :(Z -> Z) -> Z -> Z