equal
deleted
inserted
replaced
54 (P, tuple_fun (map #2 avoiding) (Term.dest_Var P)) :: |
54 (P, tuple_fun (map #2 avoiding) (Term.dest_Var P)) :: |
55 (x, tuple (map Free avoiding)) :: |
55 (x, tuple (map Free avoiding)) :: |
56 List.mapPartial (fn (z, SOME t) => SOME (z, t) | _ => NONE) (zs ~~ inst) |
56 List.mapPartial (fn (z, SOME t) => SOME (z, t) | _ => NONE) (zs ~~ inst) |
57 end; |
57 end; |
58 val substs = |
58 val substs = |
59 map2 subst insts rules |> List.concat |> distinct |
59 map2 subst insts rules |> List.concat |> distinct (op =) |
60 |> map (pairself (Thm.cterm_of thy)); |
60 |> map (pairself (Thm.cterm_of thy)); |
61 in (((cases, concls), consumes), Drule.cterm_instantiate substs rule) end; |
61 in (((cases, concls), consumes), Drule.cterm_instantiate substs rule) end; |
62 |
62 |
63 fun rename_params_rule internal xs rule = |
63 fun rename_params_rule internal xs rule = |
64 let |
64 let |
88 val cert = Thm.cterm_of thy; |
88 val cert = Thm.cterm_of thy; |
89 |
89 |
90 val ((insts, defs), defs_ctxt) = fold_map InductMethod.add_defs def_insts ctxt |>> split_list; |
90 val ((insts, defs), defs_ctxt) = fold_map InductMethod.add_defs def_insts ctxt |>> split_list; |
91 val atomized_defs = map (map ObjectLogic.atomize_thm) defs; |
91 val atomized_defs = map (map ObjectLogic.atomize_thm) defs; |
92 |
92 |
93 val finish_rule = PolyML.print #> |
93 val finish_rule = |
94 split_all_tuples |
94 split_all_tuples |
95 #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding) #> PolyML.print; |
95 #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding); |
96 fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (InductMethod.rulified_term r); |
96 fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (InductMethod.rulified_term r); |
97 in |
97 in |
98 (fn i => fn st => |
98 (fn i => fn st => |
99 rules |
99 rules |
100 |> inst_mutual_rule thy insts avoiding |
100 |> inst_mutual_rule thy insts avoiding |
106 THEN' InductMethod.fix_tac defs_ctxt |
106 THEN' InductMethod.fix_tac defs_ctxt |
107 (nth concls (j - 1) + more_consumes) |
107 (nth concls (j - 1) + more_consumes) |
108 (nth_list fixings (j - 1)))) |
108 (nth_list fixings (j - 1)))) |
109 THEN' InductMethod.inner_atomize_tac) j)) |
109 THEN' InductMethod.inner_atomize_tac) j)) |
110 THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' => |
110 THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' => |
111 InductMethod.guess_instance (finish_rule (InductMethod.internalize more_consumes rule)) i (PolyML.print st') |
111 InductMethod.guess_instance |
|
112 (finish_rule (InductMethod.internalize more_consumes rule)) i st' |
112 |> Seq.maps (fn rule' => |
113 |> Seq.maps (fn rule' => |
113 CASES (rule_cases (PolyML.print rule') cases) |
114 CASES (rule_cases rule' cases) |
114 (Tactic.rtac (rename_params_rule false [] rule') i THEN |
115 (Tactic.rtac (rename_params_rule false [] rule') i THEN |
115 PRIMSEQ (ProofContext.exports defs_ctxt ctxt)) st')))) |
116 PRIMSEQ (ProofContext.exports defs_ctxt ctxt)) st')))) |
116 THEN_ALL_NEW_CASES InductMethod.rulify_tac |
117 THEN_ALL_NEW_CASES InductMethod.rulify_tac |
117 end; |
118 end; |
118 |
119 |