src/Pure/type_infer.ML
changeset 14695 9c78044b99c3
parent 13667 0009325e9af0
child 14788 9776f0c747c8
equal deleted inserted replaced
14694:49873d345a39 14695:9c78044b99c3
   225   | simple_term_of (Constraint (t, _)) = simple_term_of t;
   225   | simple_term_of (Constraint (t, _)) = simple_term_of t;
   226 
   226 
   227 
   227 
   228 (* typs_terms_of *)                             (*DESTRUCTIVE*)
   228 (* typs_terms_of *)                             (*DESTRUCTIVE*)
   229 
   229 
   230 fun gen_names 0 _ _ = []
       
   231   | gen_names i s used = if s mem used
       
   232       then gen_names i (Symbol.bump_string s) used
       
   233       else s :: gen_names (i-1) (Symbol.bump_string s) used;
       
   234 
       
   235 fun typs_terms_of used mk_var prfx (Ts, ts) =
   230 fun typs_terms_of used mk_var prfx (Ts, ts) =
   236   let
   231   let
   237     fun elim (r as ref (Param S), x) = r := mk_var (x, S)
   232     fun elim (r as ref (Param S), x) = r := mk_var (x, S)
   238       | elim _ = ();
   233       | elim _ = ();
   239 
   234 
   240     val used' = foldl add_names (foldl add_namesT (used, Ts), ts);
   235     val used' = foldl add_names (foldl add_namesT (used, Ts), ts);
   241     val parms = rev (foldl add_parms (foldl add_parmsT ([], Ts), ts));
   236     val parms = rev (foldl add_parms (foldl add_parmsT ([], Ts), ts));
   242     val names = gen_names (length parms) (prfx ^ "'a") used';
   237     val names = Term.invent_names used' (prfx ^ "'a") (length parms);
   243   in
   238   in
   244     seq2 elim (parms, names);
   239     seq2 elim (parms, names);
   245     (map simple_typ_of Ts, map simple_term_of ts)
   240     (map simple_typ_of Ts, map simple_term_of ts)
   246   end;
   241   end;
   247 
   242