src/HOL/Transitive_Closure.thy
changeset 57178 276befcd90d9
parent 56257 589fafcc7cb6
child 57283 1f133cd8d3eb
equal deleted inserted replaced
57177:dce365931721 57178:276befcd90d9
   457 
   457 
   458 lemma tranclp_into_tranclp2: "r a b ==> r^++ b c ==> r^++ a c"
   458 lemma tranclp_into_tranclp2: "r a b ==> r^++ b c ==> r^++ a c"
   459   by (erule tranclp_trans [OF tranclp.r_into_trancl])
   459   by (erule tranclp_trans [OF tranclp.r_into_trancl])
   460 
   460 
   461 lemmas trancl_into_trancl2 = tranclp_into_tranclp2 [to_set]
   461 lemmas trancl_into_trancl2 = tranclp_into_tranclp2 [to_set]
   462 
       
   463 lemma trancl_insert:
       
   464   "(insert (y, x) r)^+ = r^+ \<union> {(a, b). (a, y) \<in> r^* \<and> (x, b) \<in> r^*}"
       
   465   -- {* primitive recursion for @{text trancl} over finite relations *}
       
   466   apply (rule equalityI)
       
   467    apply (rule subsetI)
       
   468    apply (simp only: split_tupled_all)
       
   469    apply (erule trancl_induct, blast)
       
   470    apply (blast intro: rtrancl_into_trancl1 trancl_into_rtrancl trancl_trans)
       
   471   apply (rule subsetI)
       
   472   apply (blast intro: trancl_mono rtrancl_mono
       
   473     [THEN [2] rev_subsetD] rtrancl_trancl_trancl rtrancl_into_trancl2)
       
   474   done
       
   475 
   462 
   476 lemma tranclp_converseI: "(r^++)^--1 x y ==> (r^--1)^++ x y"
   463 lemma tranclp_converseI: "(r^++)^--1 x y ==> (r^--1)^++ x y"
   477   apply (drule conversepD)
   464   apply (drule conversepD)
   478   apply (erule tranclp_induct)
   465   apply (erule tranclp_induct)
   479   apply (iprover intro: conversepI tranclp_trans)+
   466   apply (iprover intro: conversepI tranclp_trans)+
   600 lemma trancl_unfold_right: "r^+ = r^* O r"
   587 lemma trancl_unfold_right: "r^+ = r^* O r"
   601 by (auto dest: tranclD2 intro: rtrancl_into_trancl1)
   588 by (auto dest: tranclD2 intro: rtrancl_into_trancl1)
   602 
   589 
   603 lemma trancl_unfold_left: "r^+ = r O r^*"
   590 lemma trancl_unfold_left: "r^+ = r O r^*"
   604 by (auto dest: tranclD intro: rtrancl_into_trancl2)
   591 by (auto dest: tranclD intro: rtrancl_into_trancl2)
       
   592 
       
   593 lemma trancl_insert:
       
   594   "(insert (y, x) r)^+ = r^+ \<union> {(a, b). (a, y) \<in> r^* \<and> (x, b) \<in> r^*}"
       
   595   -- {* primitive recursion for @{text trancl} over finite relations *}
       
   596   apply (rule equalityI)
       
   597    apply (rule subsetI)
       
   598    apply (simp only: split_tupled_all)
       
   599    apply (erule trancl_induct, blast)
       
   600    apply (blast intro: rtrancl_into_trancl1 trancl_into_rtrancl trancl_trans)
       
   601   apply (rule subsetI)
       
   602   apply (blast intro: trancl_mono rtrancl_mono
       
   603     [THEN [2] rev_subsetD] rtrancl_trancl_trancl rtrancl_into_trancl2)
       
   604   done
       
   605 
       
   606 lemma trancl_insert2:
       
   607   "(insert (a,b) r)^+ = r^+ \<union> {(x,y). ((x,a) : r^+ \<or> x=a) \<and> ((b,y) \<in> r^+ \<or> y=b)}"
       
   608 by(auto simp add: trancl_insert rtrancl_eq_or_trancl)
       
   609 
       
   610 lemma rtrancl_insert:
       
   611   "(insert (a,b) r)^* = r^* \<union> {(x,y). (x,a) : r^* \<and> (b,y) \<in> r^*}"
       
   612 using trancl_insert[of a b r]
       
   613 by(simp add: rtrancl_trancl_reflcl del: reflcl_trancl) blast
   605 
   614 
   606 
   615 
   607 text {* Simplifying nested closures *}
   616 text {* Simplifying nested closures *}
   608 
   617 
   609 lemma rtrancl_trancl_absorb[simp]: "(R^*)^+ = R^*"
   618 lemma rtrancl_trancl_absorb[simp]: "(R^*)^+ = R^*"