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^*" |