src/ZF/EquivClass.thy
changeset 46953 2b6e55924af3
parent 46821 ff6b0c1087f2
child 58871 c399ae4b836f
equal deleted inserted replaced
46952:5e1bcfdcb175 46953:2b6e55924af3
     7 
     7 
     8 theory EquivClass imports Trancl Perm begin
     8 theory EquivClass imports Trancl Perm begin
     9 
     9 
    10 definition
    10 definition
    11   quotient   :: "[i,i]=>i"    (infixl "'/'/" 90)  (*set of equiv classes*)  where
    11   quotient   :: "[i,i]=>i"    (infixl "'/'/" 90)  (*set of equiv classes*)  where
    12       "A//r == {r``{x} . x:A}"
    12       "A//r == {r``{x} . x \<in> A}"
    13 
    13 
    14 definition
    14 definition
    15   congruent  :: "[i,i=>i]=>o"  where
    15   congruent  :: "[i,i=>i]=>o"  where
    16       "congruent(r,b) == \<forall>y z. <y,z>:r \<longrightarrow> b(y)=b(z)"
    16       "congruent(r,b) == \<forall>y z. <y,z>:r \<longrightarrow> b(y)=b(z)"
    17 
    17 
    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])