| author | wenzelm | 
| Tue, 05 Aug 2014 12:01:32 +0200 | |
| changeset 57859 | 29e728588163 | 
| parent 53672 | df8068269e90 | 
| child 62958 | b41c1cb5e251 | 
| permissions | -rw-r--r-- | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/type_infer.ML | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 2 | Author: Stefan Berghofer and Markus Wenzel, TU Muenchen | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 3 | |
| 42405 
13ecdb3057d8
split Type_Infer into early and late part, after Proof_Context;
 wenzelm parents: 
42400diff
changeset | 4 | Basic representation of type-inference problems. | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 5 | *) | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 6 | |
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 7 | signature TYPE_INFER = | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 8 | sig | 
| 24504 | 9 | val is_param: indexname -> bool | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 10 | val is_paramT: typ -> bool | 
| 42400 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 11 | val param_maxidx: term -> int -> int | 
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 12 | val param_maxidx_of: term list -> int | 
| 14788 
9776f0c747c8
incorporate type inference interface from type.ML;
 wenzelm parents: 
14695diff
changeset | 13 | val param: int -> string * sort -> typ | 
| 40286 | 14 | val mk_param: int -> sort -> typ | 
| 39296 | 15 | val anyT: sort -> typ | 
| 22771 | 16 | val paramify_vars: typ -> typ | 
| 39296 | 17 | val deref: typ Vartab.table -> typ -> typ | 
| 18 | val finish: Proof.context -> typ Vartab.table -> typ list * term list -> typ list * term list | |
| 19 | val fixate: Proof.context -> term list -> term list | |
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 20 | end; | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 21 | |
| 37145 
01aa36932739
renamed structure TypeInfer to Type_Infer, keeping the old name as legacy alias for some time;
 wenzelm parents: 
35013diff
changeset | 22 | structure Type_Infer: TYPE_INFER = | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 23 | struct | 
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 24 | |
| 22698 | 25 | (** type parameters and constraints **) | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 26 | |
| 39286 | 27 | (* type inference parameters -- may get instantiated *) | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 28 | |
| 24504 | 29 | fun is_param (x, _: int) = String.isPrefix "?" x; | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 30 | |
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 31 | fun is_paramT (TVar (xi, _)) = is_param xi | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 32 | | is_paramT _ = false; | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 33 | |
| 42400 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 34 | val param_maxidx = | 
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 35 | (Term.fold_types o Term.fold_atyps) | 
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 36 | (fn (TVar (xi as (_, i), _)) => if is_param xi then Integer.max i else I | _ => I); | 
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 37 | |
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 38 | fun param_maxidx_of ts = fold param_maxidx ts ~1; | 
| 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 39 | |
| 22698 | 40 | fun param i (x, S) = TVar (("?" ^ x, i), S);
 | 
| 41 | ||
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 42 | fun mk_param i S = TVar (("?'a", i), S);
 | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 43 | |
| 39296 | 44 | |
| 45 | (* pre-stage parameters *) | |
| 46 | ||
| 47 | fun anyT S = TFree ("'_dummy_", S);
 | |
| 48 | ||
| 32002 
1a35de4112bb
tuned paramify_vars: Term_Subst.map_atypsT_option;
 wenzelm parents: 
31977diff
changeset | 49 | val paramify_vars = | 
| 32146 | 50 | Same.commit | 
| 51 | (Term_Subst.map_atypsT_same | |
| 52 | (fn TVar ((x, i), S) => (param i (x, S)) | _ => raise Same.SAME)); | |
| 22771 | 53 | |
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 54 | |
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 55 | |
| 39296 | 56 | (** results **) | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 57 | |
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 58 | (* dereferenced views *) | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 59 | |
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 60 | fun deref tye (T as TVar (xi, _)) = | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 61 | (case Vartab.lookup tye xi of | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 62 | NONE => T | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 63 | | SOME U => deref tye U) | 
| 42400 
26c8c9cabb24
more precise treatment of existing type inference parameters;
 wenzelm parents: 
42386diff
changeset | 64 | | deref _ T = T; | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 65 | |
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 66 | fun add_parms tye T = | 
| 32146 | 67 | (case deref tye T of | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 68 | Type (_, Ts) => fold (add_parms tye) Ts | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 69 | | TVar (xi, _) => if is_param xi then insert (op =) xi else I | 
| 32146 | 70 | | _ => I); | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 71 | |
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 72 | fun add_names tye T = | 
| 32146 | 73 | (case deref tye T of | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 74 | Type (_, Ts) => fold (add_names tye) Ts | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 75 | | TFree (x, _) => Name.declare x | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 76 | | TVar ((x, i), _) => if is_param (x, i) then I else Name.declare x); | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 77 | |
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 78 | |
| 39296 | 79 | (* finish -- standardize remaining parameters *) | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 80 | |
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 81 | fun finish ctxt tye (Ts, ts) = | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 82 | let | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 83 | val used = | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 84 | (fold o fold_types) (add_names tye) ts (fold (add_names tye) Ts (Variable.names_of ctxt)); | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 85 | val parms = rev ((fold o fold_types) (add_parms tye) ts (fold (add_parms tye) Ts [])); | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
42405diff
changeset | 86 |     val names = Name.invent used ("?" ^ Name.aT) (length parms);
 | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 87 | val tab = Vartab.make (parms ~~ names); | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 88 | |
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 89 | fun finish_typ T = | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 90 | (case deref tye T of | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 91 | Type (a, Ts) => Type (a, map finish_typ Ts) | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 92 | | U as TFree _ => U | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 93 | | U as TVar (xi, S) => | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 94 | (case Vartab.lookup tab xi of | 
| 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 95 | NONE => U | 
| 39295 
6e8b0672c6a2
Type_Infer.finish: index 0 -- freshness supposedly via Name.invents;
 wenzelm parents: 
39294diff
changeset | 96 | | SOME a => TVar ((a, 0), S))); | 
| 39294 
27fae73fe769
simplified Type_Infer: eliminated separate datatypes pretyp/preterm -- only assign is_paramT TVars;
 wenzelm parents: 
39292diff
changeset | 97 | in (map finish_typ Ts, map (Type.strip_constraints o Term.map_types finish_typ) ts) end; | 
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 98 | |
| 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 99 | |
| 39296 | 100 | (* fixate -- introduce fresh type variables *) | 
| 101 | ||
| 102 | fun fixate ctxt ts = | |
| 103 | let | |
| 104 | fun subst_param (xi, S) (inst, used) = | |
| 105 | if is_param xi then | |
| 106 | let | |
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
42405diff
changeset | 107 | val [a] = Name.invent used Name.aT 1; | 
| 39296 | 108 | val used' = Name.declare a used; | 
| 109 | in (((xi, S), TFree (a, S)) :: inst, used') end | |
| 110 | else (inst, used); | |
| 111 | val used = (fold o fold_types) Term.declare_typ_names ts (Variable.names_of ctxt); | |
| 112 | val (inst, _) = fold_rev subst_param (fold Term.add_tvars ts []) ([], used); | |
| 113 | in (map o map_types) (Term_Subst.instantiateT inst) ts end; | |
| 114 | ||
| 2957 
d35fca99b3be
Type inference (isolated from type.ML, completely reimplemented).
 wenzelm parents: diff
changeset | 115 | end; |