@@ -7,162 +7,24 @@ import data.finite.basic
7
7
import data.set.finite
8
8
9
9
/-!
10
- # Finite instances for `set`
10
+ # Lemmas about `finite` and `set`s
11
11
12
- This module provides ways to go between `set.finite` and `finite` and also provides a number
13
- of `finite` instances for basic set constructions such as unions, intersections, and so on.
14
-
15
- ## Main definitions
16
-
17
- * `set.finite_of_finite` creates a `set.finite` proof from a `finite` instance
18
- * `set.finite.finite` creates a `finite` instance from a `set.finite` proof
19
- * `finite.set.subset` for finiteness of subsets of a finite set
12
+ In this file we prove two lemmas about `finite` and `set`s.
20
13
21
14
## Tags
22
15
23
16
finiteness, finite sets
24
-
25
17
-/
26
18
27
19
open set
28
- open_locale classical
29
20
30
21
universes u v w x
31
- variables {α : Type u} {β : Type v} {ι : Sort w} {γ : Type x}
32
-
33
- /-- Constructor for `set.finite` using a `finite` instance. -/
34
- theorem set.finite_of_finite (s : set α) [finite s] : s.finite := ⟨fintype.of_finite s⟩
35
-
36
- /-- Projection of `set.finite` to its `finite` instance.
37
- This is intended to be used with dot notation.
38
- See also `set.finite.fintype`. -/
39
- @[nolint dup_namespace]
40
- protected lemma set.finite.finite {s : set α} (h : s.finite) : finite s :=
41
- finite.of_fintype h.fintype
42
-
43
- lemma set.finite_iff_finite {s : set α} : s.finite ↔ finite s :=
44
- ⟨λ h, h.finite, λ h, by exactI set.finite_of_finite s⟩
45
-
46
- /-- Construct a `finite` instance for a `set` from a `finset` with the same elements. -/
47
- protected lemma finite.of_finset {p : set α} (s : finset α) (H : ∀ x, x ∈ s ↔ x ∈ p) : finite p :=
48
- finite.of_fintype (fintype.of_finset s H)
49
-
50
- /-! ### Finite instances
51
-
52
- There is seemingly some overlap between the following instances and the `fintype` instances
53
- in `data.set.finite`. While every `fintype` instance gives a `finite` instance, those
54
- instances that depend on `fintype` or `decidable` instances need an additional `finite` instance
55
- to be able to generally apply.
56
-
57
- Some set instances do not appear here since they are consequences of others, for example
58
- `subtype.finite` for subsets of a finite type.
59
- -/
60
-
61
- namespace finite.set
62
-
63
- example {s : set α} [finite α] : finite s := infer_instance
64
- example : finite (∅ : set α) := infer_instance
65
- example (a : α) : finite ({a} : set α) := infer_instance
66
-
67
- instance finite_union (s t : set α) [finite s] [finite t] :
68
- finite (s ∪ t : set α) :=
69
- by { haveI := fintype.of_finite s, haveI := fintype.of_finite t, apply_instance }
70
-
71
- instance finite_sep (s : set α) (p : α → Prop ) [finite s] :
72
- finite ({a ∈ s | p a} : set α) :=
73
- by { haveI := fintype.of_finite s, apply_instance }
74
-
75
- protected lemma subset (s : set α) {t : set α} [finite s] (h : t ⊆ s) : finite t :=
76
- by { rw eq_sep_of_subset h, apply_instance }
77
-
78
- instance finite_inter_of_right (s t : set α) [finite t] :
79
- finite (s ∩ t : set α) := finite.set.subset t (inter_subset_right s t)
80
-
81
- instance finite_inter_of_left (s t : set α) [finite s] :
82
- finite (s ∩ t : set α) := finite.set.subset s (inter_subset_left s t)
83
-
84
- instance finite_diff (s t : set α) [finite s] :
85
- finite (s \ t : set α) := finite.set.subset s (diff_subset s t)
86
-
87
- instance finite_Union [finite ι] (f : ι → set α) [∀ i, finite (f i)] : finite (⋃ i, f i) :=
88
- begin
89
- convert_to finite (⋃ (i : plift ι), f i.down),
90
- { congr, ext, simp },
91
- haveI := fintype.of_finite (plift ι),
92
- haveI := λ i, fintype.of_finite (f i),
93
- apply_instance,
94
- end
95
-
96
- instance finite_sUnion {s : set (set α)} [finite s] [H : ∀ (t : s), finite (t : set α)] :
97
- finite (⋃₀ s) :=
98
- by { rw sUnion_eq_Union, exact @finite.set.finite_Union _ _ _ _ H }
99
-
100
- lemma finite_bUnion {ι : Type *} (s : set ι) [finite s] (t : ι → set α) (H : ∀ i ∈ s, finite (t i)) :
101
- finite (⋃(x ∈ s), t x) :=
102
- begin
103
- convert_to finite (⋃ (x : s), t x),
104
- { congr' 1 , ext, simp },
105
- haveI : ∀ (i : s), finite (t i) := λ i, H i i.property,
106
- apply_instance,
107
- end
108
-
109
- instance finite_bUnion' {ι : Type *} (s : set ι) [finite s] (t : ι → set α) [∀ i, finite (t i)] :
110
- finite (⋃(x ∈ s), t x) :=
111
- finite_bUnion s t (λ i h, infer_instance)
112
-
113
- /--
114
- Example: `finite (⋃ (i < n), f i)` where `f : ℕ → set α` and `[∀ i, finite (f i)]`
115
- (when given instances from `data.nat.interval`).
116
- -/
117
- instance finite_bUnion'' {ι : Type *} (p : ι → Prop ) [h : finite {x | p x}]
118
- (t : ι → set α) [∀ i, finite (t i)] :
119
- finite (⋃ x (h : p x), t x) :=
120
- @finite.set.finite_bUnion' _ _ (set_of p) h t _
121
-
122
- instance finite_Inter {ι : Sort *} [nonempty ι] (t : ι → set α) [∀ i, finite (t i)] :
123
- finite (⋂ i, t i) :=
124
- finite.set.subset (t $ classical.arbitrary ι) (Inter_subset _ _)
125
-
126
- instance finite_insert (a : α) (s : set α) [finite s] : finite (insert a s : set α) :=
127
- ((set.finite_of_finite s).insert a).finite
128
-
129
- instance finite_image (s : set α) (f : α → β) [finite s] : finite (f '' s) :=
130
- ((set.finite_of_finite s).image f).finite
131
-
132
- instance finite_range (f : ι → α) [finite ι] : finite (range f) :=
133
- by { haveI := fintype.of_finite (plift ι), apply_instance }
134
-
135
- instance finite_replacement [finite α] (f : α → β) : finite {(f x) | (x : α)} :=
136
- finite.set.finite_range f
137
-
138
- instance finite_prod (s : set α) (t : set β) [finite s] [finite t] :
139
- finite (s ×ˢ t : set (α × β)) :=
140
- by { haveI := fintype.of_finite s, haveI := fintype.of_finite t, apply_instance }
141
-
142
- instance finite_image2 (f : α → β → γ) (s : set α) (t : set β) [finite s] [finite t] :
143
- finite (image2 f s t : set γ) :=
144
- by { rw ← image_prod, apply_instance }
145
-
146
- instance finite_seq (f : set (α → β)) (s : set α) [finite f] [finite s] : finite (f.seq s) :=
147
- by { rw seq_def, apply_instance }
148
-
149
- end finite.set
150
-
151
- /-! ### Non-instances -/
152
-
153
- lemma set.finite_univ_iff : finite (set.univ : set α) ↔ finite α :=
154
- (equiv.set.univ α).finite_iff
155
-
156
- lemma finite.of_finite_univ [finite ↥(univ : set α)] : finite α :=
157
- set.finite_univ_iff.mp ‹_›
22
+ variables {α : Type u} {β : Type v} {ι : Sort w}
158
23
159
24
lemma finite.set.finite_of_finite_image (s : set α)
160
25
{f : α → β} (h : s.inj_on f) [finite (f '' s)] : finite s :=
161
26
finite.of_equiv _ (equiv.of_bijective _ h.bij_on_image.bijective).symm
162
27
163
- lemma finite.of_injective_finite_range {f : α → β}
164
- (hf : function.injective f) [finite (range f)] : finite α :=
165
- begin
166
- refine finite.of_injective (set.range_factorization f) (λ x y h, hf _),
167
- simpa only [range_factorization_coe] using congr_arg (coe : range f → β) h,
168
- end
28
+ lemma finite.of_injective_finite_range {f : ι → α}
29
+ (hf : function.injective f) [finite (range f)] : finite ι :=
30
+ finite.of_injective (set.range_factorization f) (hf.cod_restrict _)
0 commit comments