src/Pure/Isar/obtain.ML
changeset 74230 d637611b41bd
parent 70734 31364e70ff3e
child 74232 1091880266e5
equal deleted inserted replaced
74229:76ac4dbb0a22 74230:d637611b41bd
   101 
   101 
   102 val mk_all_external = Logic.all_constraint o Variable.default_type;
   102 val mk_all_external = Logic.all_constraint o Variable.default_type;
   103 
   103 
   104 fun mk_all_internal ctxt (y, z) t =
   104 fun mk_all_internal ctxt (y, z) t =
   105   let
   105   let
       
   106     val frees =
       
   107       (t, Term_Subst.Frees.empty)
       
   108       |-> Term.fold_aterms (fn Free v => Term_Subst.Frees.add (v, ()) | _ => I);
   106     val T =
   109     val T =
   107       (case AList.lookup (op =) (Term.add_frees t []) z of
   110       (case Term_Subst.Frees.get_first (fn ((x, T), ()) => if x = z then SOME T else NONE) frees of
   108         SOME T => T
   111         SOME T => T
   109       | NONE => the_default dummyT (Variable.default_type ctxt z));
   112       | NONE => the_default dummyT (Variable.default_type ctxt z));
   110   in Logic.all_const T $ Term.lambda_name (y, Free (z, T)) t end;
   113   in Logic.all_const T $ Term.lambda_name (y, Free (z, T)) t end;
   111 
   114 
   112 fun prepare_clause prep_var parse_prop mk_all ctxt thesis raw_vars raw_props =
   115 fun prepare_clause prep_var parse_prop mk_all ctxt thesis raw_vars raw_props =
   323     val ys = map (apsnd norm_type) (drop m params);
   326     val ys = map (apsnd norm_type) (drop m params);
   324     val ys' = map Name.internal (Name.variant_list (map fst xs) (map fst ys)) ~~ map #2 ys;
   327     val ys' = map Name.internal (Name.variant_list (map fst xs) (map fst ys)) ~~ map #2 ys;
   325     val terms = map (Drule.mk_term o Thm.cterm_of ctxt o Free) (xs @ ys');
   328     val terms = map (Drule.mk_term o Thm.cterm_of ctxt o Free) (xs @ ys');
   326 
   329 
   327     val instT =
   330     val instT =
   328       fold (Term.add_tvarsT o #2) params []
   331       (params, Term_Subst.TVars.empty) |-> fold (#2 #> Term.fold_atyps (fn T => fn instT =>
   329       |> map (fn v => (v, Thm.ctyp_of ctxt (norm_type (TVar v))));
   332         (case T of
       
   333           TVar v =>
       
   334             if Term_Subst.TVars.defined instT v then instT
       
   335             else Term_Subst.TVars.update (v, Thm.ctyp_of ctxt (norm_type T)) instT
       
   336         | _ => instT)));
   330     val closed_rule = rule
   337     val closed_rule = rule
   331       |> Thm.forall_intr (Thm.cterm_of ctxt (Free thesis_var))
   338       |> Thm.forall_intr (Thm.cterm_of ctxt (Free thesis_var))
   332       |> Thm.instantiate (instT, []);
   339       |> Thm.instantiate (Term_Subst.TVars.dest instT, []);
   333 
   340 
   334     val ((_, rule' :: terms'), ctxt') = Variable.import false (closed_rule :: terms) ctxt;
   341     val ((_, rule' :: terms'), ctxt') = Variable.import false (closed_rule :: terms) ctxt;
   335     val vars' =
   342     val vars' =
   336       map (dest_Free o Thm.term_of o Drule.dest_term) terms' ~~
   343       map (dest_Free o Thm.term_of o Drule.dest_term) terms' ~~
   337       (map snd vars @ replicate (length ys) NoSyn);
   344       (map snd vars @ replicate (length ys) NoSyn);