Skip to content

Commit 9535344

Browse files
committed
feat(SetTheory/Cardinal/NatCard): length of a nodup list whose elements come from a set (#41476)
For a list `l` with `l.Nodup` and a set `s` with `∀ a ∈ l, a ∈ s` we have `l.length ≤ s.encard`, and similar statements for `Finset`/`Multiset` with `Set.encard`/`Set.ncard`/`ENat.card`/`Nat.card`.
1 parent 618f225 commit 9535344

2 files changed

Lines changed: 82 additions & 12 deletions

File tree

Mathlib/Data/Finset/Dedup.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ theorem Nodup.toFinset_inj {l l' : Multiset α} (hl : Nodup l) (hl' : Nodup l')
6565
theorem mem_toFinset {a : α} {s : Multiset α} : a ∈ s.toFinset ↔ a ∈ s :=
6666
mem_dedup
6767

68+
theorem coe_toFinset {s : Multiset α} : s.toFinset = {a | a ∈ s} := by
69+
ext
70+
simp
71+
6872
@[simp]
6973
theorem toFinset_subset : s.toFinset ⊆ t.toFinset ↔ s ⊆ t := by
7074
simp only [Finset.subset_iff, Multiset.subset_iff, Multiset.mem_toFinset]

Mathlib/SetTheory/Cardinal/NatCard.lean

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Kyle Miller
55
-/
66
module
77

8-
public import Mathlib.SetTheory.Cardinal.Finite
8+
public import Mathlib.Data.Set.Card
99

1010
/-!
1111
@@ -242,19 +242,85 @@ theorem eq_top_of_card_le_of_finite [Finite α] {s : Set α} (h : Nat.card α
242242

243243
end Set
244244

245-
namespace List.Nodup
245+
namespace Finset
246246

247-
variable {l : List α} (h : l.Nodup)
248-
include h
247+
variable {s : Finset α} {s' : Set α}
249248

250-
theorem length_le_natCard [Finite α] : l.length ≤ Nat.card α := by
251-
have := Fintype.ofFinite α
252-
grw [h.length_le_card, Fintype.card_eq_nat_card]
249+
theorem card_le_encard (h : ∀ a ∈ s, a ∈ s') : s.card ≤ s'.encard := by
250+
grw [← Set.encard_coe_eq_coe_finsetCard, Set.encard_le_encard (h · <| by simpa using ·)]
251+
252+
theorem card_le_ncard (hs : s'.Finite) (h : ∀ a ∈ s, a ∈ s') : s.card ≤ s'.ncard := by
253+
grw [← ENat.natCast_le_natCast, hs.cast_ncard_eq, s.card_le_encard h]
254+
255+
variable (s) in
256+
theorem card_le_enatCard : s.card ≤ ENat.card α := by
257+
simp [← Set.encard_univ, card_le_encard]
258+
259+
variable (s) in
260+
theorem card_le_natCard [Finite α] : s.card ≤ Nat.card α := by
261+
simp [← Set.ncard_univ, card_le_ncard]
262+
263+
end Finset
264+
265+
namespace Multiset
266+
267+
variable {m : Multiset α} {s : Set α}
268+
269+
theorem ncard_ofPred_mem [DecidableEq α] : {a | a ∈ m}.ncard = m.dedup.card := by
270+
rw [← coe_toFinset, Set.ncard_coe_finset, card_toFinset]
271+
272+
theorem encard_ofPred_mem [DecidableEq α] : {a | a ∈ m}.encard = m.dedup.card := by
273+
rw [← m.finite_toSet.cast_ncard_eq, ncard_ofPred_mem]
274+
275+
namespace Nodup
276+
277+
variable (hm : m.Nodup)
278+
include hm
279+
280+
theorem card_le_encard (h : ∀ a ∈ m, a ∈ s) : m.card ≤ s.encard := by
281+
classical
282+
grw [← toFinset_card_of_nodup hm, Finset.card_le_encard (h · <| by simpa using ·)]
283+
284+
theorem card_le_ncard (hs : s.Finite) (h : ∀ a ∈ m, a ∈ s) : m.card ≤ s.ncard := by
285+
grw [← ENat.natCast_le_natCast, hs.cast_ncard_eq, hm.card_le_encard h]
286+
287+
theorem card_le_enatCard : m.card ≤ ENat.card α := by
288+
simp [← Set.encard_univ, hm.card_le_encard]
289+
290+
theorem card_le_natCard [Finite α] : m.card ≤ Nat.card α := by
291+
simp [← Set.ncard_univ, hm.card_le_ncard]
292+
293+
end Nodup
294+
295+
end Multiset
296+
297+
namespace List
298+
299+
variable {l : List α} {s : Set α}
300+
301+
theorem ncard_ofPred_mem [DecidableEq α] : {a | a ∈ l}.ncard = l.dedup.length := by
302+
rw [← coe_toFinset, Set.ncard_coe_finset, card_toFinset]
303+
304+
theorem encard_ofPred_mem [DecidableEq α] : {a | a ∈ l}.encard = l.dedup.length := by
305+
rw [← l.finite_toSet.cast_ncard_eq, ncard_ofPred_mem]
306+
307+
namespace Nodup
308+
309+
variable (hl : l.Nodup)
310+
include hl
311+
312+
theorem length_le_encard (h : ∀ a ∈ l, a ∈ s) : l.length ≤ s.encard := by
313+
grw [← Multiset.coe_card, Multiset.coe_nodup.mpr hl |>.card_le_encard h]
314+
315+
theorem length_le_ncard (hs : s.Finite) (h : ∀ a ∈ l, a ∈ s) : l.length ≤ s.ncard := by
316+
grw [← ENat.natCast_le_natCast, hs.cast_ncard_eq, hl.length_le_encard h]
253317

254318
theorem length_le_enatCard : l.length ≤ ENat.card α := by
255-
cases finite_or_infinite α
256-
· grw [h.length_le_natCard, ENat.card_eq_coe_natCard]
257-
· grw [ENat.card_eq_top_of_infinite]
258-
exact le_top
319+
simp [← Set.encard_univ, hl.length_le_encard]
320+
321+
theorem length_le_natCard [Finite α] : l.length ≤ Nat.card α := by
322+
simp [← Set.ncard_univ, hl.length_le_ncard]
323+
324+
end Nodup
259325

260-
end List.Nodup
326+
end List

0 commit comments

Comments
 (0)