96 val global_rhs = singleton (Variable.polymorphic thy_ctxt) u; |
96 val global_rhs = singleton (Variable.polymorphic thy_ctxt) u; |
97 |
97 |
98 val type_tfrees = TFrees.build (TFrees.add_tfreesT (Term.fastype_of u)); |
98 val type_tfrees = TFrees.build (TFrees.add_tfreesT (Term.fastype_of u)); |
99 val extra_tfrees = |
99 val extra_tfrees = |
100 TFrees.build (TFrees.add_tfrees_unless (TFrees.defined type_tfrees) u) |
100 TFrees.build (TFrees.add_tfrees_unless (TFrees.defined type_tfrees) u) |
101 |> TFrees.list_set; |
101 |> TFrees.keys; |
102 val type_params = map (Logic.mk_type o TFree) extra_tfrees; |
102 val type_params = map (Logic.mk_type o TFree) extra_tfrees; |
103 in (global_rhs, (extra_tfrees, (type_params, term_params))) end; |
103 in (global_rhs, (extra_tfrees, (type_params, term_params))) end; |
104 |
104 |
105 fun check_mixfix ctxt (b, extra_tfrees) mx = |
105 fun check_mixfix ctxt (b, extra_tfrees) mx = |
106 if null extra_tfrees then mx |
106 if null extra_tfrees then mx |
107 else |
107 else |
108 (if Context_Position.is_visible ctxt then |
108 (if Context_Position.is_visible ctxt then |
109 warning |
109 warning |
110 ("Additional type variable(s) in specification of " ^ Binding.print b ^ ": " ^ |
110 ("Additional type variable(s) in specification of " ^ Binding.print b ^ ": " ^ |
111 commas (map (Syntax.string_of_typ ctxt o TFree) (sort_by #1 extra_tfrees)) ^ |
111 commas (map (Syntax.string_of_typ ctxt o TFree) extra_tfrees) ^ |
112 (if Mixfix.is_empty mx then "" |
112 (if Mixfix.is_empty mx then "" |
113 else "\nDropping mixfix syntax " ^ Pretty.string_of (Mixfix.pretty_mixfix mx))) |
113 else "\nDropping mixfix syntax " ^ Pretty.string_of (Mixfix.pretty_mixfix mx))) |
114 else (); NoSyn); |
114 else (); NoSyn); |
115 |
115 |
116 fun check_mixfix_global (b, no_params) mx = |
116 fun check_mixfix_global (b, no_params) mx = |
262 val xs = Variable.add_fixed lthy rhs' []; |
262 val xs = Variable.add_fixed lthy rhs' []; |
263 val T = Term.fastype_of rhs; |
263 val T = Term.fastype_of rhs; |
264 val type_tfrees = TFrees.build (TFrees.add_tfreesT T #> fold (TFrees.add_tfreesT o #2) xs); |
264 val type_tfrees = TFrees.build (TFrees.add_tfreesT T #> fold (TFrees.add_tfreesT o #2) xs); |
265 val extra_tfrees = |
265 val extra_tfrees = |
266 TFrees.build (rhs |> TFrees.add_tfrees_unless (TFrees.defined type_tfrees)) |
266 TFrees.build (rhs |> TFrees.add_tfrees_unless (TFrees.defined type_tfrees)) |
267 |> TFrees.list_set; |
267 |> TFrees.keys; |
268 val mx' = check_mixfix lthy (b, extra_tfrees) mx; |
268 val mx' = check_mixfix lthy (b, extra_tfrees) mx; |
269 |
269 |
270 val type_params = map (Logic.mk_type o TFree) extra_tfrees; |
270 val type_params = map (Logic.mk_type o TFree) extra_tfrees; |
271 val term_params = map Free (sort (Variable.fixed_ord lthy o apply2 #1) xs); |
271 val term_params = map Free (sort (Variable.fixed_ord lthy o apply2 #1) xs); |
272 val params = type_params @ term_params; |
272 val params = type_params @ term_params; |
306 val asms' = map (rewrite_rule ctxt (Drule.norm_hhf_eqs @ defs)) asms; |
306 val asms' = map (rewrite_rule ctxt (Drule.norm_hhf_eqs @ defs)) asms; |
307 |
307 |
308 (*export fixes*) |
308 (*export fixes*) |
309 val tfrees = |
309 val tfrees = |
310 TFrees.build (Thm.fold_terms {hyps = true} TFrees.add_tfrees th') |
310 TFrees.build (Thm.fold_terms {hyps = true} TFrees.add_tfrees th') |
311 |> TFrees.list_set_rev |> map TFree; |
311 |> TFrees.keys |> map TFree; |
312 val frees = |
312 val frees = |
313 Frees.build (Thm.fold_terms {hyps = true} Frees.add_frees th') |
313 Frees.build (Thm.fold_terms {hyps = true} Frees.add_frees th') |
314 |> Frees.list_set_rev |> map Free; |
314 |> Frees.list_set_rev |> map Free; |
315 val (th'' :: vs) = |
315 val (th'' :: vs) = |
316 (th' :: map (Drule.mk_term o Thm.cterm_of ctxt) (map Logic.mk_type tfrees @ frees)) |
316 (th' :: map (Drule.mk_term o Thm.cterm_of ctxt) (map Logic.mk_type tfrees @ frees)) |