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); |