--- 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