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 |