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: |