Skip to content

Commit c212f77

Browse files
committed
feat: lemmas relating Finset.univ and List.get (#11704)
We add sufficient lemmas for the simplifier to prove `∀ (l : List α), Finset.univ.val.map l.get = ↑l`, as well as the easier to apply phrasing `∀ (l : List α), Finset.univ.val.map (f <| l.get ·) = ↑(l.map f)`. We then add lemmas stating the corollaries for functions out of `Finset` which are built out of `Multiset.map`, such as `Finset.image` and `Finset.prod`.
1 parent 0e70892 commit c212f77

File tree

3 files changed

+48
-14
lines changed

3 files changed

+48
-14
lines changed

Mathlib/Algebra/BigOperators/Fin.lean

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,19 @@ end Finset
4444

4545
namespace Fin
4646

47-
@[to_additive]
48-
theorem prod_univ_def [CommMonoid β] {n : ℕ} (f : Fin n → β) :
49-
∏ i, f i = ((List.finRange n).map f).prod := by simp [univ_def]
50-
#align fin.prod_univ_def Fin.prod_univ_def
51-
#align fin.sum_univ_def Fin.sum_univ_def
52-
5347
@[to_additive]
5448
theorem prod_ofFn [CommMonoid β] {n : ℕ} (f : Fin n → β) : (List.ofFn f).prod = ∏ i, f i := by
55-
rw [List.ofFn_eq_map, prod_univ_def]
49+
simp [prod_eq_multiset_prod]
5650
#align fin.prod_of_fn Fin.prod_ofFn
5751
#align fin.sum_of_fn Fin.sum_ofFn
5852

53+
@[to_additive]
54+
theorem prod_univ_def [CommMonoid β] {n : ℕ} (f : Fin n → β) :
55+
∏ i, f i = ((List.finRange n).map f).prod := by
56+
rw [← List.ofFn_eq_map, prod_ofFn]
57+
#align fin.prod_univ_def Fin.prod_univ_def
58+
#align fin.sum_univ_def Fin.sum_univ_def
59+
5960
/-- A product of a function `f : Fin 0 → β` is `1` because `Fin 0` is empty -/
6061
@[to_additive "A sum of a function `f : Fin 0 → β` is `0` because `Fin 0` is empty"]
6162
theorem prod_univ_zero [CommMonoid β] (f : Fin 0 → β) : ∏ i, f i = 1 :=
@@ -95,6 +96,15 @@ theorem prod_univ_castSucc [CommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) :
9596
#align fin.prod_univ_cast_succ Fin.prod_univ_castSucc
9697
#align fin.sum_univ_cast_succ Fin.sum_univ_castSucc
9798

99+
@[to_additive (attr := simp)]
100+
theorem prod_univ_get [CommMonoid α] (l : List α) : ∏ i, l.get i = l.prod := by
101+
simp [Finset.prod_eq_multiset_prod]
102+
103+
@[to_additive (attr := simp)]
104+
theorem prod_univ_get' [CommMonoid β] (l : List α) (f : α → β) :
105+
∏ i, f (l.get i) = (l.map f).prod := by
106+
simp [Finset.prod_eq_multiset_prod]
107+
98108
@[to_additive]
99109
theorem prod_cons [CommMonoid β] {n : ℕ} (x : β) (f : Fin n → β) :
100110
(∏ i : Fin n.succ, (cons x f : Fin n.succ → β) i) = x * ∏ i : Fin n, f i := by
@@ -477,10 +487,8 @@ theorem prod_take_ofFn {n : ℕ} (f : Fin n → α) (i : ℕ) :
477487
#align list.sum_take_of_fn List.sum_take_ofFn
478488

479489
@[to_additive]
480-
theorem prod_ofFn {n : ℕ} {f : Fin n → α} : (ofFn f).prod = ∏ i, f i := by
481-
convert prod_take_ofFn f n
482-
· rw [take_all_of_le (le_of_eq (length_ofFn f))]
483-
· simp
490+
theorem prod_ofFn {n : ℕ} {f : Fin n → α} : (ofFn f).prod = ∏ i, f i :=
491+
Fin.prod_ofFn f
484492
#align list.prod_of_fn List.prod_ofFn
485493
#align list.sum_of_fn List.sum_ofFn
486494

Mathlib/Data/Fintype/Basic.lean

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Mario Carneiro
66
import Mathlib.Algebra.Ring.Hom.Defs -- FIXME: This import is bogus
77
import Mathlib.Data.Finset.Image
88
import Mathlib.Data.Fin.OrderHom
9+
import Mathlib.Data.List.FinRange
910

1011
#align_import data.fintype.basic from "leanprover-community/mathlib"@"d78597269638367c3863d40d45108f52207e03cf"
1112

@@ -836,6 +837,18 @@ theorem Fin.univ_def (n : ℕ) : (univ : Finset (Fin n)) = ⟨List.finRange n, L
836837
@[simp] theorem List.toFinset_finRange (n : ℕ) : (List.finRange n).toFinset = Finset.univ := by
837838
ext; simp
838839

840+
@[simp] theorem Fin.univ_val_map {n : ℕ} (f : Fin n → α) :
841+
Finset.univ.val.map f = List.ofFn f := by
842+
simp [List.ofFn_eq_map, univ_def]
843+
844+
theorem Fin.univ_image_def {n : ℕ} [DecidableEq α] (f : Fin n → α) :
845+
Finset.univ.image f = (List.ofFn f).toFinset := by
846+
simp [Finset.image]
847+
848+
theorem Fin.univ_map_def {n : ℕ} (f : Fin n ↪ α) :
849+
Finset.univ.map f = ⟨List.ofFn f, List.nodup_ofFn.mpr f.injective⟩ := by
850+
simp [Finset.map]
851+
839852
@[simp]
840853
theorem Fin.image_succAbove_univ {n : ℕ} (i : Fin (n + 1)) : univ.image i.succAbove = {i}ᶜ := by
841854
ext m
@@ -858,25 +871,33 @@ theorem Fin.image_castSucc (n : ℕ) :
858871
/-- Embed `Fin n` into `Fin (n + 1)` by prepending zero to the `univ` -/
859872
theorem Fin.univ_succ (n : ℕ) :
860873
(univ : Finset (Fin (n + 1))) =
861-
cons 0 (univ.map ⟨Fin.succ, Fin.succ_injective _⟩) (by simp [map_eq_image]) :=
874+
Finset.cons 0 (univ.map ⟨Fin.succ, Fin.succ_injective _⟩) (by simp [map_eq_image]) :=
862875
by simp [map_eq_image]
863876
#align fin.univ_succ Fin.univ_succ
864877

865878
/-- Embed `Fin n` into `Fin (n + 1)` by appending a new `Fin.last n` to the `univ` -/
866879
theorem Fin.univ_castSuccEmb (n : ℕ) :
867880
(univ : Finset (Fin (n + 1))) =
868-
cons (Fin.last n) (univ.map Fin.castSuccEmb.toEmbedding) (by simp [map_eq_image]) :=
881+
Finset.cons (Fin.last n) (univ.map Fin.castSuccEmb.toEmbedding) (by simp [map_eq_image]) :=
869882
by simp [map_eq_image]
870883
#align fin.univ_cast_succ Fin.univ_castSuccEmb
871884

872885
/-- Embed `Fin n` into `Fin (n + 1)` by inserting
873886
around a specified pivot `p : Fin (n + 1)` into the `univ` -/
874887
theorem Fin.univ_succAbove (n : ℕ) (p : Fin (n + 1)) :
875888
(univ : Finset (Fin (n + 1))) =
876-
cons p (univ.map <| (Fin.succAboveEmb p).toEmbedding) (by simp) :=
889+
Finset.cons p (univ.map <| (Fin.succAboveEmb p).toEmbedding) (by simp) :=
877890
by simp [map_eq_image]
878891
#align fin.univ_succ_above Fin.univ_succAbove
879892

893+
@[simp] theorem Fin.univ_image_get [DecidableEq α] (l : List α) :
894+
Finset.univ.image l.get = l.toFinset := by
895+
simp [univ_image_def]
896+
897+
@[simp] theorem Fin.univ_image_get' [DecidableEq β] (l : List α) (f : α → β) :
898+
Finset.univ.image (f <| l.get ·) = (l.map f).toFinset := by
899+
simp [univ_image_def]
900+
880901
@[instance]
881902
def Unique.fintype {α : Type*} [Unique α] : Fintype α :=
882903
Fintype.ofSubsingleton default

Mathlib/Data/List/OfFn.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,18 @@ theorem ofFn_mul' {m n} (f : Fin (m * n) → α) :
186186
simp_rw [mul_comm m n, mul_comm m, ofFn_mul, Fin.cast_mk]
187187
#align list.of_fn_mul' List.ofFn_mul'
188188

189+
@[simp]
189190
theorem ofFn_get : ∀ l : List α, (ofFn (get l)) = l
190191
| [] => rfl
191192
| a :: l => by
192193
rw [ofFn_succ]
193194
congr
194195
exact ofFn_get l
195196

197+
@[simp]
198+
theorem ofFn_get_eq_map {β : Type*} (l : List α) (f : α → β) : ofFn (f <| l.get ·) = l.map f := by
199+
rw [← Function.comp_def, ← map_ofFn, ofFn_get]
200+
196201
set_option linter.deprecated false in
197202
@[deprecated ofFn_get] -- 2023-01-17
198203
theorem ofFn_nthLe : ∀ l : List α, (ofFn fun i => nthLe l i i.2) = l :=

0 commit comments

Comments
 (0)