356 |
356 |
357 (* freeze_thaw: freeze TVars in a term; return the "thaw" inverse *) |
357 (* freeze_thaw: freeze TVars in a term; return the "thaw" inverse *) |
358 |
358 |
359 local |
359 local |
360 |
360 |
361 fun new_name (ix, (pairs, used)) = |
361 fun new_name ix (pairs, used) = |
362 let val v = singleton (Name.variant_list used) (string_of_indexname ix) |
362 let val v = singleton (Name.variant_list used) (string_of_indexname ix) |
363 in ((ix, v) :: pairs, v :: used) end; |
363 in ((ix, v) :: pairs, v :: used) end; |
364 |
364 |
365 fun freeze_one alist (ix, sort) = |
365 fun freeze_one alist (ix, sort) = |
366 TFree (the (AList.lookup (op =) alist ix), sort) |
366 TFree (the (AList.lookup (op =) alist ix), sort) |
372 |
372 |
373 in |
373 in |
374 |
374 |
375 fun legacy_freeze_thaw_type T = |
375 fun legacy_freeze_thaw_type T = |
376 let |
376 let |
377 val used = OldTerm.add_typ_tfree_names (T, []) |
377 val used = Term.add_tfree_namesT T []; |
378 and tvars = map #1 (OldTerm.add_typ_tvars (T, [])); |
378 val (alist, _) = fold_rev new_name (map #1 (Term.add_tvarsT T [])) ([], used); |
379 val (alist, _) = List.foldr new_name ([], used) tvars; |
|
380 in (map_type_tvar (freeze_one alist) T, map_type_tfree (thaw_one (map swap alist))) end; |
379 in (map_type_tvar (freeze_one alist) T, map_type_tfree (thaw_one (map swap alist))) end; |
381 |
380 |
382 val legacy_freeze_type = #1 o legacy_freeze_thaw_type; |
381 val legacy_freeze_type = #1 o legacy_freeze_thaw_type; |
383 |
382 |
384 fun legacy_freeze_thaw t = |
383 fun legacy_freeze_thaw t = |
385 let |
384 let |
386 val used = OldTerm.it_term_types OldTerm.add_typ_tfree_names (t, []) |
385 val used = Term.add_tfree_names t []; |
387 and tvars = map #1 (OldTerm.it_term_types OldTerm.add_typ_tvars (t, [])); |
386 val (alist, _) = fold_rev new_name (map #1 (Term.add_tvars t [])) ([], used); |
388 val (alist, _) = List.foldr new_name ([], used) tvars; |
|
389 in |
387 in |
390 (case alist of |
388 (case alist of |
391 [] => (t, fn x => x) (*nothing to do!*) |
389 [] => (t, fn x => x) (*nothing to do!*) |
392 | _ => (map_types (map_type_tvar (freeze_one alist)) t, |
390 | _ => (map_types (map_type_tvar (freeze_one alist)) t, |
393 map_types (map_type_tfree (thaw_one (map swap alist))))) |
391 map_types (map_type_tfree (thaw_one (map swap alist))))) |