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 |