70 apply (safe del: subsetI intro!: equalityI equiv_class_subset) |
70 apply (safe del: subsetI intro!: equalityI equiv_class_subset) |
71 apply (unfold sym_def, blast) |
71 apply (unfold sym_def, blast) |
72 done |
72 done |
73 |
73 |
74 lemma equiv_class_self: |
74 lemma equiv_class_self: |
75 "[| equiv(A,r); a: A |] ==> a: r``{a}" |
75 "[| equiv(A,r); a \<in> A |] ==> a \<in> r``{a}" |
76 by (unfold equiv_def refl_def, blast) |
76 by (unfold equiv_def refl_def, blast) |
77 |
77 |
78 (*Lemma for the next result*) |
78 (*Lemma for the next result*) |
79 lemma subset_equiv_class: |
79 lemma subset_equiv_class: |
80 "[| equiv(A,r); r``{b} \<subseteq> r``{a}; b: A |] ==> <a,b>: r" |
80 "[| equiv(A,r); r``{b} \<subseteq> r``{a}; b \<in> A |] ==> <a,b>: r" |
81 by (unfold equiv_def refl_def, blast) |
81 by (unfold equiv_def refl_def, blast) |
82 |
82 |
83 lemma eq_equiv_class: "[| r``{a} = r``{b}; equiv(A,r); b: A |] ==> <a,b>: r" |
83 lemma eq_equiv_class: "[| r``{a} = r``{b}; equiv(A,r); b \<in> A |] ==> <a,b>: r" |
84 by (assumption | rule equalityD2 subset_equiv_class)+ |
84 by (assumption | rule equalityD2 subset_equiv_class)+ |
85 |
85 |
86 (*thus r``{a} = r``{b} as well*) |
86 (*thus r``{a} = r``{b} as well*) |
87 lemma equiv_class_nondisjoint: |
87 lemma equiv_class_nondisjoint: |
88 "[| equiv(A,r); x: (r``{a} \<inter> r``{b}) |] ==> <a,b>: r" |
88 "[| equiv(A,r); x: (r``{a} \<inter> r``{b}) |] ==> <a,b>: r" |
90 |
90 |
91 lemma equiv_type: "equiv(A,r) ==> r \<subseteq> A*A" |
91 lemma equiv_type: "equiv(A,r) ==> r \<subseteq> A*A" |
92 by (unfold equiv_def, blast) |
92 by (unfold equiv_def, blast) |
93 |
93 |
94 lemma equiv_class_eq_iff: |
94 lemma equiv_class_eq_iff: |
95 "equiv(A,r) ==> <x,y>: r \<longleftrightarrow> r``{x} = r``{y} & x:A & y:A" |
95 "equiv(A,r) ==> <x,y>: r \<longleftrightarrow> r``{x} = r``{y} & x \<in> A & y \<in> A" |
96 by (blast intro: eq_equiv_class equiv_class_eq dest: equiv_type) |
96 by (blast intro: eq_equiv_class equiv_class_eq dest: equiv_type) |
97 |
97 |
98 lemma eq_equiv_class_iff: |
98 lemma eq_equiv_class_iff: |
99 "[| equiv(A,r); x: A; y: A |] ==> r``{x} = r``{y} \<longleftrightarrow> <x,y>: r" |
99 "[| equiv(A,r); x \<in> A; y \<in> A |] ==> r``{x} = r``{y} \<longleftrightarrow> <x,y>: r" |
100 by (blast intro: eq_equiv_class equiv_class_eq dest: equiv_type) |
100 by (blast intro: eq_equiv_class equiv_class_eq dest: equiv_type) |
101 |
101 |
102 (*** Quotients ***) |
102 (*** Quotients ***) |
103 |
103 |
104 (** Introduction/elimination rules -- needed? **) |
104 (** Introduction/elimination rules -- needed? **) |
105 |
105 |
106 lemma quotientI [TC]: "x:A ==> r``{x}: A//r" |
106 lemma quotientI [TC]: "x \<in> A ==> r``{x}: A//r" |
107 apply (unfold quotient_def) |
107 apply (unfold quotient_def) |
108 apply (erule RepFunI) |
108 apply (erule RepFunI) |
109 done |
109 done |
110 |
110 |
111 lemma quotientE: |
111 lemma quotientE: |
112 "[| X: A//r; !!x. [| X = r``{x}; x:A |] ==> P |] ==> P" |
112 "[| X \<in> A//r; !!x. [| X = r``{x}; x \<in> A |] ==> P |] ==> P" |
113 by (unfold quotient_def, blast) |
113 by (unfold quotient_def, blast) |
114 |
114 |
115 lemma Union_quotient: |
115 lemma Union_quotient: |
116 "equiv(A,r) ==> \<Union>(A//r) = A" |
116 "equiv(A,r) ==> \<Union>(A//r) = A" |
117 by (unfold equiv_def refl_def quotient_def, blast) |
117 by (unfold equiv_def refl_def quotient_def, blast) |
118 |
118 |
119 lemma quotient_disj: |
119 lemma quotient_disj: |
120 "[| equiv(A,r); X: A//r; Y: A//r |] ==> X=Y | (X \<inter> Y \<subseteq> 0)" |
120 "[| equiv(A,r); X \<in> A//r; Y \<in> A//r |] ==> X=Y | (X \<inter> Y \<subseteq> 0)" |
121 apply (unfold quotient_def) |
121 apply (unfold quotient_def) |
122 apply (safe intro!: equiv_class_eq, assumption) |
122 apply (safe intro!: equiv_class_eq, assumption) |
123 apply (unfold equiv_def trans_def sym_def, blast) |
123 apply (unfold equiv_def trans_def sym_def, blast) |
124 done |
124 done |
125 |
125 |
128 (** 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) |
129 **) |
129 **) |
130 |
130 |
131 (*Conversion rule*) |
131 (*Conversion rule*) |
132 lemma UN_equiv_class: |
132 lemma UN_equiv_class: |
133 "[| equiv(A,r); b respects r; a: A |] ==> (\<Union>x\<in>r``{a}. b(x)) = b(a)" |
133 "[| equiv(A,r); b respects r; a \<in> A |] ==> (\<Union>x\<in>r``{a}. b(x)) = b(a)" |
134 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)") |
135 apply simp |
135 apply simp |
136 apply (blast intro: equiv_class_self) |
136 apply (blast intro: equiv_class_self) |
137 apply (unfold equiv_def sym_def congruent_def, blast) |
137 apply (unfold equiv_def sym_def congruent_def, blast) |
138 done |
138 done |
139 |
139 |
140 (*type checking of @{term"\<Union>x\<in>r``{a}. b(x)"} *) |
140 (*type checking of @{term"\<Union>x\<in>r``{a}. b(x)"} *) |
141 lemma UN_equiv_class_type: |
141 lemma UN_equiv_class_type: |
142 "[| equiv(A,r); b respects r; X: A//r; !!x. x \<in> A ==> b(x) \<in> B |] |
142 "[| equiv(A,r); b respects r; X \<in> A//r; !!x. x \<in> A ==> b(x) \<in> B |] |
143 ==> (\<Union>x\<in>X. b(x)) \<in> B" |
143 ==> (\<Union>x\<in>X. b(x)) \<in> B" |
144 apply (unfold quotient_def, safe) |
144 apply (unfold quotient_def, safe) |
145 apply (simp (no_asm_simp) add: UN_equiv_class) |
145 apply (simp (no_asm_simp) add: UN_equiv_class) |
146 done |
146 done |
147 |
147 |
148 (*Sufficient conditions for injectiveness. Could weaken premises! |
148 (*Sufficient conditions for injectiveness. Could weaken premises! |
149 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 \<in> A ==> b(y):B |
150 *) |
150 *) |
151 lemma UN_equiv_class_inject: |
151 lemma UN_equiv_class_inject: |
152 "[| equiv(A,r); b respects r; |
152 "[| equiv(A,r); b respects r; |
153 (\<Union>x\<in>X. b(x))=(\<Union>y\<in>Y. b(y)); X: A//r; Y: A//r; |
153 (\<Union>x\<in>X. b(x))=(\<Union>y\<in>Y. b(y)); X \<in> A//r; Y \<in> A//r; |
154 !!x y. [| x:A; y:A; b(x)=b(y) |] ==> <x,y>:r |] |
154 !!x y. [| x \<in> A; y \<in> A; b(x)=b(y) |] ==> <x,y>:r |] |
155 ==> X=Y" |
155 ==> X=Y" |
156 apply (unfold quotient_def, safe) |
156 apply (unfold quotient_def, safe) |
157 apply (rule equiv_class_eq, assumption) |
157 apply (rule equiv_class_eq, assumption) |
158 apply (simp add: UN_equiv_class [of A r b]) |
158 apply (simp add: UN_equiv_class [of A r b]) |
159 done |
159 done |
160 |
160 |
161 |
161 |
162 subsection{*Defining Binary Operations upon Equivalence Classes*} |
162 subsection{*Defining Binary Operations upon Equivalence Classes*} |
163 |
163 |
164 lemma congruent2_implies_congruent: |
164 lemma congruent2_implies_congruent: |
165 "[| equiv(A,r1); congruent2(r1,r2,b); a: A |] ==> congruent(r2,b(a))" |
165 "[| equiv(A,r1); congruent2(r1,r2,b); a \<in> A |] ==> congruent(r2,b(a))" |
166 by (unfold congruent_def congruent2_def equiv_def refl_def, blast) |
166 by (unfold congruent_def congruent2_def equiv_def refl_def, blast) |
167 |
167 |
168 lemma congruent2_implies_congruent_UN: |
168 lemma congruent2_implies_congruent_UN: |
169 "[| equiv(A1,r1); equiv(A2,r2); congruent2(r1,r2,b); a: A2 |] ==> |
169 "[| equiv(A1,r1); equiv(A2,r2); congruent2(r1,r2,b); a \<in> A2 |] ==> |
170 congruent(r1, %x1. \<Union>x2 \<in> r2``{a}. b(x1,x2))" |
170 congruent(r1, %x1. \<Union>x2 \<in> r2``{a}. b(x1,x2))" |
171 apply (unfold congruent_def, safe) |
171 apply (unfold congruent_def, safe) |
172 apply (frule equiv_type [THEN subsetD], assumption) |
172 apply (frule equiv_type [THEN subsetD], assumption) |
173 apply clarify |
173 apply clarify |
174 apply (simp add: UN_equiv_class congruent2_implies_congruent) |
174 apply (simp add: UN_equiv_class congruent2_implies_congruent) |
204 apply (blast intro: trans) |
204 apply (blast intro: trans) |
205 done |
205 done |
206 |
206 |
207 lemma congruent2_commuteI: |
207 lemma congruent2_commuteI: |
208 assumes equivA: "equiv(A,r)" |
208 assumes equivA: "equiv(A,r)" |
209 and commute: "!! y z. [| y: A; z: A |] ==> b(y,z) = b(z,y)" |
209 and commute: "!! y z. [| y \<in> A; z \<in> A |] ==> b(y,z) = b(z,y)" |
210 and congt: "!! y z w. [| w: A; <y,z>: r |] ==> b(w,y) = b(w,z)" |
210 and congt: "!! y z w. [| w \<in> A; <y,z>: r |] ==> b(w,y) = b(w,z)" |
211 shows "b respects2 r" |
211 shows "b respects2 r" |
212 apply (insert equivA [THEN equiv_type, THEN subsetD]) |
212 apply (insert equivA [THEN equiv_type, THEN subsetD]) |
213 apply (rule congruent2I [OF equivA equivA]) |
213 apply (rule congruent2I [OF equivA equivA]) |
214 apply (rule commute [THEN trans]) |
214 apply (rule commute [THEN trans]) |
215 apply (rule_tac [3] commute [THEN trans, symmetric]) |
215 apply (rule_tac [3] commute [THEN trans, symmetric]) |
217 apply (blast intro: congt)+ |
217 apply (blast intro: congt)+ |
218 done |
218 done |
219 |
219 |
220 (*Obsolete?*) |
220 (*Obsolete?*) |
221 lemma congruent_commuteI: |
221 lemma congruent_commuteI: |
222 "[| equiv(A,r); Z: A//r; |
222 "[| equiv(A,r); Z \<in> A//r; |
223 !!w. [| w: A |] ==> congruent(r, %z. b(w,z)); |
223 !!w. [| w \<in> A |] ==> congruent(r, %z. b(w,z)); |
224 !!x y. [| x: A; y: A |] ==> b(y,x) = b(x,y) |
224 !!x y. [| x \<in> A; y \<in> A |] ==> b(y,x) = b(x,y) |
225 |] ==> congruent(r, %w. \<Union>z\<in>Z. b(w,z))" |
225 |] ==> congruent(r, %w. \<Union>z\<in>Z. b(w,z))" |
226 apply (simp (no_asm) add: congruent_def) |
226 apply (simp (no_asm) add: congruent_def) |
227 apply (safe elim!: quotientE) |
227 apply (safe elim!: quotientE) |
228 apply (frule equiv_type [THEN subsetD], assumption) |
228 apply (frule equiv_type [THEN subsetD], assumption) |
229 apply (simp add: UN_equiv_class [of A r]) |
229 apply (simp add: UN_equiv_class [of A r]) |