61 lemma rtrancl_into_rtrancl2: |
61 lemma rtrancl_into_rtrancl2: |
62 "\<lbrakk> (a, b) \<in> r; (b, c) \<in> r^* \<rbrakk> \<Longrightarrow> (a, c) \<in> r^*" |
62 "\<lbrakk> (a, b) \<in> r; (b, c) \<in> r^* \<rbrakk> \<Longrightarrow> (a, c) \<in> r^*" |
63 by (auto intro: r_into_rtrancl rtrancl_trans) |
63 by (auto intro: r_into_rtrancl rtrancl_trans) |
64 |
64 |
65 lemma triangle_lemma: |
65 lemma triangle_lemma: |
66 "\<lbrakk> \<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c; (a,x)\<in>r*; (a,y)\<in>r*\<rbrakk> |
66 "\<lbrakk> \<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c; (a,x)\<in>r\<^sup>*; (a,y)\<in>r\<^sup>*\<rbrakk> |
67 \<Longrightarrow> (x,y)\<in>r* \<or> (y,x)\<in>r*" |
67 \<Longrightarrow> (x,y)\<in>r\<^sup>* \<or> (y,x)\<in>r\<^sup>*" |
68 proof - |
68 proof - |
69 note converse_rtrancl_induct = converse_rtrancl_induct [consumes 1] |
69 note converse_rtrancl_induct = converse_rtrancl_induct [consumes 1] |
70 note converse_rtranclE = converse_rtranclE [consumes 1] |
70 note converse_rtranclE = converse_rtranclE [consumes 1] |
71 assume unique: "\<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c" |
71 assume unique: "\<And> a b c. \<lbrakk>(a,b)\<in>r; (a,c)\<in>r\<rbrakk> \<Longrightarrow> b=c" |
72 assume "(a,x)\<in>r*" |
72 assume "(a,x)\<in>r\<^sup>*" |
73 then show "(a,y)\<in>r* \<Longrightarrow> (x,y)\<in>r* \<or> (y,x)\<in>r*" |
73 then show "(a,y)\<in>r\<^sup>* \<Longrightarrow> (x,y)\<in>r\<^sup>* \<or> (y,x)\<in>r\<^sup>*" |
74 proof (induct rule: converse_rtrancl_induct) |
74 proof (induct rule: converse_rtrancl_induct) |
75 assume "(x,y)\<in>r*" |
75 assume "(x,y)\<in>r\<^sup>*" |
76 then show ?thesis |
76 then show ?thesis |
77 by blast |
77 by blast |
78 next |
78 next |
79 fix a v |
79 fix a v |
80 assume a_v_r: "(a, v) \<in> r" and |
80 assume a_v_r: "(a, v) \<in> r" and |
81 v_x_rt: "(v, x) \<in> r*" and |
81 v_x_rt: "(v, x) \<in> r\<^sup>*" and |
82 a_y_rt: "(a, y) \<in> r*" and |
82 a_y_rt: "(a, y) \<in> r\<^sup>*" and |
83 hyp: "(v, y) \<in> r* \<Longrightarrow> (x, y) \<in> r* \<or> (y, x) \<in> r*" |
83 hyp: "(v, y) \<in> r\<^sup>* \<Longrightarrow> (x, y) \<in> r\<^sup>* \<or> (y, x) \<in> r\<^sup>*" |
84 from a_y_rt |
84 from a_y_rt |
85 show "(x, y) \<in> r* \<or> (y, x) \<in> r*" |
85 show "(x, y) \<in> r\<^sup>* \<or> (y, x) \<in> r\<^sup>*" |
86 proof (cases rule: converse_rtranclE) |
86 proof (cases rule: converse_rtranclE) |
87 assume "a=y" |
87 assume "a=y" |
88 with a_v_r v_x_rt have "(y,x) \<in> r*" |
88 with a_v_r v_x_rt have "(y,x) \<in> r\<^sup>*" |
89 by (auto intro: r_into_rtrancl rtrancl_trans) |
89 by (auto intro: r_into_rtrancl rtrancl_trans) |
90 then show ?thesis |
90 then show ?thesis |
91 by blast |
91 by blast |
92 next |
92 next |
93 fix w |
93 fix w |
94 assume a_w_r: "(a, w) \<in> r" and |
94 assume a_w_r: "(a, w) \<in> r" and |
95 w_y_rt: "(w, y) \<in> r*" |
95 w_y_rt: "(w, y) \<in> r\<^sup>*" |
96 from a_v_r a_w_r unique |
96 from a_v_r a_w_r unique |
97 have "v=w" |
97 have "v=w" |
98 by auto |
98 by auto |
99 with w_y_rt hyp |
99 with w_y_rt hyp |
100 show ?thesis |
100 show ?thesis |