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

Commit 7f837db

Browse files
committed
feat(data/set/finite): add multiset.finite_to_set (#15177)
* move `finset.finite_to_set` up; * add `multiset.finite_to_set`, `multiset.finite_to_set_to_finset`, and `list.finite_to_set`; * use new lemmas here and there.
1 parent ecd5234 commit 7f837db

File tree

7 files changed

+41
-39
lines changed

7 files changed

+41
-39
lines changed

src/data/set/finite.lean

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,33 @@ end fintype_instances
340340

341341
end set
342342

343+
/-! ### Finset -/
344+
345+
namespace finset
346+
347+
/-- Gives a `set.finite` for the `finset` coerced to a `set`.
348+
This is a wrapper around `set.to_finite`. -/
349+
lemma finite_to_set (s : finset α) : (s : set α).finite := set.to_finite _
350+
351+
@[simp] lemma finite_to_set_to_finset (s : finset α) : s.finite_to_set.to_finset = s :=
352+
by { ext, rw [set.finite.mem_to_finset, mem_coe] }
353+
354+
end finset
355+
356+
namespace multiset
357+
358+
lemma finite_to_set (s : multiset α) : {x | x ∈ s}.finite :=
359+
by { classical, simpa only [← multiset.mem_to_finset] using s.to_finset.finite_to_set }
360+
361+
@[simp] lemma finite_to_set_to_finset [decidable_eq α] (s : multiset α) :
362+
s.finite_to_set.to_finset = s.to_finset :=
363+
by { ext x, simp }
364+
365+
end multiset
366+
367+
lemma list.finite_to_set (l : list α) : {x | x ∈ l}.finite :=
368+
(show multiset α, from ⟦l⟧).finite_to_set
369+
343370
/-! ### Finite instances
344371
345372
There is seemingly some overlap between the following instances and the `fintype` instances
@@ -585,7 +612,7 @@ h.induction_on finite_empty finite_singleton
585612
theorem exists_finite_iff_finset {p : set α → Prop} :
586613
(∃ s : set α, s.finite ∧ p s) ↔ ∃ s : finset α, p ↑s :=
587614
⟨λ ⟨s, hs, hps⟩, ⟨hs.to_finset, hs.coe_to_finset.symm ▸ hps⟩,
588-
λ ⟨s, hs⟩, ⟨s, finite_mem_finset s, hs⟩⟩
615+
λ ⟨s, hs⟩, ⟨s, s.finite_to_set, hs⟩⟩
589616

590617
/-- There are finitely many subsets of a given finite set -/
591618
lemma finite.finite_subsets {α : Type u} {a : set α} (h : a.finite) : {b | b ⊆ a}.finite :=
@@ -601,13 +628,13 @@ begin
601628
lift t to Π d, finset (κ d) using ht,
602629
classical,
603630
rw ← fintype.coe_pi_finset,
604-
apply finite_mem_finset
631+
apply finset.finite_to_set
605632
end
606633

607634
/-- A finite union of finsets is finite. -/
608635
lemma union_finset_finite_of_range_finite (f : α → finset β) (h : (range f).finite) :
609636
(⋃ a, (f a : set β)).finite :=
610-
by { rw ← bUnion_range, exact h.bUnion (λ y hy, finite_mem_finset y) }
637+
by { rw ← bUnion_range, exact h.bUnion (λ y hy, y.finite_to_set) }
611638

612639
lemma finite_range_ite {p : α → Prop} [decidable_pred p] {f g : α → β} (hf : (range f).finite)
613640
(hg : (range g).finite) : (range (λ x, if p x then f x else g x)).finite :=
@@ -1035,13 +1062,9 @@ lemma Union_univ_pi_of_monotone {ι ι' : Type*} [linear_order ι'] [nonempty ι
10351062
(⋃ j : ι', pi univ (λ i, s i j)) = pi univ (λ i, ⋃ j, s i j) :=
10361063
Union_pi_of_monotone finite_univ (λ i _, hs i)
10371064

1038-
lemma range_find_greatest_subset {P : α → ℕ → Prop} [∀ x, decidable_pred (P x)] {b : ℕ}:
1039-
range (λ x, nat.find_greatest (P x) b) ⊆ ↑(finset.range (b + 1)) :=
1040-
by { rw range_subset_iff, intro x, simp [nat.lt_succ_iff, nat.find_greatest_le] }
1041-
10421065
lemma finite_range_find_greatest {P : α → ℕ → Prop} [∀ x, decidable_pred (P x)] {b : ℕ} :
10431066
(range (λ x, nat.find_greatest (P x) b)).finite :=
1044-
(finite_mem_finset (finset.range (b + 1))).subset range_find_greatest_subset
1067+
(finite_le_nat b).subset $ range_subset_iff.2 $ λ x, nat.find_greatest_le _
10451068

10461069
lemma finite.exists_maximal_wrt [partial_order β] (f : α → β) (s : set α) (h : set.finite s) :
10471070
s.nonempty → ∃ a ∈ s, ∀ a' ∈ s, f a ≤ f a' → f a = f a' :=
@@ -1116,12 +1139,12 @@ namespace finset
11161139
/-- A finset is bounded above. -/
11171140
protected lemma bdd_above [semilattice_sup α] [nonempty α] (s : finset α) :
11181141
bdd_above (↑s : set α) :=
1119-
(set.finite_mem_finset s).bdd_above
1142+
s.finite_to_set.bdd_above
11201143

11211144
/-- A finset is bounded below. -/
11221145
protected lemma bdd_below [semilattice_inf α] [nonempty α] (s : finset α) :
11231146
bdd_below (↑s : set α) :=
1124-
(set.finite_mem_finset s).bdd_below
1147+
s.finite_to_set.bdd_below
11251148

11261149
end finset
11271150

@@ -1149,17 +1172,3 @@ begin
11491172
{ dsimp only [x, y] at this, exact key₁ (f.injective $ subtype.coe_injective this) },
11501173
{ dsimp only [y, z] at this, exact key₂ (f.injective $ subtype.coe_injective this) }
11511174
end
1152-
1153-
/-! ### Finset -/
1154-
1155-
namespace finset
1156-
1157-
/-- Gives a `set.finite` for the `finset` coerced to a `set`.
1158-
This is a wrapper around `set.to_finite`. -/
1159-
lemma finite_to_set (s : finset α) : (s : set α).finite := set.finite_mem_finset s
1160-
1161-
@[simp] lemma finite_to_set_to_finset {α : Type*} (s : finset α) :
1162-
s.finite_to_set.to_finset = s :=
1163-
by { ext, rw [set.finite.mem_to_finset, mem_coe] }
1164-
1165-
end finset

src/field_theory/adjoin.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -598,8 +598,7 @@ lemma fg_adjoin_finset (t : finset E) : (adjoin F (↑t : set E)).fg :=
598598
⟨t, rfl⟩
599599

600600
theorem fg_def {S : intermediate_field F E} : S.fg ↔ ∃ t : set E, set.finite t ∧ adjoin F t = S :=
601-
⟨λ ⟨t, ht⟩, ⟨↑t, set.finite_mem_finset t, ht⟩,
602-
λ ⟨t, ht1, ht2⟩, ⟨ht1.to_finset, by rwa set.finite.coe_to_finset⟩⟩
601+
iff.symm set.exists_finite_iff_finset
603602

604603
theorem fg_bot : (⊥ : intermediate_field F E).fg :=
605604
⟨∅, adjoin_empty F E⟩

src/field_theory/is_alg_closed/classification.lean

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,8 @@ calc #L ≤ #(Σ p : R[X], { x : L // x ∈ (p.map (algebra_map R L)).roots }) :
6161
cardinal_mk_le_sigma_polynomial R L halg
6262
... = cardinal.sum (λ p : R[X], #{ x : L | x ∈ (p.map (algebra_map R L)).roots }) :
6363
by rw ← mk_sigma; refl
64-
... ≤ cardinal.sum.{u u} (λ p : R[X], ℵ₀) : sum_le_sum _ _
65-
(λ p, le_of_lt begin
66-
rw [lt_aleph_0_iff_finite],
67-
classical,
68-
simp only [← @multiset.mem_to_finset _ _ _ (p.map (algebra_map R L)).roots],
69-
apply_instance
70-
end)
64+
... ≤ cardinal.sum.{u u} (λ p : R[X], ℵ₀) :
65+
sum_le_sum _ _ $ λ p, (multiset.finite_to_set _).lt_aleph_0.le
7166
... = #R[X] * ℵ₀ : sum_const' _ _
7267
... ≤ max (max (#R[X]) ℵ₀) ℵ₀ : mul_le_max _ _
7368
... ≤ max (max (max (#R) ℵ₀) ℵ₀) ℵ₀ :

src/field_theory/splitting_field.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ begin
403403
letI := (f : algebra.adjoin F (↑s : set K) →+* L).to_algebra,
404404
haveI : finite_dimensional F (algebra.adjoin F (↑s : set K)) := (
405405
(submodule.fg_iff_finite_dimensional _).1
406-
(fg_adjoin_of_finite (set.finite_mem_finset s) H3)).of_subalgebra_to_submodule,
406+
(fg_adjoin_of_finite s.finite_to_set H3)).of_subalgebra_to_submodule,
407407
letI := field_of_finite_dimensional F (algebra.adjoin F (↑s : set K)),
408408
have H5 : is_integral (algebra.adjoin F (↑s : set K)) a := is_integral_of_is_scalar_tower a H1,
409409
have H6 : (minpoly (algebra.adjoin F (↑s : set K)) a).splits
@@ -747,7 +747,7 @@ alg_hom.comp (by { rw ← adjoin_roots L f, exact classical.choice (lift_of_spli
747747

748748
theorem finite_dimensional (f : K[X]) [is_splitting_field K L f] : finite_dimensional K L :=
749749
⟨@algebra.top_to_submodule K L _ _ _ ▸ adjoin_roots L f ▸
750-
fg_adjoin_of_finite (set.finite_mem_finset _) (λ y hy,
750+
fg_adjoin_of_finite (finset.finite_to_set _) (λ y hy,
751751
if hf : f = 0
752752
then by { rw [hf, polynomial.map_zero, roots_zero] at hy, cases hy }
753753
else is_algebraic_iff_is_integral.1 ⟨f, hf, (eval₂_eq_eval_map _).trans $

src/measure_theory/measure/haar.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ begin
317317
refine this.inter_Inter_nonempty (cl_prehaar K₀) (λ s, is_closed_closure) (λ t, _),
318318
let V₀ := ⋂ (V ∈ t), (V : open_nhds_of 1).1,
319319
have h1V₀ : is_open V₀,
320-
{ apply is_open_bInter, apply finite_mem_finset, rintro ⟨V, hV⟩ h2V, exact hV.1 },
320+
{ apply is_open_bInter, apply finset.finite_to_set, rintro ⟨V, hV⟩ h2V, exact hV.1 },
321321
have h2V₀ : (1 : G) ∈ V₀, { simp only [mem_Inter], rintro ⟨V, hV⟩ h2V, exact hV.2 },
322322
refine ⟨prehaar K₀ V₀, _⟩,
323323
split,

src/ring_theory/adjoin/fg.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ lemma fg_adjoin_finset (s : finset A) : (algebra.adjoin R (↑s : set A)).fg :=
8787
⟨s, rfl⟩
8888

8989
theorem fg_def {S : subalgebra R A} : S.fg ↔ ∃ t : set A, set.finite t ∧ algebra.adjoin R t = S :=
90-
⟨λ ⟨t, ht⟩, ⟨↑t, set.finite_mem_finset t, ht⟩,
91-
λ ⟨t, ht1, ht2⟩, ⟨ht1.to_finset, by rwa set.finite.coe_to_finset⟩⟩
90+
iff.symm set.exists_finite_iff_finset
9291

9392
theorem fg_bot : (⊥ : subalgebra R A).fg :=
9493
⟨∅, algebra.adjoin_empty R A⟩

src/ring_theory/integral_closure.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ theorem is_integral_iff_is_integral_closure_finite {r : A} :
154154
begin
155155
split; intro hr,
156156
{ rcases hr with ⟨p, hmp, hpr⟩,
157-
refine ⟨_, set.finite_mem_finset _, p.restriction, monic_restriction.2 hmp, _⟩,
157+
refine ⟨_, finset.finite_to_set _, p.restriction, monic_restriction.2 hmp, _⟩,
158158
erw [← aeval_def, is_scalar_tower.aeval_apply _ R, map_restriction, aeval_def, hpr] },
159159
rcases hr with ⟨s, hs, hsr⟩,
160160
exact is_integral_of_subring _ hsr

0 commit comments

Comments
 (0)