128 |
128 |
129 fun mk_primcorec_sel_tac ctxt defs distincts splits split_asms mapsx map_idents map_comps fun_sel k |
129 fun mk_primcorec_sel_tac ctxt defs distincts splits split_asms mapsx map_idents map_comps fun_sel k |
130 m excludesss = |
130 m excludesss = |
131 prelude_tac ctxt defs (fun_sel RS trans) THEN |
131 prelude_tac ctxt defs (fun_sel RS trans) THEN |
132 cases_tac ctxt k m excludesss THEN |
132 cases_tac ctxt k m excludesss THEN |
133 HEADGOAL (REPEAT_DETERM o (rtac refl ORELSE' rtac ext ORELSE' |
133 HEADGOAL (REPEAT_DETERM o (rtac refl ORELSE' |
134 eresolve_tac falseEs ORELSE' |
134 eresolve_tac falseEs ORELSE' |
135 resolve_tac split_connectI ORELSE' |
135 resolve_tac split_connectI ORELSE' |
136 Splitter.split_asm_tac (split_if_asm :: split_asms) ORELSE' |
136 Splitter.split_asm_tac (split_if_asm :: split_asms) ORELSE' |
137 Splitter.split_tac (split_if :: splits) ORELSE' |
137 Splitter.split_tac (split_if :: splits) ORELSE' |
138 eresolve_tac (map (fn thm => thm RS neq_eq_eq_contradict) distincts) THEN' atac ORELSE' |
138 eresolve_tac (map (fn thm => thm RS neq_eq_eq_contradict) distincts) THEN' atac ORELSE' |
139 etac notE THEN' atac ORELSE' |
139 etac notE THEN' atac ORELSE' |
140 (CHANGED o SELECT_GOAL (unfold_thms_tac ctxt (@{thms fst_conv snd_conv id_def comp_def split_def |
140 (CHANGED o SELECT_GOAL (unfold_thms_tac ctxt (@{thms fst_conv snd_conv id_def comp_def split_def |
141 sum.cases} @ mapsx @ map_comps @ map_idents))))); |
141 sum.cases} @ mapsx @ map_comps @ map_idents))) ORELSE' |
|
142 fo_rtac @{thm cong} ctxt ORELSE' |
|
143 rtac ext)); |
142 |
144 |
143 fun mk_primcorec_ctr_tac ctxt m collapse disc_fun_opt sel_funs = |
145 fun mk_primcorec_ctr_tac ctxt m collapse disc_fun_opt sel_funs = |
144 HEADGOAL (rtac ((if null sel_funs then collapse else collapse RS sym) RS trans) THEN' |
146 HEADGOAL (rtac ((if null sel_funs then collapse else collapse RS sym) RS trans) THEN' |
145 (the_default (K all_tac) (Option.map rtac disc_fun_opt)) THEN' REPEAT_DETERM_N m o atac) THEN |
147 (the_default (K all_tac) (Option.map rtac disc_fun_opt)) THEN' REPEAT_DETERM_N m o atac) THEN |
146 unfold_thms_tac ctxt (@{thm split_def} :: unfold_lets @ sel_funs) THEN HEADGOAL (rtac refl); |
148 unfold_thms_tac ctxt (@{thm split_def} :: unfold_lets @ sel_funs) THEN HEADGOAL (rtac refl); |