Skip to content

Commit 00416cf

Browse files
committed
feat(Set): helper lemmas about set cardinality (#29833)
A few lemmas I needed in formalizing Dilworth's theorem and vertex covers.
1 parent 876249b commit 00416cf

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

Mathlib/Data/Set/Card.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ theorem encard_ne_zero : s.encard ≠ 0 ↔ s.Nonempty := by
113113

114114
protected alias ⟨_, Nonempty.encard_pos⟩ := encard_pos
115115

116+
theorem encard_ne_zero_of_mem {a : α} (h : a ∈ s) : s.encard ≠ 0 :=
117+
(encard_pos.mpr ⟨a, h⟩).ne.symm
118+
116119
@[simp] theorem encard_singleton (e : α) : ({e} : Set α).encard = 1 := by
117120
rw [encard, ENat.card_eq_coe_fintype_card, Fintype.card_ofSubsingleton, Nat.cast_one]
118121

@@ -177,12 +180,21 @@ section Lattice
177180
theorem encard_le_encard (h : s ⊆ t) : s.encard ≤ t.encard := by
178181
rw [← union_diff_cancel h, encard_union_eq disjoint_sdiff_right]; exact le_self_add
179182

183+
theorem encard_le_card : s.encard ≤ ENat.card α :=
184+
encard_univ _ ▸ encard_le_encard s.subset_univ
185+
180186
theorem encard_mono {α : Type*} : Monotone (encard : Set α → ℕ∞) :=
181187
fun _ _ ↦ encard_le_encard
182188

183189
theorem encard_diff_add_encard_of_subset (h : s ⊆ t) : (t \ s).encard + s.encard = t.encard := by
184190
rw [← encard_union_eq disjoint_sdiff_left, diff_union_self, union_eq_self_of_subset_right h]
185191

192+
theorem encard_diff (h : s ⊆ t) (hs : s.Finite) :
193+
(t \ s).encard = t.encard - s.encard := by
194+
rw [← @Set.encard_diff_add_encard_of_subset _ s t h]
195+
exact AddLECancellable.eq_tsub_of_add_eq
196+
(ENat.addLECancellable_of_ne_top (encard_ne_top_iff.mpr hs)) rfl
197+
186198
@[simp] theorem one_le_encard_iff_nonempty : 1 ≤ s.encard ↔ s.Nonempty := by
187199
rw [nonempty_iff_ne_empty, Ne, ← encard_eq_zero, ENat.one_le_iff_ne_zero]
188200

@@ -262,6 +274,9 @@ variable {a b : α}
262274
theorem encard_insert_le (s : Set α) (x : α) : (insert x s).encard ≤ s.encard + 1 := by
263275
rw [← union_singleton, ← encard_singleton x]; apply encard_union_le
264276

277+
theorem one_le_encard_insert (s : Set α) : 1 ≤ (insert a s).encard :=
278+
ENat.one_le_iff_ne_zero.mpr <| encard_ne_zero_of_mem (mem_insert a s)
279+
265280
theorem encard_singleton_inter (s : Set α) (x : α) : ({x} ∩ s).encard ≤ 1 := by
266281
rw [← encard_singleton x]; exact encard_le_encard inter_subset_left
267282

@@ -653,6 +668,10 @@ theorem ncard_insert_le (a : α) (s : Set α) : (insert a s).ncard ≤ s.ncard +
653668
rw [(hs.mono (subset_insert a s)).ncard]
654669
exact Nat.zero_le _
655670

671+
theorem one_le_ncard_insert (a : α) (s : Set α) (hs : s.Finite := by toFinite_tac) :
672+
1 ≤ (insert a s).ncard :=
673+
Nat.one_le_iff_ne_zero.mpr <| ncard_ne_zero_of_mem (mem_insert a s) (by simp [hs])
674+
656675
theorem ncard_insert_eq_ite {a : α} [Decidable (a ∈ s)] (hs : s.Finite := by toFinite_tac) :
657676
ncard (insert a s) = if a ∈ s then s.ncard else s.ncard + 1 := by
658677
by_cases h : a ∈ s

0 commit comments

Comments
 (0)