Skip to content

Commit 80bf34f

Browse files
committed
feat: (s ∩ t).card = s.card + t.card - (s ∪ t).card (#10224)
once coerced to an `AddGroupWithOne`. Also unify `Finset.card_disjoint_union` and `Finset.card_union_eq` From LeanAPAP
1 parent c79c211 commit 80bf34f

File tree

22 files changed

+61
-46
lines changed

22 files changed

+61
-46
lines changed

Mathlib/Combinatorics/SetFamily/CauchyDavenport.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ lemma Finset.min_le_card_mul (hs : s.Nonempty) (ht : t.Nonempty) :
167167
obtain hgt | hgt := disjoint_or_nonempty_inter t (g⁻¹ • t)
168168
· rw [← card_smul_finset g⁻¹ t]
169169
refine' Or.inr ((add_le_add_right hst _).trans _)
170-
rw [← card_union_eq hgt]
170+
rw [← card_union_of_disjoint hgt]
171171
exact (card_le_card_mul_left _ hgs).trans (le_add_of_le_left aux1)
172172
-- Else, we're done by induction on either `(s', t')` or `(s'', t'')` depending on whether
173173
-- `|s| + |t| ≤ |s'| + |t'|` or `|s| + |t| < |s''| + |t''|`. One of those two inequalities must

Mathlib/Combinatorics/SetFamily/Compression/Down.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ theorem compression_idem (a : α) (𝒜 : Finset (Finset α)) : 𝓓 a (𝓓 a
283283
@[simp]
284284
theorem card_compression (a : α) (𝒜 : Finset (Finset α)) : (𝓓 a 𝒜).card = 𝒜.card := by
285285
rw [compression, card_disjUnion, filter_image,
286-
card_image_of_injOn ((erase_injOn' _).mono fun s hs => _), ← card_disjoint_union]
286+
card_image_of_injOn ((erase_injOn' _).mono fun s hs => _), ← card_union_of_disjoint]
287287
· conv_rhs => rw [← filter_union_filter_neg_eq (fun s => (erase s a ∈ 𝒜)) 𝒜]
288288
· exact disjoint_filter_filter_neg 𝒜 𝒜 (fun s => (erase s a ∈ 𝒜))
289289
intro s hs

Mathlib/Combinatorics/SetFamily/Compression/UV.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,8 @@ theorem compression_idem (u v : α) (s : Finset α) : 𝓒 u v (𝓒 u v s) =
212212
/-- Compressing a family doesn't change its size. -/
213213
@[simp]
214214
theorem card_compression (u v : α) (s : Finset α) : (𝓒 u v s).card = s.card := by
215-
rw [compression, card_disjoint_union compress_disjoint, filter_image,
216-
card_image_of_injOn compress_injOn, ← card_disjoint_union (disjoint_filter_filter_neg s _ _),
215+
rw [compression, card_union_of_disjoint compress_disjoint, filter_image,
216+
card_image_of_injOn compress_injOn, ← card_union_of_disjoint (disjoint_filter_filter_neg s _ _),
217217
filter_union_filter_neg_eq]
218218
#align uv.card_compression UV.card_compression
219219

@@ -297,7 +297,7 @@ variable [DecidableEq α] {𝒜 : Finset (Finset α)} {u v a : Finset α} {r :
297297
theorem card_compress (huv : u.card = v.card) (a : Finset α) : (compress u v a).card = a.card := by
298298
unfold compress
299299
split_ifs with h
300-
· rw [card_sdiff (h.2.trans le_sup_left), sup_eq_union, card_disjoint_union h.1.symm, huv,
300+
· rw [card_sdiff (h.2.trans le_sup_left), sup_eq_union, card_union_of_disjoint h.1.symm, huv,
301301
add_tsub_cancel_right]
302302
· rfl
303303
#align uv.card_compress UV.card_compress

Mathlib/Combinatorics/SetFamily/LYM.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ theorem le_card_falling_div_choose [Fintype α] (hk : k ≤ Fintype.card α)
190190
exact card_le_card (slice_subset_falling _ _)
191191
rw [succ_eq_add_one] at *
192192
rw [sum_range_succ, ← slice_union_shadow_falling_succ,
193-
card_disjoint_union (IsAntichain.disjoint_slice_shadow_falling h𝒜), cast_add, _root_.add_div,
193+
card_union_of_disjoint (IsAntichain.disjoint_slice_shadow_falling h𝒜), cast_add, _root_.add_div,
194194
add_comm]
195195
rw [← tsub_tsub, tsub_add_cancel_of_le (le_tsub_of_add_le_left hk)]
196196
exact

Mathlib/Combinatorics/SetFamily/Shatter.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ lemma card_le_card_shatterer (𝒜 : Finset (Finset α)) : 𝒜.card ≤ 𝒜.sh
120120
exact fun s _ ↦ aux (fun t ht ↦ (mem_filter.1 ht).2)
121121
rw [← card_memberSubfamily_add_card_nonMemberSubfamily a]
122122
refine (add_le_add ih₁ ih₀).trans ?_
123-
rw [← card_union_add_card_inter, ← hℬ, ← card_disjoint_union]
123+
rw [← card_union_add_card_inter, ← hℬ, ← card_union_of_disjoint]
124124
swap
125125
· simp only [disjoint_left, mem_union, mem_shatterer, mem_image, not_exists, not_and]
126126
rintro _ (hs | hs) s - rfl

Mathlib/Combinatorics/SimpleGraph/Density.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ variable (r)
7878
theorem card_interedges_add_card_interedges_compl (s : Finset α) (t : Finset β) :
7979
(interedges r s t).card + (interedges (fun x y ↦ ¬r x y) s t).card = s.card * t.card := by
8080
classical
81-
rw [← card_product, interedges, interedges, ← card_union_eq, filter_union_filter_neg_eq]
81+
rw [← card_product, interedges, interedges, ← card_union_of_disjoint, filter_union_filter_neg_eq]
8282
exact disjoint_filter.2 fun _ _ ↦ Classical.not_not.2
8383
#align rel.card_interedges_add_card_interedges_compl Rel.card_interedges_add_card_interedges_compl
8484

@@ -378,7 +378,7 @@ theorem card_interedges_add_card_interedges_compl (h : Disjoint s t) :
378378
refine' filter_congr fun x hx ↦ _
379379
rw [mem_product] at hx
380380
rw [compl_adj, and_iff_right (h.forall_ne_finset hx.1 hx.2)]
381-
rw [this, ← card_union_eq, filter_union_filter_neg_eq]
381+
rw [this, ← card_union_of_disjoint, filter_union_filter_neg_eq]
382382
exact disjoint_filter.2 fun _ _ ↦ Classical.not_not.2
383383
#align simple_graph.card_interedges_add_card_interedges_compl SimpleGraph.card_interedges_add_card_interedges_compl
384384

Mathlib/Combinatorics/SimpleGraph/Finite.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ theorem degree_compl [Fintype (Gᶜ.neighborSet v)] [Fintype V] :
243243
Gᶜ.degree v = Fintype.card V - 1 - G.degree v := by
244244
classical
245245
rw [← card_neighborSet_union_compl_neighborSet G v, Set.toFinset_union]
246-
simp [card_disjoint_union (Set.disjoint_toFinset.mpr (compl_neighborSet_disjoint G v))]
246+
simp [card_union_of_disjoint (Set.disjoint_toFinset.mpr (compl_neighborSet_disjoint G v))]
247247
#align simple_graph.degree_compl SimpleGraph.degree_compl
248248

249249
instance incidenceSetFintype [DecidableEq V] : Fintype (G.incidenceSet v) :=

Mathlib/Combinatorics/SimpleGraph/Operations.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ theorem card_edgeFinset_replaceVertex_of_not_adj (hn : ¬G.Adj s t) :
102102
(G.replaceVertex s t).edgeFinset.card = G.edgeFinset.card + G.degree s - G.degree t := by
103103
have inc : G.incidenceFinset t ⊆ G.edgeFinset := by simp [incidenceFinset, incidenceSet_subset]
104104
rw [G.edgeFinset_replaceVertex_of_not_adj hn,
105-
card_disjoint_union G.disjoint_sdiff_neighborFinset_image, card_sdiff inc,
105+
card_union_of_disjoint G.disjoint_sdiff_neighborFinset_image, card_sdiff inc,
106106
tsub_add_eq_add_tsub <| card_le_card inc, card_incidenceFinset_eq_degree]
107107
congr 2
108108
rw [card_image_of_injective, card_neighborFinset_eq_degree]
@@ -113,7 +113,7 @@ theorem card_edgeFinset_replaceVertex_of_adj (ha : G.Adj s t) :
113113
(G.replaceVertex s t).edgeFinset.card = G.edgeFinset.card + G.degree s - G.degree t - 1 := by
114114
have inc : G.incidenceFinset t ⊆ G.edgeFinset := by simp [incidenceFinset, incidenceSet_subset]
115115
rw [G.edgeFinset_replaceVertex_of_adj ha, card_sdiff (by simp [ha]),
116-
card_disjoint_union G.disjoint_sdiff_neighborFinset_image, card_sdiff inc,
116+
card_union_of_disjoint G.disjoint_sdiff_neighborFinset_image, card_sdiff inc,
117117
tsub_add_eq_add_tsub <| card_le_card inc, card_incidenceFinset_eq_degree]
118118
congr 2
119119
rw [card_image_of_injective, card_neighborFinset_eq_degree]

Mathlib/Combinatorics/SimpleGraph/Regularity/Equitabilise.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ theorem card_filter_equitabilise_small (hm : m ≠ 0) :
187187
#align finpartition.card_filter_equitabilise_small Finpartition.card_filter_equitabilise_small
188188

189189
theorem card_parts_equitabilise (hm : m ≠ 0) : (P.equitabilise h).parts.card = a + b := by
190-
rw [← filter_true_of_mem fun x => card_eq_of_mem_parts_equitabilise, filter_or, card_union_eq,
191-
P.card_filter_equitabilise_small _ hm, P.card_filter_equitabilise_big]
190+
rw [← filter_true_of_mem fun x => card_eq_of_mem_parts_equitabilise, filter_or,
191+
card_union_of_disjoint, P.card_filter_equitabilise_small _ hm, P.card_filter_equitabilise_big]
192192
-- Porting note: was `infer_instance`
193193
exact disjoint_filter.2 fun x _ h₀ h₁ => Nat.succ_ne_self m <| h₁.symm.trans h₀
194194
#align finpartition.card_parts_equitabilise Finpartition.card_parts_equitabilise

Mathlib/Data/Finset/Card.lean

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -459,22 +459,36 @@ theorem card_inter_add_card_union (s t : Finset α) :
459459
(s ∩ t).card + (s ∪ t).card = s.card + t.card := by rw [add_comm, card_union_add_card_inter]
460460
#align finset.card_inter_add_card_union Finset.card_inter_add_card_union
461461

462+
lemma card_union (s t : Finset α) : (s ∪ t).card = s.card + t.card - (s ∩ t).card := by
463+
rw [← card_union_add_card_inter, Nat.add_sub_cancel]
464+
465+
lemma card_inter (s t : Finset α) : (s ∩ t).card = s.card + t.card - (s ∪ t).card := by
466+
rw [← card_inter_add_card_union, Nat.add_sub_cancel]
467+
462468
theorem card_union_le (s t : Finset α) : (s ∪ t).card ≤ s.card + t.card :=
463469
card_union_add_card_inter s t ▸ Nat.le_add_right _ _
464470
#align finset.card_union_le Finset.card_union_le
465471

466-
theorem card_union_eq (h : Disjoint s t) : (s ∪ t).card = s.card + t.card := by
472+
@[simp] lemma card_union_of_disjoint (h : Disjoint s t) : (s ∪ t).card = s.card + t.card := by
467473
rw [← disjUnion_eq_union s t h, card_disjUnion _ _ _]
468-
#align finset.card_union_eq Finset.card_union_eq
474+
#align finset.card_union_eq Finset.card_union_of_disjoint
475+
#align finset.card_disjoint_union Finset.card_union_of_disjoint
469476

470-
@[simp]
471-
theorem card_disjoint_union (h : Disjoint s t) : card (s ∪ t) = s.card + t.card :=
472-
card_union_eq h
473-
#align finset.card_disjoint_union Finset.card_disjoint_union
477+
-- 2024-02-09
478+
@[deprecated] alias card_union_eq := card_union_of_disjoint
479+
@[deprecated] alias card_disjoint_union := card_union_of_disjoint
480+
481+
lemma cast_card_inter [AddGroupWithOne R] :
482+
((s ∩ t).card : R) = s.card + t.card - (s ∪ t).card := by
483+
rw [eq_sub_iff_add_eq, ← cast_add, card_inter_add_card_union, cast_add]
484+
485+
lemma cast_card_union [AddGroupWithOne R] :
486+
((s ∪ t).card : R) = s.card + t.card - (s ∩ t).card := by
487+
rw [eq_sub_iff_add_eq, ← cast_add, card_union_add_card_inter, cast_add]
474488

475489
theorem card_sdiff (h : s ⊆ t) : card (t \ s) = t.card - s.card := by
476490
suffices card (t \ s) = card (t \ s ∪ s) - s.card by rwa [sdiff_union_of_subset h] at this
477-
rw [card_disjoint_union sdiff_disjoint, add_tsub_cancel_right]
491+
rw [card_union_of_disjoint sdiff_disjoint, add_tsub_cancel_right]
478492
#align finset.card_sdiff Finset.card_sdiff
479493

480494
lemma cast_card_sdiff [AddGroupWithOne R] (h : s ⊆ t) : ((t \ s).card : R) = t.card - s.card := by
@@ -497,7 +511,7 @@ theorem card_le_card_sdiff_add_card : s.card ≤ (s \ t).card + t.card :=
497511
#align finset.card_le_card_sdiff_add_card Finset.card_le_card_sdiff_add_card
498512

499513
theorem card_sdiff_add_card : (s \ t).card + t.card = (s ∪ t).card := by
500-
rw [← card_disjoint_union sdiff_disjoint, sdiff_union_self_eq_union]
514+
rw [← card_union_of_disjoint sdiff_disjoint, sdiff_union_self_eq_union]
501515
#align finset.card_sdiff_add_card Finset.card_sdiff_add_card
502516

503517
lemma card_sdiff_comm (h : s.card = t.card) : (s \ t).card = (t \ s).card :=
@@ -507,7 +521,7 @@ lemma card_sdiff_comm (h : s.card = t.card) : (s \ t).card = (t \ s).card :=
507521
@[simp]
508522
lemma card_sdiff_add_card_inter (s t : Finset α) :
509523
(s \ t).card + (s ∩ t).card = s.card := by
510-
rw [← card_disjoint_union (disjoint_sdiff_inter _ _), sdiff_union_inter]
524+
rw [← card_union_of_disjoint (disjoint_sdiff_inter _ _), sdiff_union_inter]
511525

512526
@[simp]
513527
lemma card_inter_add_card_sdiff (s t : Finset α) :
@@ -519,7 +533,8 @@ end Lattice
519533
theorem filter_card_add_filter_neg_card_eq_card
520534
(p : α → Prop) [DecidablePred p] [∀ x, Decidable (¬p x)] :
521535
(s.filter p).card + (s.filter (fun a => ¬ p a)).card = s.card := by
522-
classical rw [← card_union_eq (disjoint_filter_filter_neg _ _ _), filter_union_filter_neg_eq]
536+
classical
537+
rw [← card_union_of_disjoint (disjoint_filter_filter_neg _ _ _), filter_union_filter_neg_eq]
523538
#align finset.filter_card_add_filter_neg_card_eq_card Finset.filter_card_add_filter_neg_card_eq_card
524539

525540
/-- Given a set `A` and a set `B` inside it, we can shrink `A` to any appropriate size, and keep `B`

0 commit comments

Comments
 (0)