Skip to content

Commit 6c3546e

Browse files
committed
feat: missing basic API lemmas for Nat.card, Fintype.card (#20131)
`card_sigma` existed for `Fintype.card` and I've added it for `Nat.card`. This version uses `Finite` instead of `Fintype` for the dependent type, for generality. `card_univ` existed for `Nat.card` and I've added it for `Fintype.card`. I've added `card_subtype_true` for both `Nat.card` and `Fintype.card`. I've renamed `empty_card` -> `card_empty` With `Fintype.card` rewrite lemmas, one has to be careful about the instance to avoid unifying with a non-defeq instance. This can be solved by taking the instance as a (normal) implicit parameter. However, it is not clear that this is really necessary.
1 parent 6041623 commit 6c3546e

File tree

11 files changed

+41
-18
lines changed

11 files changed

+41
-18
lines changed

Mathlib/Algebra/BigOperators/Expect.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ lemma expect_const [Nonempty ι] (a : M) : 𝔼 _i : ι, a = a := Finset.expect_
409409

410410
lemma expect_ite_zero (p : ι → Prop) [DecidablePred p] (h : ∀ i j, p i → p j → i = j) (a : M) :
411411
𝔼 i, ite (p i) a 0 = ite (∃ i, p i) (a /ℚ Fintype.card ι) 0 := by
412-
simp [univ.expect_ite_zero p (by simpa using h), card_univ]
412+
simp [univ.expect_ite_zero p (by simpa using h)]
413413

414414
variable [DecidableEq ι]
415415

@@ -418,16 +418,16 @@ variable [DecidableEq ι]
418418
simp [Finset.expect_ite_mem, dens]
419419

420420
lemma expect_dite_eq (i : ι) (f : ∀ j, i = j → M) :
421-
𝔼 j, (if h : i = j then f j h else 0) = f i rfl /ℚ card ι := by simp [card_univ]
421+
𝔼 j, (if h : i = j then f j h else 0) = f i rfl /ℚ card ι := by simp
422422

423423
lemma expect_dite_eq' (i : ι) (f : ∀ j, j = i → M) :
424-
𝔼 j, (if h : j = i then f j h else 0) = f i rfl /ℚ card ι := by simp [card_univ]
424+
𝔼 j, (if h : j = i then f j h else 0) = f i rfl /ℚ card ι := by simp
425425

426426
lemma expect_ite_eq (i : ι) (f : ι → M) :
427-
𝔼 j, (if i = j then f j else 0) = f i /ℚ card ι := by simp [card_univ]
427+
𝔼 j, (if i = j then f j else 0) = f i /ℚ card ι := by simp
428428

429429
lemma expect_ite_eq' (i : ι) (f : ι → M) :
430-
𝔼 j, (if j = i then f j else 0) = f i /ℚ card ι := by simp [card_univ]
430+
𝔼 j, (if j = i then f j else 0) = f i /ℚ card ι := by simp
431431

432432
end AddCommMonoid
433433

Mathlib/Algebra/Group/AddChar.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ variable {A R : Type*} [AddGroup A] [Fintype A] [CommSemiring R] [IsDomain R]
323323
lemma sum_eq_ite (ψ : AddChar A R) [Decidable (ψ = 0)] :
324324
∑ a, ψ a = if ψ = 0 then ↑(card A) else 0 := by
325325
split_ifs with h
326-
· simp [h, card_univ]
326+
· simp [h]
327327
obtain ⟨x, hx⟩ := ne_one_iff.1 h
328328
refine eq_zero_of_mul_eq_self_left hx ?_
329329
rw [Finset.mul_sum]

Mathlib/Analysis/FunctionalSpaces/SobolevInequality.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ variable {p : ℝ}
9595
T μ p f univ x =
9696
∫⁻ (x : ∀ i, A i), (f x ^ (1 - (#ι - 1 : ℝ) * p)
9797
* ∏ i : ι, (∫⁻ t : A i, f (update x i t) ∂(μ i)) ^ p) ∂(.pi μ) := by
98-
simp [T, lmarginal_univ, lmarginal_singleton, card_univ]
98+
simp [T, lmarginal_singleton]
9999

100100
@[simp] lemma T_empty (f : (∀ i, A i) → ℝ≥0∞) (x : ∀ i, A i) :
101101
T μ p f ∅ x = f x ^ (1 + p) := by
@@ -320,7 +320,7 @@ theorem lintegral_pow_le_pow_lintegral_fderiv_aux [Fintype ι]
320320
_ = ∫⁻ x, ∏ _i : ι, ‖u x‖ₑ ^ (1 / (#ι - 1 : ℝ)) := by
321321
-- express the left-hand integrand as a product of identical factors
322322
congr! 2 with x
323-
simp_rw [prod_const, card_univ]
323+
simp_rw [prod_const]
324324
norm_cast
325325
_ ≤ ∫⁻ x, ∏ i, (∫⁻ xᵢ, ‖fderiv ℝ u (update x i xᵢ)‖ₑ) ^ ((1 : ℝ) / (#ι - 1 : ℝ)) := ?_
326326
_ ≤ (∫⁻ x, ‖fderiv ℝ u x‖ₑ) ^ p := by

Mathlib/Combinatorics/SetFamily/AhlswedeZhang.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ variable [Nonempty α]
373373
if t ⊆ s then (card α - #s : ℚ) / ((card α - #t) * (card α).choose #t) else 0 := by
374374
rintro t
375375
simp_rw [truncatedSup_singleton, le_iff_subset]
376-
split_ifs <;> simp [card_univ]
376+
split_ifs <;> simp
377377
simp_rw [← sub_eq_of_eq_add (Fintype.sum_div_mul_card_choose_card α), eq_sub_iff_add_eq,
378378
← eq_sub_iff_add_eq', supSum, ← sum_sub_distrib, ← sub_div]
379379
rw [sum_congr rfl fun t _ ↦ this t, sum_ite, sum_const_zero, add_zero, filter_subset_univ,

Mathlib/Data/Fintype/Card.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,20 @@ theorem Fintype.card_lex (α : Type*) [Fintype α] : Fintype.card (Lex α) = Fin
347347
@[simp] lemma Fintype.card_additive (α : Type*) [Fintype α] : card (Additive α) = card α :=
348348
Finset.card_map _
349349

350+
-- Note: The extra hypothesis `h` is there so that the rewrite lemma applies,
351+
-- no matter what instance of `Fintype (Set.univ : Set α)` is used.
352+
@[simp]
353+
theorem Fintype.card_setUniv [Fintype α] {h : Fintype (Set.univ : Set α)} :
354+
@Fintype.card (Set.univ : Set α) h = Fintype.card α := by
355+
apply Fintype.card_of_finset'
356+
simp
357+
358+
@[simp]
359+
theorem Fintype.card_subtype_true [Fintype α] {h : Fintype {_a : α // True}} :
360+
@Fintype.card {_a // True} h = Fintype.card α := by
361+
apply Fintype.card_of_subtype
362+
simp
363+
350364
/-- Given that `α ⊕ β` is a fintype, `α` is also a fintype. This is non-computable as it uses
351365
that `Sum.inl` is an injection, but there's no clear inverse if `α` is empty. -/
352366
noncomputable def Fintype.sumLeft {α β} [Fintype (α ⊕ β)] : Fintype α :=

Mathlib/Data/Set/Finite/Basic.lean

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -728,19 +728,18 @@ end
728728

729729
/-! ### Cardinality -/
730730

731-
theorem empty_card : Fintype.card (∅ : Set α) = 0 :=
731+
theorem card_empty : Fintype.card (∅ : Set α) = 0 :=
732732
rfl
733733

734-
theorem empty_card' {h : Fintype.{u} (∅ : Set α)} : @Fintype.card (∅ : Set α) h = 0 := by
735-
simp
734+
@[deprecated (since := "2025-02-05")] alias empty_card := card_empty
736735

737736
theorem card_fintypeInsertOfNotMem {a : α} (s : Set α) [Fintype s] (h : a ∉ s) :
738737
@Fintype.card _ (fintypeInsertOfNotMem s h) = Fintype.card s + 1 := by
739738
simp [fintypeInsertOfNotMem, Fintype.card_ofFinset]
740739

741740
@[simp]
742741
theorem card_insert {a : α} (s : Set α) [Fintype s] (h : a ∉ s)
743-
{d : Fintype.{u} (insert a s : Set α)} : @Fintype.card _ d = Fintype.card s + 1 := by
742+
{d : Fintype (insert a s : Set α)} : @Fintype.card _ d = Fintype.card s + 1 := by
744743
rw [← card_fintypeInsertOfNotMem s h]; congr!
745744

746745
theorem card_image_of_inj_on {s : Set α} [Fintype s] {f : α → β} [Fintype (f '' s)]

Mathlib/LinearAlgebra/Matrix/Determinant/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ theorem det_smul (A : Matrix n n R) (c : R) : det (c • A) = c ^ Fintype.card n
252252
calc
253253
det (c • A) = det ((diagonal fun _ => c) * A) := by rw [smul_eq_diagonal_mul]
254254
_ = det (diagonal fun _ => c) * det A := det_mul _ _
255-
_ = c ^ Fintype.card n * det A := by simp [card_univ]
255+
_ = c ^ Fintype.card n * det A := by simp
256256

257257
@[simp]
258258
theorem det_smul_of_tower {α} [Monoid α] [DistribMulAction α R] [IsScalarTower α R R]

Mathlib/ModelTheory/Basic.lean

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,11 @@ instance isAlgebraic_sum [L.IsAlgebraic] [L'.IsAlgebraic] : IsAlgebraic (L.sum L
107107
fun _ => instIsEmptySum
108108

109109
@[simp]
110-
theorem empty_card : Language.empty.card = 0 := by simp only [card, mk_sum, mk_sigma, mk_eq_zero,
110+
theorem card_empty : Language.empty.card = 0 := by simp only [card, mk_sum, mk_sigma, mk_eq_zero,
111111
sum_const, mk_eq_aleph0, lift_id', mul_zero, add_zero]
112112

113+
@[deprecated (since := "2025-02-05")] alias empty_card := card_empty
114+
113115
instance isEmpty_empty : IsEmpty Language.empty.Symbols := by
114116
simp only [Language.Symbols, isEmpty_sum, isEmpty_sigma]
115117
exact ⟨fun _ => inferInstance, fun _ => inferInstance⟩

Mathlib/NumberTheory/NumberField/Units/DirichletTheorem.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ theorem log_le_of_logEmbedding_le {r : ℝ} {x : (𝓞 K)ˣ} (hr : 0 ≤ r)
151151
(fun w _ => logEmbedding_component_le hr h w)).trans ?_
152152
rw [nsmul_eq_mul]
153153
refine mul_le_mul ?_ le_rfl hr (Fintype.card (InfinitePlace K)).cast_nonneg
154-
simp [card_univ]
154+
simp
155155
· have hyp := logEmbedding_component_le hr h ⟨w, hw⟩
156156
rw [logEmbedding_component, abs_mul, Nat.abs_cast] at hyp
157157
refine (le_trans ?_ hyp).trans ?_

Mathlib/SetTheory/Cardinal/Finite.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ theorem card_eq_two_iff : Nat.card α = 2 ↔ ∃ x y : α, x ≠ y ∧ {x, y} =
199199
theorem card_eq_two_iff' (x : α) : Nat.card α = 2 ↔ ∃! y, y ≠ x :=
200200
toNat_eq_ofNat.trans (mk_eq_two_iff' x)
201201

202+
@[simp]
203+
theorem card_subtype_true : Nat.card {_a : α // True} = Nat.card α :=
204+
card_congr <| Equiv.subtypeUnivEquiv fun _ => trivial
205+
202206
@[simp]
203207
theorem card_sum [Finite α] [Finite β] : Nat.card (α ⊕ β) = Nat.card α + Nat.card β := by
204208
have := Fintype.ofFinite α
@@ -217,6 +221,11 @@ theorem card_ulift (α : Type*) : Nat.card (ULift α) = Nat.card α :=
217221
theorem card_plift (α : Type*) : Nat.card (PLift α) = Nat.card α :=
218222
card_congr Equiv.plift
219223

224+
theorem card_sigma {β : α → Type*} [Fintype α] [∀ a, Finite (β a)] :
225+
Nat.card (Sigma β) = ∑ a, Nat.card (β a) := by
226+
letI _ (a : α) : Fintype (β a) := Fintype.ofFinite (β a)
227+
simp_rw [Nat.card_eq_fintype_card, Fintype.card_sigma]
228+
220229
theorem card_pi {β : α → Type*} [Fintype α] : Nat.card (∀ a, β a) = ∏ a, Nat.card (β a) := by
221230
simp_rw [Nat.card, mk_pi, prod_eq_of_fintype, toNat_lift, map_prod]
222231

0 commit comments

Comments
 (0)