Skip to content

Commit 92d78f8

Browse files
committed
feat: attach and filter lemmas (#1470)
Match leanprover-community/mathlib3#18087
1 parent 0821e8f commit 92d78f8

File tree

11 files changed

+142
-31
lines changed

11 files changed

+142
-31
lines changed

Mathlib/Algebra/BigOperators/Basic.lean

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import Mathlib.Data.Fintype.Basic
1515
import Mathlib.Data.Multiset.Powerset
1616
import Mathlib.Data.Set.Pairwise.Basic
1717

18-
#align_import algebra.big_operators.basic from "leanprover-community/mathlib"@"fa2309577c7009ea243cffdf990cd6c84f0ad497"
18+
#align_import algebra.big_operators.basic from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1919

2020
/-!
2121
# Big operators
@@ -187,6 +187,12 @@ theorem prod_eq_multiset_prod [CommMonoid β] (s : Finset α) (f : α → β) :
187187
#align finset.prod_eq_multiset_prod Finset.prod_eq_multiset_prod
188188
#align finset.sum_eq_multiset_sum Finset.sum_eq_multiset_sum
189189

190+
@[to_additive (attr := simp)]
191+
lemma prod_map_val [CommMonoid β] (s : Finset α) (f : α → β) : (s.1.map f).prod = ∏ a in s, f a :=
192+
rfl
193+
#align finset.prod_map_val Finset.prod_map_val
194+
#align finset.sum_map_val Finset.sum_map_val
195+
190196
@[to_additive]
191197
theorem prod_eq_fold [CommMonoid β] (s : Finset α) (f : α → β) :
192198
∏ x in s, f x = s.fold ((· * ·) : β → β → β) 1 f :=
@@ -1775,11 +1781,19 @@ theorem sum_const_nat {m : ℕ} {f : α → ℕ} (h₁ : ∀ x ∈ s, f x = m) :
17751781
apply sum_congr rfl h₁
17761782
#align finset.sum_const_nat Finset.sum_const_nat
17771783

1784+
lemma natCast_card_filter [AddCommMonoidWithOne β] (p) [DecidablePred p] (s : Finset α) :
1785+
((filter p s).card : β) = ∑ a in s, if p a then (1 : β) else 0 := by
1786+
rw [sum_ite, sum_const_zero, add_zero, sum_const, nsmul_one]
1787+
#align finset.nat_cast_card_filter Finset.natCast_card_filter
1788+
1789+
lemma card_filter (p) [DecidablePred p] (s : Finset α) :
1790+
(filter p s).card = ∑ a in s, ite (p a) 1 0 := natCast_card_filter _ _
1791+
#align finset.card_filter Finset.card_filter
1792+
17781793
@[simp]
1779-
theorem sum_boole {s : Finset α} {p : α → Prop} [NonAssocSemiring β] {hp : DecidablePred p} :
1780-
(∑ x in s, if p x then (1 : β) else (0 : β)) = (s.filter p).card := by
1781-
simp only [add_zero, mul_one, Finset.sum_const, nsmul_eq_mul, eq_self_iff_true,
1782-
Finset.sum_const_zero, Finset.sum_ite, mul_zero]
1794+
lemma sum_boole {s : Finset α} {p : α → Prop} [AddCommMonoidWithOne β] [DecidablePred p] :
1795+
(∑ x in s, if p x then 1 else 0 : β) = (s.filter p).card :=
1796+
(natCast_card_filter _ _).symm
17831797
#align finset.sum_boole Finset.sum_boole
17841798

17851799
theorem _root_.Commute.sum_right [NonUnitalNonAssocSemiring β] (s : Finset α) (f : α → β) (b : β)

Mathlib/Algebra/BigOperators/Order.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Mathlib.Algebra.BigOperators.Basic
99
import Mathlib.Data.Fintype.Card
1010
import Mathlib.Tactic.GCongr.Core
1111

12-
#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
12+
#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1313

1414
/-!
1515
# Results about big operators with values in an ordered algebraic structure.
@@ -223,7 +223,6 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
223223
refine' (Multiset.prod_le_pow_card (s.val.map f) n _).trans _
224224
· simpa using h
225225
· simp
226-
rfl
227226
#align finset.prod_le_pow_card Finset.prod_le_pow_card
228227
#align finset.sum_le_card_nsmul Finset.sum_le_card_nsmul
229228

Mathlib/Data/Finset/Card.lean

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Authors: Leonardo de Moura, Jeremy Avigad
66
import Mathlib.Init.CCLemmas
77
import Mathlib.Data.Finset.Image
88

9-
#align_import data.finset.card from "leanprover-community/mathlib"@"9003f28797c0664a49e4179487267c494477d853"
9+
#align_import data.finset.card from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1010

1111
/-!
1212
# Cardinality of a finite set
@@ -48,6 +48,9 @@ theorem card_def (s : Finset α) : s.card = Multiset.card s.1 :=
4848
rfl
4949
#align finset.card_def Finset.card_def
5050

51+
@[simp] lemma card_val (s : Finset α) : Multiset.card s.1 = s.card := rfl
52+
#align finset.card_val Finset.card_val
53+
5154
@[simp]
5255
theorem card_mk {m nodup} : (⟨m, nodup⟩ : Finset α).card = Multiset.card m :=
5356
rfl

Mathlib/Data/Finset/Image.lean

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Mathlib.Data.Fin.Basic
88
import Mathlib.Data.Finset.Basic
99
import Mathlib.Data.Int.Order.Basic
1010

11-
#align_import data.finset.image from "leanprover-community/mathlib"@"b685f506164f8d17a6404048bc4d696739c5d976"
11+
#align_import data.finset.image from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1212

1313
/-! # Image and map operations on finite sets
1414
@@ -187,6 +187,25 @@ theorem filter_map {p : β → Prop} [DecidablePred p] :
187187
eq_of_veq (map_filter _ _ _)
188188
#align finset.filter_map Finset.filter_map
189189

190+
lemma map_filter' (p : α → Prop) [DecidablePred p] (f : α ↪ β) (s : Finset α)
191+
[DecidablePred (∃ a, p a ∧ f a = ·)] :
192+
(s.filter p).map f = (s.map f).filter fun b => ∃ a, p a ∧ f a = b := by
193+
simp [(· ∘ ·), filter_map, f.injective.eq_iff]
194+
#align finset.map_filter' Finset.map_filter'
195+
196+
lemma filter_attach' [DecidableEq α] (s : Finset α) (p : s → Prop) [DecidablePred p] :
197+
s.attach.filter p =
198+
(s.filter fun x => ∃ h, p ⟨x, h⟩).attach.map
199+
⟨Subtype.map id <| filter_subset _ _, Subtype.map_injective _ injective_id⟩ :=
200+
eq_of_veq <| Multiset.filter_attach' _ _
201+
#align finset.filter_attach' Finset.filter_attach'
202+
203+
lemma filter_attach (p : α → Prop) [DecidablePred p] (s : Finset α) :
204+
s.attach.filter (fun a : s ↦ p a) =
205+
(s.filter p).attach.map ((Embedding.refl _).subtypeMap mem_of_mem_filter) :=
206+
eq_of_veq <| Multiset.filter_attach _ _
207+
#align finset.filter_attach Finset.filter_attach
208+
190209
theorem map_filter {f : α ≃ β} {p : α → Prop} [DecidablePred p] :
191210
(s.filter p).map f.toEmbedding = (s.map f.toEmbedding).filter (p ∘ f.symm) := by
192211
simp only [filter_map, Function.comp, Equiv.toEmbedding_apply, Equiv.symm_apply_apply]

Mathlib/Data/List/Basic.lean

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Mathlib.Init.Core
1010
import Std.Data.List.Lemmas
1111
import Mathlib.Tactic.Common
1212

13-
#align_import data.list.basic from "leanprover-community/mathlib"@"9da1b3534b65d9661eb8f42443598a92bbb49211"
13+
#align_import data.list.basic from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1414

1515
/-!
1616
# Basic properties of lists
@@ -2989,6 +2989,9 @@ end ModifyLast
29892989
#align list.pmap List.pmap
29902990
#align list.attach List.attach
29912991

2992+
@[simp] lemma attach_nil : ([] : List α).attach = [] := rfl
2993+
#align list.attach_nil List.attach_nil
2994+
29922995
theorem sizeOf_lt_sizeOf_of_mem [SizeOf α] {x : α} {l : List α} (hx : x ∈ l) :
29932996
SizeOf.sizeOf x < SizeOf.sizeOf l := by
29942997
induction' l with h t ih <;> cases hx <;> rw [cons.sizeOf_spec]
@@ -3480,8 +3483,35 @@ theorem monotone_filter_right (l : List α) ⦃p q : α → Bool⦄
34803483

34813484
#align list.map_filter List.map_filter
34823485

3486+
lemma map_filter' {f : α → β} (hf : Injective f) (l : List α)
3487+
[DecidablePred fun b => ∃ a, p a ∧ f a = b] :
3488+
(l.filter p).map f = (l.map f).filter fun b => ∃ a, p a ∧ f a = b := by
3489+
simp [(· ∘ ·), map_filter, hf.eq_iff]
3490+
#align list.map_filter' List.map_filter'
3491+
3492+
lemma filter_attach' (l : List α) (p : {a // a ∈ l} → Bool) [DecidableEq α] :
3493+
l.attach.filter p =
3494+
(l.filter fun x => ∃ h, p ⟨x, h⟩).attach.map (Subtype.map id fun x => mem_of_mem_filter) := by
3495+
classical
3496+
refine' map_injective_iff.2 Subtype.coe_injective _
3497+
simp [(· ∘ ·), map_filter' _ Subtype.coe_injective]
3498+
#align list.filter_attach' List.filter_attach'
3499+
3500+
-- porting note: `Lean.Internal.coeM` forces us to type-ascript `{x // x ∈ l}`
3501+
lemma filter_attach (l : List α) (p : α → Bool) :
3502+
(l.attach.filter fun x => p x : List {x // x ∈ l}) =
3503+
(l.filter p).attach.map (Subtype.map id fun x => mem_of_mem_filter) :=
3504+
map_injective_iff.2 Subtype.coe_injective <| by
3505+
simp_rw [map_map, (· ∘ ·), Subtype.map, id.def, ←Function.comp_apply (g := Subtype.val),
3506+
←map_filter, attach_map_val]
3507+
#align list.filter_attach List.filter_attach
3508+
34833509
#align list.filter_filter List.filter_filter
34843510

3511+
lemma filter_comm (q) (l : List α) : filter p (filter q l) = filter q (filter p l) := by
3512+
simp [and_comm]
3513+
#align list.filter_comm List.filter_comm
3514+
34853515
@[simp]
34863516
theorem filter_true (l : List α) :
34873517
filter (fun _ => true) l = l := by induction l <;> simp [*, filter]

Mathlib/Data/List/Count.lean

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Parikshit Khanna, Jeremy Avigad, Leonardo de Moura, Floris van Doorn, M
55
-/
66
import Mathlib.Data.List.BigOperators.Basic
77

8-
#align_import data.list.count from "leanprover-community/mathlib"@"47adfab39a11a072db552f47594bf8ed2cf8a722"
8+
#align_import data.list.count from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
99

1010
/-!
1111
# Counting in lists
@@ -71,6 +71,11 @@ theorem length_filter_lt_length_iff_exists (l) :
7171

7272
#align list.countp_map List.countP_map
7373

74+
-- porting note: `Lean.Internal.coeM` forces us to type-ascript `{x // x ∈ l}`
75+
lemma countP_attach (l : List α) : l.attach.countP (fun a : {x // x ∈ l} ↦ p a) = l.countP p := by
76+
simp_rw [←Function.comp_apply (g := Subtype.val), ←countP_map, attach_map_val]
77+
#align list.countp_attach List.countP_attach
78+
7479
#align list.countp_mono_left List.countP_mono_left
7580

7681
#align list.countp_congr List.countP_congr
@@ -147,6 +152,11 @@ theorem count_bind {α β} [DecidableEq β] (l : List α) (f : α → List β) (
147152
count x (l.bind f) = sum (map (count x ∘ f) l) := by rw [List.bind, count_join, map_map]
148153
#align list.count_bind List.count_bind
149154

155+
@[simp]
156+
lemma count_attach (a : {x // x ∈ l}) : l.attach.count a = l.count ↑a :=
157+
Eq.trans (countP_congr fun _ _ => by simp [Subtype.ext_iff]) <| countP_attach _ _
158+
#align list.count_attach List.count_attach
159+
150160
@[simp]
151161
theorem count_map_of_injective {α β} [DecidableEq α] [DecidableEq β] (l : List α) (f : α → β)
152162
(hf : Function.Injective f) (x : α) : count (f x) (map f l) = count x l := by

Mathlib/Data/List/Perm.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Mathlib.Data.List.Permutation
88
import Mathlib.Data.List.Range
99
import Mathlib.Data.Nat.Factorial.Basic
1010

11-
#align_import data.list.perm from "leanprover-community/mathlib"@"47adfab39a11a072db552f47594bf8ed2cf8a722"
11+
#align_import data.list.perm from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1212

1313
/-!
1414
# List Permutations
@@ -475,7 +475,7 @@ theorem Subperm.countP_le (p : α → Bool) {l₁ l₂ : List α} :
475475
#align list.subperm.countp_le List.Subperm.countP_le
476476

477477
theorem Perm.countP_congr (s : l₁ ~ l₂) {p p' : α → Bool}
478-
(hp : ∀ x ∈ l₁, p x = p' x) : l₁.countP p = l₂.countP p' := by
478+
(hp : ∀ x ∈ l₁, p x p' x) : l₁.countP p = l₂.countP p' := by
479479
rw [← s.countP_eq p']
480480
clear s
481481
induction' l₁ with y s hs

Mathlib/Data/Multiset/Basic.lean

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Mathlib.Data.Set.List
77
import Mathlib.Data.List.Perm
88
import Mathlib.Init.Quot -- Porting note: added import
99

10-
#align_import data.multiset.basic from "leanprover-community/mathlib"@"06a655b5fcfbda03502f9158bbf6c0f1400886f9"
10+
#align_import data.multiset.basic from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1111

1212
/-!
1313
# Multisets
@@ -2091,6 +2091,10 @@ theorem filter_filter (q) [DecidablePred q] (s : Multiset α) :
20912091
Quot.inductionOn s fun l => by simp
20922092
#align multiset.filter_filter Multiset.filter_filter
20932093

2094+
lemma filter_comm (q) [DecidablePred q] (s : Multiset α) :
2095+
filter p (filter q s) = filter q (filter p s) := by simp [and_comm]
2096+
#align multiset.filter_comm Multiset.filter_comm
2097+
20942098
theorem filter_add_filter (q) [DecidablePred q] (s : Multiset α) :
20952099
filter p s + filter q s = filter (fun a => p a ∨ q a) s + filter (fun a => p a ∧ q a) s :=
20962100
Multiset.induction_on s rfl fun a s IH => by by_cases p a <;> by_cases q a <;> simp [*]
@@ -2108,6 +2112,12 @@ theorem map_filter (f : β → α) (s : Multiset β) : filter p (map f s) = map
21082112
Quot.inductionOn s fun l => by simp [List.map_filter]; rfl
21092113
#align multiset.map_filter Multiset.map_filter
21102114

2115+
lemma map_filter' {f : α → β} (hf : Injective f) (s : Multiset α)
2116+
[DecidablePred fun b => ∃ a, p a ∧ f a = b] :
2117+
(s.filter p).map f = (s.map f).filter fun b => ∃ a, p a ∧ f a = b := by
2118+
simp [(· ∘ ·), map_filter, hf.eq_iff]
2119+
#align multiset.map_filter' Multiset.map_filter'
2120+
21112121
/-! ### Simultaneously filter and map elements of a multiset -/
21122122

21132123

@@ -2312,6 +2322,25 @@ theorem countP_map (f : α → β) (s : Multiset α) (p : β → Prop) [Decidabl
23122322
add_comm]
23132323
#align multiset.countp_map Multiset.countP_map
23142324

2325+
-- porting note: `Lean.Internal.coeM` forces us to type-ascript `{a // a ∈ s}`
2326+
lemma countP_attach (s : Multiset α) : s.attach.countP (fun a : {a // a ∈ s} ↦ p a) = s.countP p :=
2327+
Quotient.inductionOn s fun l => by
2328+
simp only [quot_mk_to_coe, coe_countP]
2329+
-- porting note: was
2330+
-- rw [quot_mk_to_coe, coe_attach, coe_countP]
2331+
-- exact List.countP_attach _ _
2332+
rw [coe_attach]
2333+
refine (coe_countP _ _).trans ?_
2334+
convert List.countP_attach _ _
2335+
rfl
2336+
#align multiset.countp_attach Multiset.countP_attach
2337+
2338+
lemma filter_attach (s : Multiset α) (p : α → Prop) [DecidablePred p] :
2339+
(s.attach.filter fun a : {a // a ∈ s} ↦ p ↑a) =
2340+
(s.filter p).attach.map (Subtype.map id fun _ ↦ Multiset.mem_of_mem_filter) :=
2341+
Quotient.inductionOn s fun l ↦ congr_arg _ (List.filter_attach l p)
2342+
#align multiset.filter_attach Multiset.filter_attach
2343+
23152344
variable {p}
23162345

23172346
theorem countP_pos {s} : 0 < countP p s ↔ ∃ a ∈ s, p a :=
@@ -2348,7 +2377,7 @@ end
23482377

23492378
section
23502379

2351-
variable [DecidableEq α]
2380+
variable [DecidableEq α] {s : Multiset α}
23522381

23532382
/-- `count a s` is the multiplicity of `a` in `s`. -/
23542383
def count (a : α) : Multiset α → ℕ :=
@@ -2421,6 +2450,11 @@ theorem count_nsmul (a : α) (n s) : count a (n • s) = n * count a s := by
24212450
induction n <;> simp [*, succ_nsmul', succ_mul, zero_nsmul]
24222451
#align multiset.count_nsmul Multiset.count_nsmul
24232452

2453+
@[simp]
2454+
lemma count_attach (a : {x // x ∈ s}) : s.attach.count a = s.count ↑a :=
2455+
Eq.trans (countP_congr rfl fun _ _ => by simp [Subtype.ext_iff]) <| countP_attach _ _
2456+
#align multiset.count_attach Multiset.count_attach
2457+
24242458
theorem count_pos {a : α} {s : Multiset α} : 0 < count a s ↔ a ∈ s := by simp [count, countP_pos]
24252459
#align multiset.count_pos Multiset.count_pos
24262460

@@ -2577,14 +2611,6 @@ theorem count_map_eq_count' [DecidableEq β] (f : α → β) (s : Multiset α) (
25772611
contradiction
25782612
#align multiset.count_map_eq_count' Multiset.count_map_eq_count'
25792613

2580-
@[simp]
2581-
theorem attach_count_eq_count_coe (m : Multiset α) (a) : m.attach.count a = m.count (a : α) :=
2582-
calc
2583-
m.attach.count a = (m.attach.map (Subtype.val : _ → α)).count (a : α) :=
2584-
(Multiset.count_map_eq_count' _ _ Subtype.coe_injective _).symm
2585-
_ = m.count (a : α) := congr_arg _ m.attach_map_val
2586-
#align multiset.attach_count_eq_count_coe Multiset.attach_count_eq_count_coe
2587-
25882614
theorem filter_eq' (s : Multiset α) (b : α) : s.filter (· = b) = replicate (count b s) b :=
25892615
Quotient.inductionOn s <| fun l => by
25902616
simp only [quot_mk_to_coe, coe_filter, mem_coe, coe_count]
@@ -2874,6 +2900,17 @@ theorem map_injective {f : α → β} (hf : Function.Injective f) :
28742900
Function.Injective (Multiset.map f) := fun _x _y => (map_eq_map hf).1
28752901
#align multiset.map_injective Multiset.map_injective
28762902

2903+
lemma filter_attach' (s : Multiset α) (p : {a // a ∈ s} → Prop) [DecidableEq α]
2904+
[DecidablePred p] :
2905+
s.attach.filter p =
2906+
(s.filter fun x ↦ ∃ h, p ⟨x, h⟩).attach.map (Subtype.map id fun x ↦ mem_of_mem_filter) := by
2907+
classical
2908+
refine' Multiset.map_injective Subtype.val_injective _
2909+
rw [map_filter' _ Subtype.val_injective]
2910+
simp only [Function.comp, Subtype.exists, coe_mk,
2911+
exists_and_right, exists_eq_right, attach_map_val, map_map, map_coe, id.def]
2912+
#align multiset.filter_attach' Multiset.filter_attach'
2913+
28772914
end Map
28782915

28792916
section Quot

Mathlib/Data/Multiset/Lattice.lean

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Authors: Mario Carneiro
66
import Mathlib.Data.Multiset.FinsetOps
77
import Mathlib.Data.Multiset.Fold
88

9-
#align_import data.multiset.lattice from "leanprover-community/mathlib"@"9003f28797c0664a49e4179487267c494477d853"
9+
#align_import data.multiset.lattice from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1010

1111
/-!
1212
# Lattice operations on multisets
@@ -55,6 +55,7 @@ theorem sup_add (s₁ s₂ : Multiset α) : (s₁ + s₂).sup = s₁.sup ⊔ s
5555
Eq.trans (by simp [sup]) (fold_add _ _ _ _ _)
5656
#align multiset.sup_add Multiset.sup_add
5757

58+
@[simp]
5859
theorem sup_le {s : Multiset α} {a : α} : s.sup ≤ a ↔ ∀ b ∈ s, b ≤ a :=
5960
Multiset.induction_on s (by simp)
6061
(by simp (config := { contextual := true }) [or_imp, forall_and])
@@ -139,6 +140,7 @@ theorem inf_add (s₁ s₂ : Multiset α) : (s₁ + s₂).inf = s₁.inf ⊓ s
139140
Eq.trans (by simp [inf]) (fold_add _ _ _ _ _)
140141
#align multiset.inf_add Multiset.inf_add
141142

143+
@[simp]
142144
theorem le_inf {s : Multiset α} {a : α} : a ≤ s.inf ↔ ∀ b ∈ s, a ≤ b :=
143145
Multiset.induction_on s (by simp)
144146
(by simp (config := { contextual := true }) [or_imp, forall_and])

Mathlib/Data/Set/Finite.lean

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Mathlib.Data.Finset.Basic
77
import Mathlib.Data.Set.Functor
88
import Mathlib.Data.Finite.Basic
99

10-
#align_import data.set.finite from "leanprover-community/mathlib"@"ffde2d8a6e689149e44fd95fa862c23a57f8c780"
10+
#align_import data.set.finite from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
1111

1212
/-!
1313
# Finite sets
@@ -1208,10 +1208,7 @@ theorem empty_card' {h : Fintype.{u} (∅ : Set α)} : @Fintype.card (∅ : Set
12081208

12091209
theorem card_fintypeInsertOfNotMem {a : α} (s : Set α) [Fintype s] (h : a ∉ s) :
12101210
@Fintype.card _ (fintypeInsertOfNotMem s h) = Fintype.card s + 1 := by
1211-
rw [fintypeInsertOfNotMem, Fintype.card_ofFinset]
1212-
simp only [Finset.card, toFinset, Finset.map_val, Embedding.coe_subtype,
1213-
Multiset.card_cons, Multiset.card_map, add_left_inj]
1214-
rfl
1211+
simp [fintypeInsertOfNotMem, Fintype.card_ofFinset]
12151212
#align set.card_fintype_insert_of_not_mem Set.card_fintypeInsertOfNotMem
12161213

12171214
@[simp]

0 commit comments

Comments
 (0)