src/HOL/Trancl.ML
changeset 2935 998cb95fdd43
parent 2922 580647a879cf
child 3413 c1f63cc3a768
equal deleted inserted replaced
2934:bd922fc9001b 2935:998cb95fdd43
    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^+;  \