@@ -5,7 +5,7 @@ Authors: Kyle Miller
55-/
66module
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
243243end 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
254318theorem 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