src/Pure/Isar/generic_target.ML
changeset 74284 8d1e27a23dd1
parent 74282 c2ee8d993d6a
child 74361 690928dd6f8f
equal deleted inserted replaced
74283:019fe8238656 74284:8d1e27a23dd1
    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))