Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 7428bd9

Browse files
committed
refactor(data/finite/set,data/set/finite): move most contents of one file to another (#15166)
* move most content of `data.finite.set` to `data.set.finite`; * use `casesI nonempty_fintype _` instead of `letI := fintype.of_finite`; sometimes it lets us avoid `classical.choice`; * merge `set.finite.of_fintype`, `set.finite_of_fintype`, and `set.finite_of_finite` into `set.to_finite`; * rewrite `set.finite_univ_iff` and `finite.of_finite_univ` in terms of `set.finite`; * replace some assumptions `[fintype (plift _)]` with `[finite _]`; * generalize `set.cod_restrict` and some lemmas to allow domain in `Sort*`, use it for `finite.of_injective_finite.range`.
1 parent 691f04f commit 7428bd9

File tree

26 files changed

+235
-250
lines changed

26 files changed

+235
-250
lines changed

archive/100-theorems-list/82_cubing_a_cube.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ end
301301
lemma exists_mi : ∃(i : ι), i ∈ bcubes cs c ∧ ∀(i' ∈ bcubes cs c),
302302
(cs i).w ≤ (cs i').w :=
303303
by simpa
304-
using (bcubes cs c).exists_min_image (λ i, (cs i).w) (finite.of_fintype _) (nonempty_bcubes h v)
304+
using (bcubes cs c).exists_min_image (λ i, (cs i).w) (set.to_finite _) (nonempty_bcubes h v)
305305

306306
/-- We let `mi` be the (index for the) smallest cube in the valley `c` -/
307307
def mi : ι := classical.some $ exists_mi h v
@@ -350,7 +350,7 @@ begin
350350
have hs : s.nonempty,
351351
{ rcases (two_le_iff' (⟨i, hi⟩ : bcubes cs c)).mp (two_le_mk_bcubes h v) with ⟨⟨i', hi'⟩, h2i'⟩,
352352
refine ⟨i', hi', _⟩, simp only [mem_singleton_iff], intro h, apply h2i', simp [h] },
353-
rcases set.exists_min_image s (w ∘ cs) (finite.of_fintype _) hs with ⟨i', ⟨hi', h2i'⟩, h3i'⟩,
353+
rcases set.exists_min_image s (w ∘ cs) (set.to_finite _) hs with ⟨i', ⟨hi', h2i'⟩, h3i'⟩,
354354
rw [mem_singleton_iff] at h2i',
355355
let x := c.b j.succ + c.w - (cs i').w,
356356
have hx : x < (cs i).b j.succ,

src/algebra/big_operators/finprod.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ end
202202

203203
@[to_additive] lemma monoid_hom.map_finprod_Prop {p : Prop} (f : M →* N) (g : p → M) :
204204
f (∏ᶠ x, g x) = ∏ᶠ x, f (g x) :=
205-
f.map_finprod_plift g (finite.of_fintype _)
205+
f.map_finprod_plift g (set.to_finite _)
206206

207207
@[to_additive] lemma monoid_hom.map_finprod_of_preimage_one (f : M →* N)
208208
(hf : ∀ x, f x = 1 → x = 1) (g : α → M) :
@@ -310,7 +310,7 @@ by { classical, rw [finprod_def, dif_pos hf] }
310310

311311
@[to_additive] lemma finprod_eq_prod_of_fintype [fintype α] (f : α → M) :
312312
∏ᶠ i : α, f i = ∏ i, f i :=
313-
finprod_eq_prod_of_mul_support_to_finset_subset _ (finite.of_fintype _) $ finset.subset_univ _
313+
finprod_eq_prod_of_mul_support_to_finset_subset _ (set.to_finite _) $ finset.subset_univ _
314314

315315
@[to_additive] lemma finprod_cond_eq_prod_of_cond_iff (f : α → M) {p : α → Prop} {t : finset α}
316316
(h : ∀ {x}, f x ≠ 1 → (p x ↔ x ∈ t)) :

src/analysis/box_integral/partition/measure.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ end
5555
lemma measurable_set_Icc : measurable_set I.Icc := measurable_set_Icc
5656

5757
lemma measurable_set_Ioo : measurable_set I.Ioo :=
58-
(measurable_set_pi (set.finite.of_fintype _).countable).2 $ or.inl $ λ i hi, measurable_set_Ioo
58+
(measurable_set_pi (set.to_finite _).countable).2 $ or.inl $ λ i hi, measurable_set_Ioo
5959

6060
lemma coe_ae_eq_Icc : (I : set (ι → ℝ)) =ᵐ[volume] I.Icc :=
6161
by { rw coe_eq_pi, exact measure.univ_pi_Ioc_ae_eq_Icc }

src/data/finite/basic.lean

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,18 @@ priority than ones coming from `fintype` instances. -/
8787
@[priority 900]
8888
instance finite.of_fintype' (α : Type*) [fintype α] : finite α := finite.of_fintype ‹_›
8989

90-
/-- Noncomputably get a `fintype` instance from a `finite` instance. This is not an
91-
instance because we want `fintype` instances to be useful for computations. -/
92-
def fintype.of_finite (α : Type*) [finite α] : fintype α :=
93-
nonempty.some $ let ⟨n, ⟨e⟩⟩ := finite.exists_equiv_fin α in ⟨fintype.of_equiv _ e.symm⟩
94-
9590
lemma finite_iff_nonempty_fintype (α : Type*) :
9691
finite α ↔ nonempty (fintype α) :=
9792
⟨λ h, let ⟨k, ⟨e⟩⟩ := @finite.exists_equiv_fin α h in ⟨fintype.of_equiv _ e.symm⟩,
9893
λ ⟨_⟩, by exactI infer_instance⟩
9994

95+
lemma nonempty_fintype (α : Type*) [finite α] : nonempty (fintype α) :=
96+
(finite_iff_nonempty_fintype α).mp ‹_›
97+
98+
/-- Noncomputably get a `fintype` instance from a `finite` instance. This is not an
99+
instance because we want `fintype` instances to be useful for computations. -/
100+
def fintype.of_finite (α : Type*) [finite α] : fintype α := (nonempty_fintype α).some
101+
100102
lemma not_finite_iff_infinite {α : Type*} : ¬ finite α ↔ infinite α :=
101103
by rw [← is_empty_fintype, finite_iff_nonempty_fintype, not_nonempty_iff]
102104

src/data/finite/set.lean

Lines changed: 6 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -7,162 +7,24 @@ import data.finite.basic
77
import data.set.finite
88

99
/-!
10-
# Finite instances for `set`
10+
# Lemmas about `finite` and `set`s
1111
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.
2013
2114
## Tags
2215
2316
finiteness, finite sets
24-
2517
-/
2618

2719
open set
28-
open_locale classical
2920

3021
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}
15823

15924
lemma finite.set.finite_of_finite_image (s : set α)
16025
{f : α → β} (h : s.inj_on f) [finite (f '' s)] : finite s :=
16126
finite.of_equiv _ (equiv.of_bijective _ h.bij_on_image.bijective).symm
16227

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 _)

src/data/polynomial/ring_division.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ finset_coe.fintype _
655655

656656
lemma root_set_finite (p : T[X])
657657
(S : Type*) [comm_ring S] [is_domain S] [algebra T S] : (p.root_set S).finite :=
658-
set.finite_of_fintype _
658+
set.to_finite _
659659

660660
theorem mem_root_set_iff' {p : T[X]} {S : Type*} [comm_ring S] [is_domain S]
661661
[algebra T S] (hp : p.map (algebra_map T S) ≠ 0) (a : S) :

0 commit comments

Comments
 (0)