Postscript réduit compressé | (original compressé) |
Ocaml
Typage des programmes |
Cours | Exercices | |
|
||
|
· | L'évaluation est bloquée (produit une erreur) |
· | Le résultat retourne une valeur, mais celle-ci est incorrecte. |
· | Le programme ne termine pas. |
· | Tous les entiers sont du type int, |
· |
Toutes les chaînes sont du type string, Les booléens sont du type bool, |
· | Les fonctions sont d'un type fonctionnel t ® t. Toutefois, il existe plusieurs types fonctionnles, par exemple int ® int (la fonction successeur) string ® string ® string (la fonction concat), int ® string (la conversion d'un entier en une chaîne), etc. |
t ::= | Valeurs | |||
c | Constantes de type | |||
a | Variable de type | |||
t ® t | Type flèche | |||
c ::= | int, string, ... |
type tvar = int type texp = Tint | Tvar of tvar | Tarrow of texp * texp;; |
libre_texpr : texpr -> tvar list
qui une
liste contenant les variables (de type) libres de son argument
(éventuellement avec des doublons).
libre : tvar -> texp -> bool
où
libre v t
retourne
true
si la variable v
apparaît dans le type t
(i.e. si vÎ vl (t) et false
sinon.
A ::= | Envirommenent de typage | |||
Ø | Environnement vide | |||
x : t, A | Déclaration du type d'une variable |
type tenv = (var * texp) list;; |
libre_tenv : tenv -> tvar list
et
qui retourne les variables libres d'un environnement de typage.
|
|
|
|
|
|
|
|
type subst = (tvar * texp) list;; |
subst_texp : subst -> texp -> texp
qui prend une substitution s
et un type t
et retourne le
résultat de l'application de la substitution s
au type t
.
subst_tenv : subst -> tenv -> tenv
.
unif : texp -> texp -> subst |
unify t1 t2
calcule la plus petite substitution s
qui
égalise t1
et t2
.a) |
domain : subst -> tvar list qui retourne le
domain d'une substitution.
b) |
| restrict_out : subst -> tvar list -> subst
où restrict_out s l retourne la restriction de s aux
valeurs en dehors de l .
c) |
| compose : subst -> subst -> subst
qui retourne la composition de deux substitutions.
|
unify : texp -> texp -> subst unify_list : (texp * texp) list -> subst. |
exception Unify of texp * texp;; let rec unify t1 t2 = match t1, t2 with | Tvar x, Tvar y when x = y -> [] | Tvar x, t -> if libre x t then raise (Unify (t1, t2)) else [ x, t ] | t, Tvar x -> if libre x t then raise (Unify (t1, t2)) else [ x, t ] | Tint, Tint -> [ ] | Tarrow (t11, t12), Tarrow (t21, t22) -> unify_list [ t11, t21; t12, t22 ] | t1, t2 -> raise (Unify (t1,t2)) and unify_list l = match l with [] -> [] | (t1,t2)::l -> let s1 = unify_list l in let s2 = unify (subst_texp s1 t1) (subst_texp s1 t2) in compose s2 s1 ;; |
unify (Tarrow (Tint, Tvar 1)) (Tarrow (Tint, Tvar 2));; # - : (tvar * texp) list = [1, Tvar 2] |
infer : tenv -> texp -> (texp * sustititution)
retourne le type principal et la substition minimal à appliquer à
l'environnement pour que le programme soit typable.
|
let a = Liaison ("f", Fonction ("x", Var "x"), App (Var "f", Var "f")) in infer [] a;; # - : texp * subst = Tint, [4, Tint; 3, Tint] |
A ::= | Envirommenent de typage | |||
Ø | Environnement vide | |||
x : t, A | Liaison de type monomorphe | |||
x : s, A | Liaison de type polymorphe |
|
|
This document was translated from LATEX by HEVEA and HACHA.