| 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.