85 let |
85 let |
86 val thy = Proof_Context.theory_of ctxt; |
86 val thy = Proof_Context.theory_of ctxt; |
87 val cert = Thm.cterm_of thy; |
87 val cert = Thm.cterm_of thy; |
88 |
88 |
89 val ((insts, defs), defs_ctxt) = fold_map Induct.add_defs def_insts ctxt |>> split_list; |
89 val ((insts, defs), defs_ctxt) = fold_map Induct.add_defs def_insts ctxt |>> split_list; |
90 val atomized_defs = map (map (Conv.fconv_rule Induct.atomize_cterm)) defs; |
90 val atomized_defs = map (map (Conv.fconv_rule (Induct.atomize_cterm ctxt))) defs; |
91 |
91 |
92 val finish_rule = |
92 val finish_rule = |
93 split_all_tuples defs_ctxt |
93 split_all_tuples defs_ctxt |
94 #> rename_params_rule true |
94 #> rename_params_rule true |
95 (map (Name.clean o Variable.revert_fixed defs_ctxt o fst) avoiding); |
95 (map (Name.clean o Variable.revert_fixed defs_ctxt o fst) avoiding); |
99 in Rule_Cases.make_nested (Thm.prop_of r') (Induct.rulified_term r') end; |
99 in Rule_Cases.make_nested (Thm.prop_of r') (Induct.rulified_term r') end; |
100 in |
100 in |
101 (fn i => fn st => |
101 (fn i => fn st => |
102 rules |
102 rules |
103 |> inst_mutual_rule ctxt insts avoiding |
103 |> inst_mutual_rule ctxt insts avoiding |
104 |> Rule_Cases.consume (flat defs) facts |
104 |> Rule_Cases.consume ctxt (flat defs) facts |
105 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
105 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
106 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
106 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
107 (CONJUNCTS (ALLGOALS |
107 (CONJUNCTS (ALLGOALS |
108 let |
108 let |
109 val adefs = nth_list atomized_defs (j - 1); |
109 val adefs = nth_list atomized_defs (j - 1); |
116 Induct.rotate_tac k (length adefs) THEN' |
116 Induct.rotate_tac k (length adefs) THEN' |
117 Induct.arbitrary_tac defs_ctxt k (List.partition (member op = frees) xs |> op @) |
117 Induct.arbitrary_tac defs_ctxt k (List.partition (member op = frees) xs |> op @) |
118 else |
118 else |
119 Induct.arbitrary_tac defs_ctxt k xs) |
119 Induct.arbitrary_tac defs_ctxt k xs) |
120 end) |
120 end) |
121 THEN' Induct.inner_atomize_tac) j)) |
121 THEN' Induct.inner_atomize_tac defs_ctxt) j)) |
122 THEN' Induct.atomize_tac) i st |> Seq.maps (fn st' => |
122 THEN' Induct.atomize_tac ctxt) i st |> Seq.maps (fn st' => |
123 Induct.guess_instance ctxt |
123 Induct.guess_instance ctxt |
124 (finish_rule (Induct.internalize more_consumes rule)) i st' |
124 (finish_rule (Induct.internalize ctxt more_consumes rule)) i st' |
125 |> Seq.maps (fn rule' => |
125 |> Seq.maps (fn rule' => |
126 CASES (rule_cases ctxt rule' cases) |
126 CASES (rule_cases ctxt rule' cases) |
127 (rtac (rename_params_rule false [] rule') i THEN |
127 (rtac (rename_params_rule false [] rule') i THEN |
128 PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st')))) |
128 PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st')))) |
129 THEN_ALL_NEW_CASES |
129 THEN_ALL_NEW_CASES |
130 ((if simp then Induct.simplify_tac ctxt THEN' (TRY o Induct.trivial_tac) |
130 ((if simp then Induct.simplify_tac ctxt THEN' (TRY o Induct.trivial_tac) |
131 else K all_tac) |
131 else K all_tac) |
132 THEN_ALL_NEW Induct.rulify_tac) |
132 THEN_ALL_NEW Induct.rulify_tac ctxt) |
133 end; |
133 end; |
134 |
134 |
135 |
135 |
136 (* concrete syntax *) |
136 (* concrete syntax *) |
137 |
137 |