Added Church-Rosser
authornipkow
Sun, 28 May 1995 17:18:06 +0200
changeset 1131 8e81ad0c6f12
parent 1130 0df0df1685a8
child 1132 dfb29abcf3c2
Added Church-Rosser
src/HOL/Lambda/Confluence.ML
src/HOL/Lambda/Confluence.thy
--- a/src/HOL/Lambda/Confluence.ML	Sun May 28 17:17:43 1995 +0200
+++ b/src/HOL/Lambda/Confluence.ML	Sun May 28 17:18:06 1995 +0200
@@ -12,7 +12,7 @@
   "!!R. confluent1(R) ==> diamond(R^*)";
 by(strip_tac 1);
 be rtrancl_induct 1;
-by(ALLGOALS(fast_tac (HOL_cs addIs [rtrancl_refl] addEs [rtrancl_trans])));
+by(ALLGOALS(fast_tac (trancl_cs addEs [rtrancl_trans])));
 qed "confluent1_diamond";
 
 goalw Confluence.thy [confluent1_def,confluent2_def]
@@ -24,7 +24,7 @@
   "!!R. diamond(R) ==> confluent2(R)";
 by(strip_tac 1);
 be rtrancl_induct 1;
-by(fast_tac (HOL_cs addSIs [rtrancl_refl]) 1);
+by(fast_tac trancl_cs 1);
 by(fast_tac (HOL_cs addSEs [rtrancl_into_rtrancl]) 1);
 qed "diamond_confluent2";
 
@@ -37,3 +37,21 @@
                     addDs [subset_antisym]
                     addss (HOL_ss addsimps [rtrancl_idemp])) 1);
 qed "diamond_to_confluence";
+
+goalw Confluence.thy [confluent_def,diamond_def,Church_Rosser_def]
+  "Church_Rosser(R) = confluent(R)";
+br iffI 1;
+ by(safe_tac HOL_cs);
+ be allE 1;
+ be allE 1;
+ be mp 1;
+ br rtrancl_trans 1;
+  br (Un_upper2 RS rtrancl_mono RS subsetD) 1;
+  br rtrancl_converseI 1;
+  be converseI 1;
+ be (Un_upper1 RS rtrancl_mono RS subsetD) 1;
+be rtrancl_induct 1;
+ by(fast_tac trancl_cs 1);
+ by(slow_tac (rel_cs addIs [r_into_rtrancl]
+                     addEs [rtrancl_trans,r_into_rtrancl RS rtrancl_trans]) 1);
+qed "Church_Rosser_confluent";
--- a/src/HOL/Lambda/Confluence.thy	Sun May 28 17:17:43 1995 +0200
+++ b/src/HOL/Lambda/Confluence.thy	Sun May 28 17:18:06 1995 +0200
@@ -9,7 +9,8 @@
 Confluence = Trancl +
 
 consts
-  confluent, confluent1, confluent2, diamond :: "('a*'a)set => bool"
+  confluent, confluent1, confluent2, diamond, Church_Rosser ::
+  "('a*'a)set => bool"
 
 defs
   diamond_def
@@ -25,4 +26,6 @@
   "confluent2(R) ==
    !x y z. (x,y):R --> (x,z):R^* --> (EX u. (y,u):R^* & (z,u):R)"
 
+  Church_Rosser_def "Church_Rosser(R) ==   \
+\ !x y. (x,y) : (R Un converse(R))^* --> (? z. (x,z) : R^* & (y,z) : R^*)"
 end