src/Tools/Code/code_preproc.ML
changeset 60805 4cc49ead6e75
parent 60697 e266d5463e9d
child 61262 7bd1eb4b056e
equal deleted inserted replaced
60803:e11f47dd0786 60805:4cc49ead6e75
   166 (* post- and preprocessing *)
   166 (* post- and preprocessing *)
   167 
   167 
   168 fun normalized_tfrees_sandwich ctxt ct =
   168 fun normalized_tfrees_sandwich ctxt ct =
   169   let
   169   let
   170     val t = Thm.term_of ct;
   170     val t = Thm.term_of ct;
   171     val vs_original = fold_term_types (K (fold_atyps (insert (eq_fst op =)
   171     val vs_original =
   172       o dest_TFree))) t [];
   172       fold_term_types (K (fold_atyps (insert (eq_fst op =) o dest_TFree))) t [];
   173     val vs_normalized = Name.invent_names Name.context Name.aT (map snd vs_original);
   173     val vs_normalized = Name.invent_names Name.context Name.aT (map snd vs_original);
   174     val normalize = map_type_tfree (TFree o the o AList.lookup (op =) (vs_original ~~ vs_normalized));
   174     val normalize =
       
   175       map_type_tfree (TFree o the o AList.lookup (op =) (vs_original ~~ vs_normalized));
   175     val normalization =
   176     val normalization =
   176       map2 (fn (v, sort) => fn (v', _) => (((v', 0), sort), TFree (v, sort))) vs_original vs_normalized;
   177       map2 (fn (v, sort) => fn (v', _) => (((v', 0), sort), Thm.ctyp_of ctxt (TFree (v, sort))))
       
   178         vs_original vs_normalized;
   177   in
   179   in
   178     if eq_list (eq_fst (op =)) (vs_normalized, vs_original)
   180     if eq_list (eq_fst (op =)) (vs_normalized, vs_original)
   179     then (I, ct)
   181     then (I, ct)
   180     else
   182     else
   181      (Thm.certify_instantiate ctxt (normalization, []) o Thm.varifyT_global,
   183      (Thm.instantiate (normalization, []) o Thm.varifyT_global,
   182       Thm.cterm_of ctxt (map_types normalize t))
   184       Thm.cterm_of ctxt (map_types normalize t))
   183   end;
   185   end;
   184 
   186 
   185 fun no_variables_sandwich ctxt ct =
   187 fun no_variables_sandwich ctxt ct =
   186   let
   188   let