50 "[| (a,b) : r^*; \ |
50 "[| (a,b) : r^*; \ |
51 \ !!x. P((x,x)); \ |
51 \ !!x. P((x,x)); \ |
52 \ !!x y z.[| P((x,y)); (x,y): r^*; (y,z): r |] ==> P((x,z)) |] \ |
52 \ !!x y z.[| P((x,y)); (x,y): r^*; (y,z): r |] ==> P((x,z)) |] \ |
53 \ ==> P((a,b))"; |
53 \ ==> P((a,b))"; |
54 by (rtac ([rtrancl_def, rtrancl_fun_mono, major] MRS def_induct) 1); |
54 by (rtac ([rtrancl_def, rtrancl_fun_mono, major] MRS def_induct) 1); |
55 by (fast_tac (!claset addIs prems) 1); |
55 by (blast_tac (!claset addIs prems) 1); |
56 qed "rtrancl_full_induct"; |
56 qed "rtrancl_full_induct"; |
57 |
57 |
58 (*nice induction rule*) |
58 (*nice induction rule*) |
59 val major::prems = goal Trancl.thy |
59 val major::prems = goal Trancl.thy |
60 "[| (a::'a,b) : r^*; \ |
60 "[| (a::'a,b) : r^*; \ |
65 by (subgoal_tac "! y. (a::'a,b) = (a,y) --> P(y)" 1); |
65 by (subgoal_tac "! y. (a::'a,b) = (a,y) --> P(y)" 1); |
66 (*now solve first subgoal: this formula is sufficient*) |
66 (*now solve first subgoal: this formula is sufficient*) |
67 by (Blast_tac 1); |
67 by (Blast_tac 1); |
68 (*now do the induction*) |
68 (*now do the induction*) |
69 by (resolve_tac [major RS rtrancl_full_induct] 1); |
69 by (resolve_tac [major RS rtrancl_full_induct] 1); |
70 by (fast_tac (!claset addIs prems) 1); |
70 by (blast_tac (!claset addIs prems) 1); |
71 by (fast_tac (!claset addIs prems) 1); |
71 by (blast_tac (!claset addIs prems) 1); |
72 qed "rtrancl_induct"; |
72 qed "rtrancl_induct"; |
73 |
73 |
74 bind_thm |
74 bind_thm |
75 ("rtrancl_induct2", |
75 ("rtrancl_induct2", |
76 Prod_Syntax.split_rule |
76 Prod_Syntax.split_rule |
91 "[| (a::'a,b) : r^*; (a = b) ==> P; \ |
91 "[| (a::'a,b) : r^*; (a = b) ==> P; \ |
92 \ !!y.[| (a,y) : r^*; (y,b) : r |] ==> P \ |
92 \ !!y.[| (a,y) : r^*; (y,b) : r |] ==> P \ |
93 \ |] ==> P"; |
93 \ |] ==> P"; |
94 by (subgoal_tac "(a::'a) = b | (? y. (a,y) : r^* & (y,b) : r)" 1); |
94 by (subgoal_tac "(a::'a) = b | (? y. (a,y) : r^* & (y,b) : r)" 1); |
95 by (rtac (major RS rtrancl_induct) 2); |
95 by (rtac (major RS rtrancl_induct) 2); |
96 by (fast_tac (!claset addIs prems) 2); |
96 by (blast_tac (!claset addIs prems) 2); |
97 by (fast_tac (!claset addIs prems) 2); |
97 by (blast_tac (!claset addIs prems) 2); |
98 by (REPEAT (eresolve_tac ([asm_rl,exE,disjE,conjE]@prems) 1)); |
98 by (REPEAT (eresolve_tac ([asm_rl,exE,disjE,conjE]@prems) 1)); |
99 qed "rtranclE"; |
99 qed "rtranclE"; |
100 |
100 |
101 bind_thm ("rtrancl_into_rtrancl2", r_into_rtrancl RS rtrancl_trans); |
101 bind_thm ("rtrancl_into_rtrancl2", r_into_rtrancl RS rtrancl_trans); |
102 |
102 |
163 "[| (a,b) : r^*; P(b); \ |
163 "[| (a,b) : r^*; P(b); \ |
164 \ !!y z.[| (y,z) : r; (z,b) : r^*; P(z) |] ==> P(y) |] \ |
164 \ !!y z.[| (y,z) : r; (z,b) : r^*; P(z) |] ==> P(y) |] \ |
165 \ ==> P(a)"; |
165 \ ==> P(a)"; |
166 by (rtac ((major RS converseI RS rtrancl_converseI) RS rtrancl_induct) 1); |
166 by (rtac ((major RS converseI RS rtrancl_converseI) RS rtrancl_induct) 1); |
167 by (resolve_tac prems 1); |
167 by (resolve_tac prems 1); |
168 by (fast_tac (!claset addIs prems addSDs[rtrancl_converseD])1); |
168 by (blast_tac (!claset addIs prems addSDs[rtrancl_converseD])1); |
169 qed "converse_rtrancl_induct"; |
169 qed "converse_rtrancl_induct"; |
170 |
170 |
171 val prems = goal Trancl.thy |
171 val prems = goal Trancl.thy |
172 "[| ((a,b),(c,d)) : r^*; P c d; \ |
172 "[| ((a,b),(c,d)) : r^*; P c d; \ |
173 \ !!x y z u.[| ((x,y),(z,u)) : r; ((z,u),(c,d)) : r^*; P z u |] ==> P x y\ |
173 \ !!x y z u.[| ((x,y),(z,u)) : r; ((z,u),(c,d)) : r^*; P z u |] ==> P x y\ |
225 (*by induction on this formula*) |
225 (*by induction on this formula*) |
226 by (subgoal_tac "ALL z. (y,z) : r --> P(z)" 1); |
226 by (subgoal_tac "ALL z. (y,z) : r --> P(z)" 1); |
227 (*now solve first subgoal: this formula is sufficient*) |
227 (*now solve first subgoal: this formula is sufficient*) |
228 by (Blast_tac 1); |
228 by (Blast_tac 1); |
229 by (etac rtrancl_induct 1); |
229 by (etac rtrancl_induct 1); |
230 by (ALLGOALS (fast_tac (!claset addIs (rtrancl_into_trancl1::prems)))); |
230 by (ALLGOALS (blast_tac (!claset addIs (rtrancl_into_trancl1::prems)))); |
231 qed "trancl_induct"; |
231 qed "trancl_induct"; |
232 |
232 |
233 (*elimination of r^+ -- NOT an induction rule*) |
233 (*elimination of r^+ -- NOT an induction rule*) |
234 val major::prems = goal Trancl.thy |
234 val major::prems = goal Trancl.thy |
235 "[| (a::'a,b) : r^+; \ |
235 "[| (a::'a,b) : r^+; \ |