Skip to content

Commit 7a69696

Browse files
Vierkantorjcommelinmattrobball
committed
chore(Data.Finset): un-@[simp] filter_{true,false}_of_mem (#12907)
These are okay `@[simp]` lemmas in principle but sometimes discharging the hypothesis is very expensive. This PR adds some extra `@[simp]` lemmas instead; those should reduce the impact of the change quite a lot. Zulip thread: https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Near-timeout.20in.20.60mulEnergy_card_filter.60 Co-authored-by: Johan Commelin <johan@commelin.net> Co-authored-by: Matthew Ballard <matt@mrb.email>
1 parent 56dc11a commit 7a69696

File tree

8 files changed

+15
-10
lines changed

8 files changed

+15
-10
lines changed

Mathlib/Combinatorics/SetFamily/AhlswedeZhang.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ lemma truncatedSup_of_not_mem (h : a ∉ lowerClosure s) : truncatedSup s a =
121121
@[simp] lemma truncatedSup_empty (a : α) : truncatedSup ∅ a = ⊤ := truncatedSup_of_not_mem $ by simp
122122

123123
@[simp] lemma truncatedSup_singleton (b a : α) : truncatedSup {b} a = if a ≤ b then b else ⊤ := by
124-
simp [truncatedSup]; split_ifs <;> simp [*]
124+
simp [truncatedSup]; split_ifs <;> simp [Finset.filter_true_of_mem, *]
125125

126126
lemma le_truncatedSup : a ≤ truncatedSup s a := by
127127
rw [truncatedSup]
@@ -200,7 +200,7 @@ lemma truncatedInf_le : truncatedInf s a ≤ a := by
200200
@[simp] lemma truncatedInf_singleton (b a : α) : truncatedInf {b} a = if b ≤ a then b else ⊥ := by
201201
simp only [truncatedInf, coe_singleton, upperClosure_singleton, UpperSet.mem_Ici_iff,
202202
filter_congr_decidable, id_eq]
203-
split_ifs <;> simp [*]
203+
split_ifs <;> simp [Finset.filter_true_of_mem, *]
204204

205205
lemma map_truncatedInf (e : α ≃o β) (s : Finset α) (a : α) :
206206
e (truncatedInf s a) = truncatedInf (s.map e.toEquiv.toEmbedding) (e a) := by

Mathlib/Combinatorics/SimpleGraph/AdjMatrix.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ theorem trace_adjMatrix [AddCommMonoid α] [One α] : Matrix.trace (G.adjMatrix
242242
variable {α}
243243

244244
theorem adjMatrix_mul_self_apply_self [NonAssocSemiring α] (i : V) :
245-
(G.adjMatrix α * G.adjMatrix α) i i = degree G i := by simp
245+
(G.adjMatrix α * G.adjMatrix α) i i = degree G i := by simp [filter_true_of_mem]
246246
#align simple_graph.adj_matrix_mul_self_apply_self SimpleGraph.adjMatrix_mul_self_apply_self
247247

248248
variable {G}

Mathlib/Combinatorics/SimpleGraph/Regularity/Equitabilise.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ theorem equitabilise_aux (hs : a * m + b * (m + 1) = s.card) :
4646
(Q.parts.filter fun i => card i = m + 1).card = b := by
4747
-- Get rid of the easy case `m = 0`
4848
obtain rfl | m_pos := m.eq_zero_or_pos
49-
· refine' ⟨⊥, by simp, _, by simpa using hs.symm⟩
49+
· refine' ⟨⊥, by simp, _, by simpa [Finset.filter_true_of_mem] using hs.symm⟩
5050
simp only [le_zero_iff, card_eq_zero, mem_biUnion, exists_prop, mem_filter, id, and_assoc,
5151
sdiff_eq_empty_iff_subset, subset_iff]
5252
exact fun x hx a ha =>

Mathlib/Data/Finset/Basic.lean

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2625,15 +2625,17 @@ theorem filter_congr_decidable (s : Finset α) (p : α → Prop) (h : DecidableP
26252625
[DecidablePred p] : @filter α p h s = s.filter p := by congr
26262626
#align finset.filter_congr_decidable Finset.filter_congr_decidable
26272627

2628+
@[simp]
26282629
theorem filter_True {h} (s : Finset α) : @filter _ (fun _ => True) h s = s := by ext; simp
26292630
#align finset.filter_true Finset.filter_True
26302631

2632+
@[simp]
26312633
theorem filter_False {h} (s : Finset α) : @filter _ (fun _ => False) h s = ∅ := by ext; simp
26322634
#align finset.filter_false Finset.filter_False
26332635

26342636
variable {p q}
26352637

2636-
@[simp] lemma filter_eq_self : s.filter p = s ↔ ∀ x ∈ s, p x := by simp [Finset.ext_iff]
2638+
lemma filter_eq_self : s.filter p = s ↔ ∀ x ∈ s, p x := by simp [Finset.ext_iff]
26372639
#align finset.filter_eq_self Finset.filter_eq_self
26382640

26392641
theorem filter_eq_empty_iff : s.filter p = ∅ ↔ ∀ ⦃x⦄, x ∈ s → ¬p x := by simp [Finset.ext_iff]
@@ -2645,12 +2647,10 @@ theorem filter_nonempty_iff : (s.filter p).Nonempty ↔ ∃ a ∈ s, p a := by
26452647
#align finset.filter_nonempty_iff Finset.filter_nonempty_iff
26462648

26472649
/-- If all elements of a `Finset` satisfy the predicate `p`, `s.filter p` is `s`. -/
2648-
@[simp]
26492650
theorem filter_true_of_mem (h : ∀ x ∈ s, p x) : s.filter p = s := filter_eq_self.2 h
26502651
#align finset.filter_true_of_mem Finset.filter_true_of_mem
26512652

26522653
/-- If all elements of a `Finset` fail to satisfy the predicate `p`, `s.filter p` is `∅`. -/
2653-
@[simp]
26542654
theorem filter_false_of_mem (h : ∀ x ∈ s, ¬p x) : s.filter p = ∅ := filter_eq_empty_iff.2 h
26552655
#align finset.filter_false_of_mem Finset.filter_false_of_mem
26562656

@@ -2665,6 +2665,7 @@ theorem filter_congr {s : Finset α} (H : ∀ x ∈ s, p x ↔ q x) : filter p s
26652665

26662666
variable (p q)
26672667

2668+
@[simp]
26682669
theorem filter_empty : filter p ∅ = ∅ :=
26692670
subset_empty.1 <| filter_subset _ _
26702671
#align finset.filter_empty Finset.filter_empty

Mathlib/Data/Finset/Prod.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,12 @@ theorem filter_product_card (s : Finset α) (t : Finset β) (p : α → Prop) (q
182182
exact (disjoint_compl_right.inf_left _).inf_right _
183183
#align finset.filter_product_card Finset.filter_product_card
184184

185+
@[simp]
185186
theorem empty_product (t : Finset β) : (∅ : Finset α) ×ˢ t = ∅ :=
186187
rfl
187188
#align finset.empty_product Finset.empty_product
188189

190+
@[simp]
189191
theorem product_empty (s : Finset α) : s ×ˢ (∅ : Finset β) = ∅ :=
190192
eq_empty_of_forall_not_mem fun _ h => not_mem_empty _ (Finset.mem_product.1 h).2
191193
#align finset.product_empty Finset.product_empty

Mathlib/Data/Finset/Union.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ private lemma pairwiseDisjoint_fibers : Set.PairwiseDisjoint ↑t fun a ↦ s.fi
101101
ext fun b => by simpa using and_comm
102102

103103
lemma disjiUnion_filter_eq_of_maps_to (h : ∀ x ∈ s, f x ∈ t) :
104-
t.disjiUnion (fun a ↦ s.filter (f · = a)) pairwiseDisjoint_fibers = s := by simpa
104+
t.disjiUnion (fun a ↦ s.filter (f · = a)) pairwiseDisjoint_fibers = s := by
105+
simpa [filter_eq_self]
105106
#align finset.disj_Union_filter_eq_of_maps_to Finset.disjiUnion_filter_eq_of_maps_to
106107

107108
end DisjiUnion

Mathlib/Data/Nat/Factorization/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ See `Nat.card_multiples` for a "shifted-by-one" version. -/
994994
lemma card_multiples' (N n : ℕ) :
995995
((Finset.range N.succ).filter (fun k ↦ k ≠ 0 ∧ n ∣ k)).card = N / n := by
996996
induction N with
997-
| zero => simp
997+
| zero => simp [Finset.filter_false_of_mem]
998998
| succ N ih =>
999999
rw [Finset.range_succ, Finset.filter_insert]
10001000
by_cases h : n ∣ N.succ

Mathlib/LinearAlgebra/AffineSpace/Basis.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ theorem surjective_coord [Nontrivial ι] (i : ι) : Function.Surjective <| b.coo
259259
let s : Finset ι := {i, j}
260260
have hi : i ∈ s := by simp [s]
261261
let w : ι → k := fun j' => if j' = i then x else 1 - x
262-
have hw : s.sum w = 1 := by simp [s, w, Finset.sum_ite, Finset.filter_insert, hij]
262+
have hw : s.sum w = 1 := by simp [s, w, Finset.sum_ite, Finset.filter_insert, hij,
263+
Finset.filter_true_of_mem, Finset.filter_false_of_mem]
263264
use s.affineCombination k b w
264265
simp [w, b.coord_apply_combination_of_mem hi hw]
265266
#align affine_basis.surjective_coord AffineBasis.surjective_coord

0 commit comments

Comments
 (0)