src/Pure/type.ML
changeset 44116 c70257b4cb7e
parent 43552 156c822f181a
child 45445 41e641a870de
equal deleted inserted replaced
44115:5d9821493bc1 44116:c70257b4cb7e
   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)))))