undid split_comp_eq[simp] because it leads to nontermination together with split_def!
authornipkow
Mon, 05 Jan 2004 00:46:06 +0100
changeset 14337 e13731554e50
parent 14336 8f731d3cd65b
child 14338 a1add2de7601
undid split_comp_eq[simp] because it leads to nontermination together with split_def!
src/HOL/Product_Type.thy
src/HOL/Transitive_Closure.thy
--- a/src/HOL/Product_Type.thy	Sat Jan 03 16:09:39 2004 +0100
+++ b/src/HOL/Product_Type.thy	Mon Jan 05 00:46:06 2004 +0100
@@ -484,7 +484,11 @@
   apply (rule ext, blast)
   done
 
-lemma split_comp_eq [simp]: 
+(* Do NOT make this a simp rule as it
+   a) only helps in special situations
+   b) can lead to nontermination in the presence of split_def
+*)
+lemma split_comp_eq: 
 "(%u. f (g (fst u)) (snd u)) = (split (%x. f (g x)))"
 by (rule ext, auto)
 
--- a/src/HOL/Transitive_Closure.thy	Sat Jan 03 16:09:39 2004 +0100
+++ b/src/HOL/Transitive_Closure.thy	Mon Jan 05 00:46:06 2004 +0100
@@ -402,6 +402,16 @@
 text {* More about converse @{text rtrancl} and @{text trancl}, should
   be merged with main body. *}
 
+lemma single_valued_confluent:
+  "\<lbrakk> single_valued r; (x,y) \<in> r^*; (x,z) \<in> r^* \<rbrakk>
+  \<Longrightarrow> (y,z) \<in> r^* \<or> (z,y) \<in> r^*"
+apply(erule rtrancl_induct)
+ apply simp
+apply(erule disjE)
+ apply(blast elim:converse_rtranclE dest:single_valuedD)
+apply(blast intro:rtrancl_trans)
+done
+
 lemma r_r_into_trancl: "(a, b) \<in> R ==> (b, c) \<in> R ==> (a, c) \<in> R^+"
   by (fast intro: trancl_trans)