15 "A//r == {r``{x} . x:A}" |
15 "A//r == {r``{x} . x:A}" |
16 |
16 |
17 congruent :: "[i,i=>i]=>o" |
17 congruent :: "[i,i=>i]=>o" |
18 "congruent(r,b) == ALL y z. <y,z>:r --> b(y)=b(z)" |
18 "congruent(r,b) == ALL y z. <y,z>:r --> b(y)=b(z)" |
19 |
19 |
20 congruent2 :: "[i,[i,i]=>i]=>o" |
20 congruent2 :: "[i,i,[i,i]=>i]=>o" |
21 "congruent2(r,b) == ALL y1 z1 y2 z2. |
21 "congruent2(r1,r2,b) == ALL y1 z1 y2 z2. |
22 <y1,z1>:r --> <y2,z2>:r --> b(y1,y2) = b(z1,z2)" |
22 <y1,z1>:r1 --> <y2,z2>:r2 --> b(y1,y2) = b(z1,z2)" |
|
23 |
|
24 syntax |
|
25 RESPECTS ::"[i=>i, i] => o" (infixr "respects" 80) |
|
26 RESPECTS2 ::"[i=>i, i] => o" (infixr "respects2 " 80) |
|
27 --{*Abbreviation for the common case where the relations are identical*} |
|
28 |
|
29 translations |
|
30 "f respects r" == "congruent(r,f)" |
|
31 "f respects2 r" => "congruent2(r,r,f)" |
23 |
32 |
24 subsection{*Suppes, Theorem 70: |
33 subsection{*Suppes, Theorem 70: |
25 @{term r} is an equiv relation iff @{term "converse(r) O r = r"}*} |
34 @{term r} is an equiv relation iff @{term "converse(r) O r = r"}*} |
26 |
35 |
27 (** first half: equiv(A,r) ==> converse(r) O r = r **) |
36 (** first half: equiv(A,r) ==> converse(r) O r = r **) |
28 |
37 |
29 lemma sym_trans_comp_subset: |
38 lemma sym_trans_comp_subset: |
30 "[| sym(r); trans(r) |] ==> converse(r) O r <= r" |
39 "[| sym(r); trans(r) |] ==> converse(r) O r <= r" |
31 apply (unfold trans_def sym_def, blast) |
40 by (unfold trans_def sym_def, blast) |
32 done |
|
33 |
41 |
34 lemma refl_comp_subset: |
42 lemma refl_comp_subset: |
35 "[| refl(A,r); r <= A*A |] ==> r <= converse(r) O r" |
43 "[| refl(A,r); r <= A*A |] ==> r <= converse(r) O r" |
36 apply (unfold refl_def, blast) |
44 by (unfold refl_def, blast) |
37 done |
|
38 |
45 |
39 lemma equiv_comp_eq: |
46 lemma equiv_comp_eq: |
40 "equiv(A,r) ==> converse(r) O r = r" |
47 "equiv(A,r) ==> converse(r) O r = r" |
41 apply (unfold equiv_def) |
48 apply (unfold equiv_def) |
42 apply (blast del: subsetI |
49 apply (blast del: subsetI intro!: sym_trans_comp_subset refl_comp_subset) |
43 intro!: sym_trans_comp_subset refl_comp_subset) |
|
44 done |
50 done |
45 |
51 |
46 (*second half*) |
52 (*second half*) |
47 lemma comp_equivI: |
53 lemma comp_equivI: |
48 "[| converse(r) O r = r; domain(r) = A |] ==> equiv(A,r)" |
54 "[| converse(r) O r = r; domain(r) = A |] ==> equiv(A,r)" |
122 (** Could have a locale with the premises equiv(A,r) and congruent(r,b) |
128 (** Could have a locale with the premises equiv(A,r) and congruent(r,b) |
123 **) |
129 **) |
124 |
130 |
125 (*Conversion rule*) |
131 (*Conversion rule*) |
126 lemma UN_equiv_class: |
132 lemma UN_equiv_class: |
127 "[| equiv(A,r); congruent(r,b); a: A |] ==> (UN x:r``{a}. b(x)) = b(a)" |
133 "[| equiv(A,r); b respects r; a: A |] ==> (UN x:r``{a}. b(x)) = b(a)" |
128 apply (subgoal_tac "\<forall>x \<in> r``{a}. b(x) = b(a)") |
134 apply (subgoal_tac "\<forall>x \<in> r``{a}. b(x) = b(a)") |
129 apply simp |
135 apply simp |
130 apply (blast intro: equiv_class_self) |
136 apply (blast intro: equiv_class_self) |
131 apply (unfold equiv_def sym_def congruent_def, blast) |
137 apply (unfold equiv_def sym_def congruent_def, blast) |
132 done |
138 done |
133 |
139 |
134 (*type checking of UN x:r``{a}. b(x) *) |
140 (*type checking of UN x:r``{a}. b(x) *) |
135 lemma UN_equiv_class_type: |
141 lemma UN_equiv_class_type: |
136 "[| equiv(A,r); congruent(r,b); X: A//r; !!x. x : A ==> b(x) : B |] |
142 "[| equiv(A,r); b respects r; X: A//r; !!x. x : A ==> b(x) : B |] |
137 ==> (UN x:X. b(x)) : B" |
143 ==> (UN x:X. b(x)) : B" |
138 apply (unfold quotient_def, safe) |
144 apply (unfold quotient_def, safe) |
139 apply (simp (no_asm_simp) add: UN_equiv_class) |
145 apply (simp (no_asm_simp) add: UN_equiv_class) |
140 done |
146 done |
141 |
147 |
142 (*Sufficient conditions for injectiveness. Could weaken premises! |
148 (*Sufficient conditions for injectiveness. Could weaken premises! |
143 major premise could be an inclusion; bcong could be !!y. y:A ==> b(y):B |
149 major premise could be an inclusion; bcong could be !!y. y:A ==> b(y):B |
144 *) |
150 *) |
145 lemma UN_equiv_class_inject: |
151 lemma UN_equiv_class_inject: |
146 "[| equiv(A,r); congruent(r,b); |
152 "[| equiv(A,r); b respects r; |
147 (UN x:X. b(x))=(UN y:Y. b(y)); X: A//r; Y: A//r; |
153 (UN x:X. b(x))=(UN y:Y. b(y)); X: A//r; Y: A//r; |
148 !!x y. [| x:A; y:A; b(x)=b(y) |] ==> <x,y>:r |] |
154 !!x y. [| x:A; y:A; b(x)=b(y) |] ==> <x,y>:r |] |
149 ==> X=Y" |
155 ==> X=Y" |
150 apply (unfold quotient_def, safe) |
156 apply (unfold quotient_def, safe) |
151 apply (rule equiv_class_eq, assumption) |
157 apply (rule equiv_class_eq, assumption) |
154 |
160 |
155 |
161 |
156 subsection{*Defining Binary Operations upon Equivalence Classes*} |
162 subsection{*Defining Binary Operations upon Equivalence Classes*} |
157 |
163 |
158 lemma congruent2_implies_congruent: |
164 lemma congruent2_implies_congruent: |
159 "[| equiv(A,r); congruent2(r,b); a: A |] ==> congruent(r,b(a))" |
165 "[| equiv(A,r1); congruent2(r1,r2,b); a: A |] ==> congruent(r2,b(a))" |
160 by (unfold congruent_def congruent2_def equiv_def refl_def, blast) |
166 by (unfold congruent_def congruent2_def equiv_def refl_def, blast) |
161 |
167 |
162 lemma congruent2_implies_congruent_UN: |
168 lemma congruent2_implies_congruent_UN: |
163 "[| equiv(A,r); congruent2(r,b); a: A |] ==> |
169 "[| equiv(A1,r1); equiv(A2,r2); congruent2(r1,r2,b); a: A2 |] ==> |
164 congruent(r, %x1. UN x2:r``{a}. b(x1,x2))" |
170 congruent(r1, %x1. \<Union>x2 \<in> r2``{a}. b(x1,x2))" |
165 apply (unfold congruent_def, safe) |
171 apply (unfold congruent_def, safe) |
166 apply (frule equiv_type [THEN subsetD], assumption) |
172 apply (frule equiv_type [THEN subsetD], assumption) |
167 apply clarify |
173 apply clarify |
168 apply (simp add: UN_equiv_class [of A r] congruent2_implies_congruent) |
174 apply (simp add: UN_equiv_class congruent2_implies_congruent) |
169 apply (unfold congruent2_def equiv_def refl_def, blast) |
175 apply (unfold congruent2_def equiv_def refl_def, blast) |
170 done |
176 done |
171 |
177 |
172 lemma UN_equiv_class2: |
178 lemma UN_equiv_class2: |
173 "[| equiv(A,r); congruent2(r,b); a1: A; a2: A |] |
179 "[| equiv(A1,r1); equiv(A2,r2); congruent2(r1,r2,b); a1: A1; a2: A2 |] |
174 ==> (UN x1:r``{a1}. UN x2:r``{a2}. b(x1,x2)) = b(a1,a2)" |
180 ==> (\<Union>x1 \<in> r1``{a1}. \<Union>x2 \<in> r2``{a2}. b(x1,x2)) = b(a1,a2)" |
175 by (simp add: UN_equiv_class [of A r] congruent2_implies_congruent |
181 by (simp add: UN_equiv_class congruent2_implies_congruent |
176 congruent2_implies_congruent_UN) |
182 congruent2_implies_congruent_UN) |
177 |
183 |
178 (*type checking*) |
184 (*type checking*) |
179 lemma UN_equiv_class_type2: |
185 lemma UN_equiv_class_type2: |
180 "[| equiv(A,r); congruent2(r,b); |
186 "[| equiv(A,r); b respects2 r; |
181 X1: A//r; X2: A//r; |
187 X1: A//r; X2: A//r; |
182 !!x1 x2. [| x1: A; x2: A |] ==> b(x1,x2) : B |
188 !!x1 x2. [| x1: A; x2: A |] ==> b(x1,x2) : B |
183 |] ==> (UN x1:X1. UN x2:X2. b(x1,x2)) : B" |
189 |] ==> (UN x1:X1. UN x2:X2. b(x1,x2)) : B" |
184 apply (unfold quotient_def, safe) |
190 apply (unfold quotient_def, safe) |
185 apply (blast intro: UN_equiv_class_type congruent2_implies_congruent_UN |
191 apply (blast intro: UN_equiv_class_type congruent2_implies_congruent_UN |
188 |
194 |
189 |
195 |
190 (*Suggested by John Harrison -- the two subproofs may be MUCH simpler |
196 (*Suggested by John Harrison -- the two subproofs may be MUCH simpler |
191 than the direct proof*) |
197 than the direct proof*) |
192 lemma congruent2I: |
198 lemma congruent2I: |
193 "[| equiv(A,r); |
199 "[| equiv(A1,r1); equiv(A2,r2); |
194 !! y z w. [| w: A; <y,z> : r |] ==> b(y,w) = b(z,w); |
200 !! y z w. [| w \<in> A2; <y,z> \<in> r1 |] ==> b(y,w) = b(z,w); |
195 !! y z w. [| w: A; <y,z> : r |] ==> b(w,y) = b(w,z) |
201 !! y z w. [| w \<in> A1; <y,z> \<in> r2 |] ==> b(w,y) = b(w,z) |
196 |] ==> congruent2(r,b)" |
202 |] ==> congruent2(r1,r2,b)" |
197 apply (unfold congruent2_def equiv_def refl_def, safe) |
203 apply (unfold congruent2_def equiv_def refl_def, safe) |
198 apply (blast intro: trans) |
204 apply (blast intro: trans) |
199 done |
205 done |
200 |
206 |
201 lemma congruent2_commuteI: |
207 lemma congruent2_commuteI: |
202 assumes equivA: "equiv(A,r)" |
208 assumes equivA: "equiv(A,r)" |
203 and commute: "!! y z. [| y: A; z: A |] ==> b(y,z) = b(z,y)" |
209 and commute: "!! y z. [| y: A; z: A |] ==> b(y,z) = b(z,y)" |
204 and congt: "!! y z w. [| w: A; <y,z>: r |] ==> b(w,y) = b(w,z)" |
210 and congt: "!! y z w. [| w: A; <y,z>: r |] ==> b(w,y) = b(w,z)" |
205 shows "congruent2(r,b)" |
211 shows "b respects2 r" |
206 apply (insert equivA [THEN equiv_type, THEN subsetD]) |
212 apply (insert equivA [THEN equiv_type, THEN subsetD]) |
207 apply (rule congruent2I [OF equivA]) |
213 apply (rule congruent2I [OF equivA equivA]) |
208 apply (rule commute [THEN trans]) |
214 apply (rule commute [THEN trans]) |
209 apply (rule_tac [3] commute [THEN trans, symmetric]) |
215 apply (rule_tac [3] commute [THEN trans, symmetric]) |
210 apply (rule_tac [5] sym) |
216 apply (rule_tac [5] sym) |
211 apply (blast intro: congt)+ |
217 apply (blast intro: congt)+ |
212 done |
218 done |