src/ZF/Integ/EquivClass.thy
changeset 15182 5cea84e10f3e
parent 14095 a1ba833d6b61
child 16417 9bc16273c2d4
equal deleted inserted replaced
15181:8d9575d1caa7 15182:5cea84e10f3e
    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