src/HOL/Equiv_Relations.thy
changeset 82248 e8c96013ea8a
parent 80932 261cd8722677
child 82253 3ef81164c3f7
equal deleted inserted replaced
82245:fba16c509af0 82248:e8c96013ea8a
     9 begin
     9 begin
    10 
    10 
    11 subsection \<open>Equivalence relations -- set version\<close>
    11 subsection \<open>Equivalence relations -- set version\<close>
    12 
    12 
    13 definition equiv :: "'a set \<Rightarrow> ('a \<times> 'a) set \<Rightarrow> bool"
    13 definition equiv :: "'a set \<Rightarrow> ('a \<times> 'a) set \<Rightarrow> bool"
    14   where "equiv A r \<longleftrightarrow> refl_on A r \<and> sym r \<and> trans r"
    14   where "equiv A r \<longleftrightarrow> r \<subseteq> A \<times> A \<and> refl_on A r \<and> sym r \<and> trans r"
    15 
    15 
    16 lemma equivI: "refl_on A r \<Longrightarrow> sym r \<Longrightarrow> trans r \<Longrightarrow> equiv A r"
    16 lemma equivI: "r \<subseteq> A \<times> A \<Longrightarrow> refl_on A r \<Longrightarrow> sym r \<Longrightarrow> trans r \<Longrightarrow> equiv A r"
    17   by (simp add: equiv_def)
    17   by (simp add: equiv_def)
    18 
    18 
    19 lemma equivE:
    19 lemma equivE:
    20   assumes "equiv A r"
    20   assumes "equiv A r"
    21   obtains "refl_on A r" and "sym r" and "trans r"
    21   obtains "r \<subseteq> A \<times> A" and "refl_on A r" and "sym r" and "trans r"
    22   using assms by (simp add: equiv_def)
    22   using assms by (simp add: equiv_def)
    23 
    23 
    24 text \<open>
    24 text \<open>
    25   Suppes, Theorem 70: \<open>r\<close> is an equiv relation iff \<open>r\<inverse> O r = r\<close>.
    25   Suppes, Theorem 70: \<open>r\<close> is an equiv relation iff \<open>r\<inverse> O r = r\<close>.
    26 
    26 
    28 \<close>
    28 \<close>
    29 
    29 
    30 lemma sym_trans_comp_subset: "sym r \<Longrightarrow> trans r \<Longrightarrow> r\<inverse> O r \<subseteq> r"
    30 lemma sym_trans_comp_subset: "sym r \<Longrightarrow> trans r \<Longrightarrow> r\<inverse> O r \<subseteq> r"
    31   unfolding trans_def sym_def converse_unfold by blast
    31   unfolding trans_def sym_def converse_unfold by blast
    32 
    32 
    33 lemma refl_on_comp_subset: "refl_on A r \<Longrightarrow> r \<subseteq> r\<inverse> O r"
    33 lemma refl_on_comp_subset: "r \<subseteq> A \<times> A \<Longrightarrow> refl_on A r \<Longrightarrow> r \<subseteq> r\<inverse> O r"
    34   unfolding refl_on_def by blast
    34   unfolding refl_on_def by blast
    35 
    35 
    36 lemma equiv_comp_eq: "equiv A r \<Longrightarrow> r\<inverse> O r = r"
    36 lemma equiv_comp_eq: "equiv A r \<Longrightarrow> r\<inverse> O r = r"
    37   unfolding equiv_def
    37   by (iprover elim: equivE intro: sym_trans_comp_subset refl_on_comp_subset equalityI)
    38   by (iprover intro: sym_trans_comp_subset refl_on_comp_subset equalityI)
       
    39 
    38 
    40 text \<open>Second half.\<close>
    39 text \<open>Second half.\<close>
    41 
    40 
    42 lemma comp_equivI:
    41 lemma comp_equivI:
    43   assumes "r\<inverse> O r = r" "Domain r = A"
    42   assumes "r\<inverse> O r = r" "Domain r = A"
    44   shows "equiv A r"
    43   shows "equiv A r"
    45 proof -
    44 proof (rule equivI)
       
    45   show "r \<subseteq> A \<times> A"
       
    46     using assms by auto
       
    47 
    46   have *: "\<And>x y. (x, y) \<in> r \<Longrightarrow> (y, x) \<in> r"
    48   have *: "\<And>x y. (x, y) \<in> r \<Longrightarrow> (y, x) \<in> r"
    47     using assms by blast
    49     using assms by blast
    48   show ?thesis
    50 
    49     unfolding equiv_def refl_on_def sym_def trans_def
    51   thus "refl_on A r" "sym r" "trans r"
    50     using assms by (auto intro: *)
    52     unfolding refl_on_def sym_def trans_def
       
    53     using assms by auto
    51 qed
    54 qed
    52 
    55 
    53 
    56 
    54 subsection \<open>Equivalence classes\<close>
    57 subsection \<open>Equivalence classes\<close>
    55 
    58 
    56 lemma equiv_class_subset: "equiv A r \<Longrightarrow> (a, b) \<in> r \<Longrightarrow> r``{a} \<subseteq> r``{b}"
    59 lemma equiv_class_subset: "equiv A r \<Longrightarrow> (a, b) \<in> r \<Longrightarrow> r``{a} \<subseteq> r``{b}"
    57   \<comment> \<open>lemma for the next result\<close>
    60   \<comment> \<open>lemma for the next result\<close>
    58   unfolding equiv_def trans_def sym_def by blast
    61   unfolding equiv_def trans_def sym_def by blast
    59 
    62 
    60 theorem equiv_class_eq: "equiv A r \<Longrightarrow> (a, b) \<in> r \<Longrightarrow> r``{a} = r``{b}"
    63 theorem equiv_class_eq:
    61   by (intro equalityI equiv_class_subset; force simp add: equiv_def sym_def)
    64   assumes "equiv A r" and "(a, b) \<in> r"
       
    65   shows "r``{a} = r``{b}"
       
    66 proof (intro subset_antisym equiv_class_subset[OF \<open>equiv A r\<close>])
       
    67   show "(a, b) \<in> r"
       
    68     using \<open>(a, b) \<in> r\<close> .
       
    69 next
       
    70   have "sym r"
       
    71     using \<open>equiv A r\<close> by (auto elim: equivE)
       
    72   thus "(b, a) \<in> r"
       
    73     using \<open>(a, b) \<in> r\<close>
       
    74     by (auto dest: symD)
       
    75 qed
    62 
    76 
    63 lemma equiv_class_self: "equiv A r \<Longrightarrow> a \<in> A \<Longrightarrow> a \<in> r``{a}"
    77 lemma equiv_class_self: "equiv A r \<Longrightarrow> a \<in> A \<Longrightarrow> a \<in> r``{a}"
    64   unfolding equiv_def refl_on_def by blast
    78   unfolding equiv_def refl_on_def by blast
    65 
    79 
    66 lemma subset_equiv_class: "equiv A r \<Longrightarrow> r``{b} \<subseteq> r``{a} \<Longrightarrow> b \<in> A \<Longrightarrow> (a, b) \<in> r"
    80 lemma subset_equiv_class: "equiv A r \<Longrightarrow> r``{b} \<subseteq> r``{a} \<Longrightarrow> b \<in> A \<Longrightarrow> (a, b) \<in> r"
    98   unfolding quotient_def by blast
   112   unfolding quotient_def by blast
    99 
   113 
   100 lemma Union_quotient: "equiv A r \<Longrightarrow> \<Union>(A//r) = A"
   114 lemma Union_quotient: "equiv A r \<Longrightarrow> \<Union>(A//r) = A"
   101   unfolding equiv_def refl_on_def quotient_def by blast
   115   unfolding equiv_def refl_on_def quotient_def by blast
   102 
   116 
   103 lemma quotient_disj: "equiv A r \<Longrightarrow> X \<in> A//r \<Longrightarrow> Y \<in> A//r \<Longrightarrow> X = Y \<or> X \<inter> Y = {}"
   117 lemma quotient_disj:
   104   unfolding quotient_def equiv_def trans_def sym_def by blast
   118   assumes "equiv A r" and "X \<in> A//r" and "Y \<in> A//r"
       
   119   shows "X = Y \<or> X \<inter> Y = {}"
       
   120 proof -
       
   121   have "sym r" and "trans r"
       
   122     using \<open>equiv A r\<close>
       
   123     by (auto elim: equivE)
       
   124   thus ?thesis
       
   125     using assms(2,3)
       
   126     unfolding quotient_def equiv_def trans_def sym_def by blast
       
   127 qed
   105 
   128 
   106 lemma quotient_eqI:
   129 lemma quotient_eqI:
   107   assumes "equiv A r" "X \<in> A//r" "Y \<in> A//r" and xy: "x \<in> X" "y \<in> Y" "(x, y) \<in> r"
   130   assumes "equiv A r" "X \<in> A//r" "Y \<in> A//r" and xy: "x \<in> X" "y \<in> Y" "(x, y) \<in> r"
   108   shows "X = Y"
   131   shows "X = Y"
   109 proof -
   132 proof -
   110   obtain a b where "a \<in> A" and a: "X = r `` {a}" and "b \<in> A" and b: "Y = r `` {b}"
   133   obtain a b where "a \<in> A" and a: "X = r `` {a}" and "b \<in> A" and b: "Y = r `` {b}"
   111     using assms by (auto elim!: quotientE)
   134     using assms by (auto elim!: quotientE)
   112   then have "(a,b) \<in> r"
   135   moreover have "sym r" and "trans r"
   113       using xy \<open>equiv A r\<close> unfolding equiv_def sym_def trans_def by blast
   136     using \<open>equiv A r\<close>
       
   137     by (auto elim: equivE)
       
   138   ultimately have "(a,b) \<in> r"
       
   139       using xy unfolding sym_def trans_def by blast
   114   then show ?thesis
   140   then show ?thesis
   115     unfolding a b by (rule equiv_class_eq [OF \<open>equiv A r\<close>])
   141     unfolding a b by (rule equiv_class_eq [OF \<open>equiv A r\<close>])
   116 qed
   142 qed
   117 
   143 
   118 lemma quotient_eq_iff:
   144 lemma quotient_eq_iff: