Skip to content

Commit d6c9e7a

Browse files
committed
feat: some finset lemmas (#13686)
* From the Sobolev inequality project * The increase in imports in `Mathlib.Data.Finset.Update` is not problematic: it is only imported in MeasureTheory files. * Add `DepRewrite` to `Tactic.Common`. * Change the normal form of `{x} ∪ {y}` to `{x, y}` (previously `{y, x}`). Co-authored-by: Heather Macbeth 25316162+hrmacbeth@users.noreply.github.com
1 parent 002cb64 commit d6c9e7a

File tree

7 files changed

+61
-11
lines changed

7 files changed

+61
-11
lines changed

Mathlib/Algebra/Group/Finsupp.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ lemma support_single_add_single [DecidableEq ι] {f₁ f₂ : ι} {g₁ g₂ : M
153153
(H : f₁ ≠ f₂) (hg₁ : g₁ ≠ 0) (hg₂ : g₂ ≠ 0) :
154154
(single f₁ g₁ + single f₂ g₂).support = {f₁, f₂} := by
155155
rw [support_add_eq, support_single_ne_zero _ hg₁, support_single_ne_zero _ hg₂]
156-
· simp [pair_comm f₂ f₁]
156+
· simp
157157
· simp [support_single_ne_zero, *]
158158

159159
lemma support_single_add_single_subset [DecidableEq ι] {f₁ f₂ : ι} {g₁ g₂ : M} :

Mathlib/Combinatorics/SimpleGraph/StronglyRegular.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ theorem compl_neighborFinset_sdiff_inter_eq {v w : V} :
113113
theorem sdiff_compl_neighborFinset_inter_eq {v w : V} (h : G.Adj v w) :
114114
((G.neighborFinset v)ᶜ ∩ (G.neighborFinset w)ᶜ) \ ({w} ∪ {v}) =
115115
(G.neighborFinset v)ᶜ ∩ (G.neighborFinset w)ᶜ := by
116-
simpa using(adj_symm _ h), h⟩
116+
simpa usingh, adj_symm _ h⟩
117117

118118
theorem IsSRGWith.compl_is_regular (h : G.IsSRGWith n k ℓ μ) :
119119
Gᶜ.IsRegularOfDegree (n - k - 1) := by

Mathlib/Data/Finset/Basic.lean

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,22 +582,49 @@ def Finset.union (s t : Finset α) (h : Disjoint s t) :
582582
Equiv.setCongr (coe_union _ _) |>.trans (Equiv.Set.union (disjoint_coe.mpr h)) |>.symm
583583

584584
@[simp]
585-
theorem Finset.union_symm_inl (h : Disjoint s t) (x : s) :
585+
theorem Finset.union_inl (h : Disjoint s t) (x : s) :
586586
Equiv.Finset.union s t h (Sum.inl x) = ⟨x, Finset.mem_union.mpr <| Or.inl x.2⟩ :=
587587
rfl
588588

589589
@[simp]
590-
theorem Finset.union_symm_inr (h : Disjoint s t) (y : t) :
590+
theorem Finset.union_inr (h : Disjoint s t) (y : t) :
591591
Equiv.Finset.union s t h (Sum.inr y) = ⟨y, Finset.mem_union.mpr <| Or.inr y.2⟩ :=
592592
rfl
593593

594+
@[deprecated (since := "2024-06-07")] alias Finset.union_symm_inl := Finset.union_inl
595+
@[deprecated (since := "2024-06-07")] alias Finset.union_symm_inr := Finset.union_inr
596+
597+
@[simp]
598+
theorem Finset.union_symm_left (h : Disjoint s t) {i : α} (hi : i ∈ s)
599+
(hi' : i ∈ s ∪ t) : (Equiv.Finset.union s t h).symm ⟨i, hi'⟩ = Sum.inl ⟨i, hi⟩ := by
600+
simp [Equiv.symm_apply_eq]
601+
602+
@[simp]
603+
theorem Finset.union_symm_right (h : Disjoint s t) {i : α} (hi : i ∈ t)
604+
(hi' : i ∈ s ∪ t) : (Equiv.Finset.union s t h).symm ⟨i, hi'⟩ = Sum.inr ⟨i, hi⟩ := by
605+
simp [Equiv.symm_apply_eq]
606+
594607
/-- The type of dependent functions on the disjoint union of finsets `s ∪ t` is equivalent to the
595608
type of pairs of functions on `s` and on `t`. This is similar to `Equiv.sumPiEquivProdPi`. -/
596609
def piFinsetUnion {ι} [DecidableEq ι] (α : ι → Type*) {s t : Finset ι} (h : Disjoint s t) :
597610
((∀ i : s, α i) × ∀ i : t, α i) ≃ ∀ i : (s ∪ t : Finset ι), α i :=
598611
let e := Equiv.Finset.union s t h
599612
sumPiEquivProdPi (fun b ↦ α (e b)) |>.symm.trans (.piCongrLeft (fun i : ↥(s ∪ t) ↦ α i) e)
600613

614+
lemma piFinsetUnion_left {ι} [DecidableEq ι] (α : ι → Type*) {s t : Finset ι}
615+
(h : Disjoint s t) {f g} {i : ι} (hi : i ∈ s) (hi' : i ∈ s ∪ t) :
616+
piFinsetUnion α h (f, g) ⟨i, hi'⟩ = f ⟨i, hi⟩ := by
617+
simp_rw [piFinsetUnion, sumPiEquivProdPi, piCongrLeft, piCongrLeft', trans_apply, coe_fn_symm_mk]
618+
rw! [Finset.union_symm_left h hi hi']
619+
rfl
620+
621+
lemma piFinsetUnion_right {ι} [DecidableEq ι] (α : ι → Type*) {s t : Finset ι}
622+
(h : Disjoint s t) {f g} {i : ι} (hi : i ∈ t) (hi' : i ∈ s ∪ t) :
623+
Equiv.piFinsetUnion α h (f, g) ⟨i, hi'⟩ = g ⟨i, hi⟩ := by
624+
simp_rw [piFinsetUnion, sumPiEquivProdPi, piCongrLeft, piCongrLeft', trans_apply, coe_fn_symm_mk]
625+
rw! [Finset.union_symm_right h hi hi']
626+
rfl
627+
601628
/-- A finset is equivalent to its coercion as a set. -/
602629
def _root_.Finset.equivToSet (s : Finset α) : s ≃ (s : Set α) where
603630
toFun a := ⟨a.1, mem_coe.2 a.2

Mathlib/Data/Finset/Lattice/Lemmas.lean

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ theorem insert_eq (a : α) (s : Finset α) : insert a s = {a} ∪ s :=
7272
lemma singleton_union (x : α) (s : Finset α) : {x} ∪ s = insert x s :=
7373
rfl
7474

75-
@[simp, grind =]
75+
/- We lower the simp-priority of `union_singleton` to ensure that `{x} ∪ {y}`
76+
simplifies to `{x, y}` and not `{y, x}`. -/
77+
78+
@[simp 900, grind =]
7679
lemma union_singleton (x : α) (s : Finset α) : s ∪ {x} = insert x s := by
7780
rw [Finset.union_comm, singleton_union]
7881

Mathlib/Data/Finset/Update.lean

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Floris van Doorn
66
module
77

88
public import Mathlib.Data.Finset.Pi
9+
public import Mathlib.Data.Fintype.Defs
910
public import Mathlib.Logic.Function.DependsOn
1011

1112
/-!
@@ -20,6 +21,7 @@ for other purposes.
2021

2122
@[expose] public section
2223
variable {ι : Sort _} {π : ι → Sort _} {x : ∀ i, π i} [DecidableEq ι]
24+
{s t : Finset ι} {y : ∀ i : s, π i} {z : ∀ i : t, π i} {i : ι}
2325

2426
namespace Function
2527

@@ -30,22 +32,22 @@ def updateFinset (x : ∀ i, π i) (s : Finset ι) (y : ∀ i : ↥s, π i) (i :
3032

3133
open Finset Equiv
3234

33-
theorem updateFinset_def {s : Finset ι} {y} :
35+
theorem updateFinset_def :
3436
updateFinset x s y = fun i ↦ if hi : i ∈ s then y ⟨i, hi⟩ else x i :=
3537
rfl
3638

3739
@[simp] theorem updateFinset_empty {y} : updateFinset x ∅ y = x :=
3840
rfl
3941

40-
theorem updateFinset_singleton {i y} :
42+
theorem updateFinset_singleton {y} :
4143
updateFinset x {i} y = Function.update x i (y ⟨i, mem_singleton_self i⟩) := by
4244
congr with j
4345
by_cases hj : j = i
4446
· cases hj
4547
simp only [dif_pos, Finset.mem_singleton, update_self, updateFinset]
4648
· simp [hj, updateFinset]
4749

48-
theorem update_eq_updateFinset {i y} :
50+
theorem update_eq_updateFinset {y} :
4951
Function.update x i y = updateFinset x {i} (uniqueElim y) := by
5052
congr with j
5153
by_cases hj : j = i
@@ -71,8 +73,7 @@ theorem _root_.DependsOn.update {α : Type*} {f : (Π i, π i) → α} {s : Fins
7173
simp_rw [Function.update_eq_updateFinset, erase_eq, coe_sdiff]
7274
exact hf.updateFinset _
7375

74-
theorem updateFinset_updateFinset {s t : Finset ι} (hst : Disjoint s t)
75-
{y : ∀ i : ↥s, π i} {z : ∀ i : ↥t, π i} :
76+
theorem updateFinset_updateFinset (hst : Disjoint s t) :
7677
updateFinset (updateFinset x s y) t z =
7778
updateFinset x (s ∪ t) (Equiv.piFinsetUnion π hst ⟨y, z⟩) := by
7879
set e := Equiv.Finset.union s t hst
@@ -107,4 +108,22 @@ lemma updateFinset_restrict {s : Finset ι} (x : Π i, π i) :
107108
ext i
108109
simp [updateFinset]
109110

111+
-- this would be slightly nicer if we had a version of `Equiv.piFinsetUnion` for `insert`.
112+
theorem update_updateFinset {z} (hi : i ∉ s) :
113+
Function.update (updateFinset x s y) i z = updateFinset x (s ∪ {i})
114+
((Equiv.piFinsetUnion π <| Finset.disjoint_singleton_right.mpr hi) (y, uniqueElim z)) := by
115+
rw [update_eq_updateFinset, updateFinset_updateFinset]
116+
117+
theorem updateFinset_congr (h : s = t) :
118+
updateFinset x s y = updateFinset x t (fun i ↦ y ⟨i, h ▸ i.prop⟩) := by
119+
subst h; rfl
120+
121+
theorem updateFinset_univ [Fintype ι] {y : ∀ i : Finset.univ, π i} :
122+
updateFinset x .univ y = fun i : ι ↦ y ⟨i, Finset.mem_univ i⟩ := by
123+
simp [updateFinset_def]
124+
125+
theorem updateFinset_univ_apply [Fintype ι] {y : ∀ i : Finset.univ, π i} {i : ι} :
126+
updateFinset x .univ y i = y ⟨i, Finset.mem_univ i⟩ := by
127+
simp [updateFinset_def]
128+
110129
end Function

Mathlib/RingTheory/MvPolynomial/IrreducibleQuadratic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ theorem irreducible_sumSMulXSMulY [IsDomain R]
220220
· rwa [MvPolynomial.mem_support_iff, hcoeff, ← Finsupp.mem_support_iff]
221221
· simp [ι]
222222
· rw [hsupp, Finset.coe_map, ι.injective.injOn.pairwiseDisjoint_image]
223-
suffices (c.support : Set n).PairwiseDisjoint fun x ↦ {Sum.inr x, Sum.inl x} by
223+
suffices (c.support : Set n).PairwiseDisjoint fun x ↦ {Sum.inl x, Sum.inr x} by
224224
simpa [ι, Function.comp_def, Finsupp.support_add_eq, Finsupp.support_single_ne_zero]
225225
simp [Set.PairwiseDisjoint, Set.Pairwise, ne_comm]
226226
· intro r hr

Mathlib/Tactic/Common.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public import Mathlib.Tactic.Conv
5555
public import Mathlib.Tactic.Convert
5656
public import Mathlib.Tactic.DefEqTransformations
5757
public import Mathlib.Tactic.DeprecateTo
58+
public import Mathlib.Tactic.DepRewrite
5859
public import Mathlib.Tactic.ErwQuestion
5960
public import Mathlib.Tactic.Eqns
6061
public import Mathlib.Tactic.ExistsI

0 commit comments

Comments
 (0)