analysis.normed_space.lp_space
⟷
Mathlib.Analysis.NormedSpace.lpSpace
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1055,16 +1055,16 @@ theorem Memℓp.infty_pow {f : ∀ i, B i} (hf : Memℓp f ∞) (n : ℕ) : Mem
#align mem_ℓp.infty_pow Memℓp.infty_pow
-/
-#print nat_cast_memℓp_infty /-
-theorem nat_cast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
+#print natCast_memℓp_infty /-
+theorem natCast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
natCast_mem (lpInftySubring B) n
-#align nat_cast_mem_ℓp_infty nat_cast_memℓp_infty
+#align nat_cast_mem_ℓp_infty natCast_memℓp_infty
-/
-#print int_cast_memℓp_infty /-
-theorem int_cast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
+#print intCast_memℓp_infty /-
+theorem intCast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
intCast_mem (lpInftySubring B) z
-#align int_cast_mem_ℓp_infty int_cast_memℓp_infty
+#align int_cast_mem_ℓp_infty intCast_memℓp_infty
-/
#print lp.infty_coeFn_one /-
@@ -1081,18 +1081,18 @@ theorem infty_coeFn_pow (f : lp B ∞) (n : ℕ) : ⇑(f ^ n) = f ^ n :=
#align lp.infty_coe_fn_pow lp.infty_coeFn_pow
-/
-#print lp.infty_coeFn_nat_cast /-
+#print lp.infty_coeFn_natCast /-
@[simp]
-theorem infty_coeFn_nat_cast (n : ℕ) : ⇑(n : lp B ∞) = n :=
+theorem infty_coeFn_natCast (n : ℕ) : ⇑(n : lp B ∞) = n :=
rfl
-#align lp.infty_coe_fn_nat_cast lp.infty_coeFn_nat_cast
+#align lp.infty_coe_fn_nat_cast lp.infty_coeFn_natCast
-/
-#print lp.infty_coeFn_int_cast /-
+#print lp.infty_coeFn_intCast /-
@[simp]
-theorem infty_coeFn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z :=
+theorem infty_coeFn_intCast (z : ℤ) : ⇑(z : lp B ∞) = z :=
rfl
-#align lp.infty_coe_fn_int_cast lp.infty_coeFn_int_cast
+#align lp.infty_coe_fn_int_cast lp.infty_coeFn_intCast
-/
instance [Nonempty I] : NormOneClass (lp B ∞)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -1063,7 +1063,7 @@ theorem nat_cast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
#print int_cast_memℓp_infty /-
theorem int_cast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
- coe_int_mem (lpInftySubring B) z
+ intCast_mem (lpInftySubring B) z
#align int_cast_mem_ℓp_infty int_cast_memℓp_infty
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -207,7 +207,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
#align mem_ℓp.neg_iff Memℓp.neg_iff
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
#print Memℓp.of_exponent_ge /-
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
@@ -1242,7 +1242,7 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
#align lp.single_smul lp.single_smul
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sum_single /-
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
@@ -1270,7 +1270,7 @@ protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
#align lp.norm_single lp.norm_single
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sub_norm_compl_sub_single /-
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -111,7 +111,7 @@ theorem memℓp_infty {f : ∀ i, E i} (hf : BddAbove (Set.range fun i => ‖f i
theorem memℓp_gen_iff (hp : 0 < p.toReal) {f : ∀ i, E i} :
Memℓp f p ↔ Summable fun i => ‖f i‖ ^ p.toReal :=
by
- rw [ENNReal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
dsimp [Memℓp]
rw [if_neg hp.1.ne', if_neg hp.2.Ne]
#align mem_ℓp_gen_iff memℓp_gen_iff
@@ -246,7 +246,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
· show ∀ i, ¬|‖f i‖ ^ p.to_real| ≤ ‖f i‖ ^ q.to_real → 1 ≤ ‖f i‖
intro i hi
have : 0 ≤ ‖f i‖ ^ p.to_real := Real.rpow_nonneg (norm_nonneg _) p.to_real
- simp only [abs_of_nonneg, this] at hi
+ simp only [abs_of_nonneg, this] at hi
contrapose! hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
#align mem_ℓp.of_exponent_ge Memℓp.of_exponent_ge
@@ -279,7 +279,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
· simpa using NNReal.coe_le_coe.2 (NNReal.rpow_add_le_add_rpow ‖f i‖₊ ‖g i‖₊ hp.le h.le)
· let F : Fin 2 → ℝ≥0 := ![‖f i‖₊, ‖g i‖₊]
have : ∀ i, (0 : ℝ) ≤ F i := fun i => (F i).coe_nonneg
- simp only [not_lt] at h
+ simp only [not_lt] at h
simpa [F, Fin.sum_univ_succ] using
Real.rpow_sum_le_const_mul_sum_rpow_of_nonneg (Finset.univ : Finset (Fin 2)) h fun i _ =>
(F i).coe_nonneg
@@ -496,7 +496,7 @@ theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ = (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal) :=
by
dsimp [norm]
- rw [ENNReal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
rw [dif_neg hp.1.ne', if_neg hp.2.Ne]
#align lp.norm_eq_tsum_rpow lp.norm_eq_tsum_rpow
-/
@@ -571,9 +571,9 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
· have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
by
have := lp.hasSum_norm hp f
- rwa [h, Real.zero_rpow hp.ne'] at this
+ rwa [h, Real.zero_rpow hp.ne'] at this
have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
- rw [hasSum_zero_iff_of_nonneg this] at hf
+ rw [hasSum_zero_iff_of_nonneg this] at hf
ext i
have : f i = 0 ∧ p.to_real ≠ 0 := by
simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
@@ -648,7 +648,7 @@ protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConj
have hg₂ := lp.hasSum_norm hpq.symm.pos g
obtain ⟨C, -, hC', hC⟩ :=
Real.inner_le_Lp_mul_Lq_hasSum_of_nonneg hpq (norm_nonneg' _) (norm_nonneg' _) hf₁ hg₁ hf₂ hg₂
- rw [← hC.tsum_eq] at hC'
+ rw [← hC.tsum_eq] at hC'
exact ⟨hC.summable, hC'⟩
#align lp.tsum_mul_le_mul_norm lp.tsum_mul_le_mul_norm
-/
@@ -803,7 +803,7 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
· simp [lp.eq_zero' f]
have hcf := lp.isLUB_norm (c • f)
have hfc := (lp.isLUB_norm f).mul_left (norm_nonneg c)
- simp_rw [← Set.range_comp, Function.comp] at hfc
+ simp_rw [← Set.range_comp, Function.comp] at hfc
-- TODO: some `is_lub` API should make it a one-liner from here.
refine' hcf.right _
have := hfc.left
@@ -813,13 +813,13 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
· letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
have coe_nnnorm : ∀ f : lp E p, ↑‖f‖₊ = ‖f‖ := fun _ => rfl
suffices ‖c • f‖₊ ^ p.to_real ≤ (‖c‖₊ * ‖f‖₊) ^ p.to_real by
- rwa [NNReal.rpow_le_rpow_iff hp] at this
+ rwa [NNReal.rpow_le_rpow_iff hp] at this
clear_value inst
rw [NNReal.mul_rpow]
have hLHS := lp.hasSum_norm hp (c • f)
have hRHS := (lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
simp_rw [← coe_nnnorm, ← _root_.coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul,
- NNReal.hasSum_coe] at hRHS hLHS
+ NNReal.hasSum_coe] at hRHS hLHS
refine' hasSum_mono hLHS hRHS fun i => _
dsimp only
rw [← NNReal.mul_rpow]
@@ -845,7 +845,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
· simp
refine' le_antisymm (norm_const_smul_le hp c f) _
have := mul_le_mul_of_nonneg_left (norm_const_smul_le hp c⁻¹ (c • f)) (norm_nonneg c)
- rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
+ rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
#align lp.norm_const_smul lp.norm_const_smul
-/
@@ -908,7 +908,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p)
rcases p.trichotomy with (rfl | rfl | h)
· exfalso
have := ENNReal.toReal_mono ENNReal.zero_ne_top hp.elim
- norm_num at this
+ norm_num at this
· simp only [lp.norm_eq_ciSup, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
@@ -1290,7 +1290,7 @@ protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p
Pi.sub_apply, Finset.sum_apply, Finset.sum_dite_eq, sub_eq_self]
simp [Real.zero_rpow hp.ne']
have : HasSum F (∑ i in s, F i) := hasSum_sum_of_ne_finset_zero hF
- rwa [Finset.sum_congr rfl hF'] at this
+ rwa [Finset.sum_congr rfl hF'] at this
#align lp.norm_sub_norm_compl_sub_single lp.norm_sub_norm_compl_sub_single
-/
@@ -1315,7 +1315,7 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
refine' (this _ (Real.rpow_pos_of_pos hε p.to_real)).mono _
intro s hs
rw [← Real.rpow_lt_rpow_iff dist_nonneg (le_of_lt hε) hp']
- rw [dist_comm] at hs
+ rw [dist_comm] at hs
simp only [dist_eq_norm, Real.norm_eq_abs] at hs ⊢
have H :
‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real =
@@ -1323,7 +1323,7 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
by
simpa only [coe_fn_neg, Pi.neg_apply, lp.single_neg, Finset.sum_neg_distrib, neg_sub_neg,
norm_neg, _root_.norm_neg] using lp.norm_compl_sum_single hp' (-f) s
- rw [← H] at hs
+ rw [← H] at hs
have :
|‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real| =
‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -638,7 +638,7 @@ instance [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p) :=
-- TODO: define an `ennreal` version of `is_conjugate_exponent`, and then express this inequality
-- in a better version which also covers the case `p = 1, q = ∞`.
/-- Hölder inequality -/
-protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
+protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal)
(f : lp E p) (g : lp E q) :
(Summable fun i => ‖f i‖ * ‖g i‖) ∧ ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
by
@@ -654,14 +654,14 @@ protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConj
-/
#print lp.summable_mul /-
-protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
- (f : lp E p) (g : lp E q) : Summable fun i => ‖f i‖ * ‖g i‖ :=
+protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal) (f : lp E p)
+ (g : lp E q) : Summable fun i => ‖f i‖ * ‖g i‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).1
#align lp.summable_mul lp.summable_mul
-/
#print lp.tsum_mul_le_mul_norm' /-
-protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
+protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal)
(f : lp E p) (g : lp E q) : ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).2
#align lp.tsum_mul_le_mul_norm' lp.tsum_mul_le_mul_norm'
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -531,7 +531,7 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
· simp [lp.norm_eq_card_dsupport f]
· cases' isEmpty_or_nonempty α with _i _i <;> skip
· rw [lp.norm_eq_ciSup]
- simp [Real.ciSup_empty]
+ simp [Real.iSup_of_isEmpty]
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
· rw [lp.norm_eq_tsum_rpow hp f]
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -448,7 +448,12 @@ theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
#print lp.coeFn_sum /-
@[simp]
theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
- ⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by classical
+ ⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
+ classical
+ refine' Finset.induction _ _ s
+ · simp
+ intro i s his
+ simp [Finset.sum_insert his]
#align lp.coe_fn_sum lp.coeFn_sum
-/
@@ -549,7 +554,30 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
-/
#print lp.norm_eq_zero_iff /-
-theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by classical
+theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
+ classical
+ refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
+ rcases p.trichotomy with (rfl | rfl | hp)
+ · ext i
+ have : {i : α | ¬f i = 0} = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
+ have : (¬f i = 0) = False := congr_fun this i
+ tauto
+ · cases' isEmpty_or_nonempty α with _i _i <;> skip
+ · simp
+ have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
+ ext i
+ have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
+ simpa using this
+ · have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
+ by
+ have := lp.hasSum_norm hp f
+ rwa [h, Real.zero_rpow hp.ne'] at this
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
+ rw [hasSum_zero_iff_of_nonneg this] at hf
+ ext i
+ have : f i = 0 ∧ p.to_real ≠ 0 := by
+ simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
+ exact this.1
#align lp.norm_eq_zero_iff lp.norm_eq_zero_iff
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -448,12 +448,7 @@ theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
#print lp.coeFn_sum /-
@[simp]
theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
- ⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
- classical
- refine' Finset.induction _ _ s
- · simp
- intro i s his
- simp [Finset.sum_insert his]
+ ⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by classical
#align lp.coe_fn_sum lp.coeFn_sum
-/
@@ -554,30 +549,7 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
-/
#print lp.norm_eq_zero_iff /-
-theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
- classical
- refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
- rcases p.trichotomy with (rfl | rfl | hp)
- · ext i
- have : {i : α | ¬f i = 0} = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
- have : (¬f i = 0) = False := congr_fun this i
- tauto
- · cases' isEmpty_or_nonempty α with _i _i <;> skip
- · simp
- have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
- ext i
- have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
- simpa using this
- · have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
- by
- have := lp.hasSum_norm hp f
- rwa [h, Real.zero_rpow hp.ne'] at this
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
- rw [hasSum_zero_iff_of_nonneg this] at hf
- ext i
- have : f i = 0 ∧ p.to_real ≠ 0 := by
- simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
- exact this.1
+theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by classical
#align lp.norm_eq_zero_iff lp.norm_eq_zero_iff
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -138,7 +138,7 @@ theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i i
use⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.to_real
apply hasSum_of_isLUB_of_nonneg
· intro b
- exact Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ exact Real.rpow_nonneg (norm_nonneg _) _
apply isLUB_ciSup
use C
rintro - ⟨s, rfl⟩
@@ -233,7 +233,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
obtain ⟨A, hA⟩ := (hfq.summable hq).tendsto_cofinite_zero.bddAbove_range_of_cofinite
use A ^ q.to_real⁻¹
rintro x ⟨i, rfl⟩
- have : 0 ≤ ‖f i‖ ^ q.to_real := Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : 0 ≤ ‖f i‖ ^ q.to_real := Real.rpow_nonneg (norm_nonneg _) _
simpa [← Real.rpow_mul, mul_inv_cancel hq.ne'] using
Real.rpow_le_rpow this (hA ⟨i, rfl⟩) (inv_nonneg.mpr hq.le)
· apply memℓp_gen
@@ -245,7 +245,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
exact H.subset fun i hi => Real.one_le_rpow hi hq.le
· show ∀ i, ¬|‖f i‖ ^ p.to_real| ≤ ‖f i‖ ^ q.to_real → 1 ≤ ‖f i‖
intro i hi
- have : 0 ≤ ‖f i‖ ^ p.to_real := Real.rpow_nonneg_of_nonneg (norm_nonneg _) p.to_real
+ have : 0 ≤ ‖f i‖ ^ p.to_real := Real.rpow_nonneg (norm_nonneg _) p.to_real
simp only [abs_of_nonneg, this] at hi
contrapose! hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
@@ -272,7 +272,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
let C : ℝ := if p.to_real < 1 then 1 else 2 ^ (p.to_real - 1)
refine'
Summable.of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
- · exact fun b => Real.rpow_nonneg_of_nonneg (norm_nonneg (f b + g b)) p.to_real
+ · exact fun b => Real.rpow_nonneg (norm_nonneg (f b + g b)) p.to_real
· refine' (Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp.le).trans _
dsimp [C]
split_ifs with h h
@@ -535,8 +535,8 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
· rw [lp.norm_eq_tsum_rpow hp f]
- refine' Real.rpow_nonneg_of_nonneg (tsum_nonneg _) _
- exact fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ refine' Real.rpow_nonneg (tsum_nonneg _) _
+ exact fun i => Real.rpow_nonneg (norm_nonneg _) _
#align lp.norm_nonneg' lp.norm_nonneg'
-/
@@ -572,7 +572,7 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
by
have := lp.hasSum_norm hp f
rwa [h, Real.zero_rpow hp.ne'] at this
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
rw [hasSum_zero_iff_of_nonneg this] at hf
ext i
have : f i = 0 ∧ p.to_real ≠ 0 := by
@@ -676,7 +676,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
· haveI : Nonempty α := ⟨i⟩
exact (is_lub_norm f).1 ⟨i, rfl⟩
have hp'' : 0 < p.to_real := ENNReal.toReal_pos hp hp'
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
rw [← Real.rpow_le_rpow_iff (norm_nonneg _) (norm_nonneg' _) hp'']
convert le_hasSum (has_sum_norm hp'' f) i fun i hi => this i
#align lp.norm_apply_le_norm lp.norm_apply_le_norm
@@ -687,7 +687,7 @@ theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
∑ i in s, ‖f i‖ ^ p.toReal ≤ ‖f‖ ^ p.toReal :=
by
rw [lp.norm_rpow_eq_tsum hp f]
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg (norm_nonneg _) _
refine' sum_le_tsum _ (fun i hi => this i) _
exact (lp.memℓp f).Summable hp
#align lp.sum_rpow_le_norm_rpow lp.sum_rpow_le_norm_rpow
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -238,7 +238,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
Real.rpow_le_rpow this (hA ⟨i, rfl⟩) (inv_nonneg.mpr hq.le)
· apply memℓp_gen
have hf' := hfq.summable hq
- refine' summable_of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ {i | 1 ≤ ‖f i‖} _ _ _)
+ refine' Summable.of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ {i | 1 ≤ ‖f i‖} _ _ _)
· have H : {x : α | 1 ≤ ‖f x‖ ^ q.to_real}.Finite := by
simpa using
eventually_lt_of_tendsto_lt (by norm_num : (0 : ℝ) < 1) hf'.tendsto_cofinite_zero
@@ -271,7 +271,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
apply memℓp_gen
let C : ℝ := if p.to_real < 1 then 1 else 2 ^ (p.to_real - 1)
refine'
- summable_of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
+ Summable.of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
· exact fun b => Real.rpow_nonneg_of_nonneg (norm_nonneg (f b + g b)) p.to_real
· refine' (Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp.le).trans _
dsimp [C]
mathlib commit https://github.com/leanprover-community/mathlib/commit/b1abe23ae96fef89ad30d9f4362c307f72a55010
@@ -1192,7 +1192,7 @@ protected def single (p) (i : α) (a : E i) : lp E p :=
refine' (Set.finite_singleton i).Subset _
intro j
simp only [forall_exists_index, Set.mem_singleton_iff, Ne.def, dite_eq_right_iff,
- Set.mem_setOf_eq, not_forall]
+ Set.mem_setOf_eq, Classical.not_forall]
rintro rfl
simp⟩
#align lp.single lp.single
mathlib commit https://github.com/leanprover-community/mathlib/commit/b1abe23ae96fef89ad30d9f4362c307f72a55010
@@ -807,8 +807,7 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
-- TODO: some `is_lub` API should make it a one-liner from here.
refine' hcf.right _
have := hfc.left
- simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff'] at this
- ⊢
+ simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff] at this ⊢
intro a
exact (norm_smul_le _ _).trans (this a)
· letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,10 +3,10 @@ Copyright (c) 2021 Heather Macbeth. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
-/
-import Mathbin.Analysis.MeanInequalities
-import Mathbin.Analysis.MeanInequalitiesPow
-import Mathbin.Analysis.SpecialFunctions.Pow.Continuity
-import Mathbin.Topology.Algebra.Order.LiminfLimsup
+import Analysis.MeanInequalities
+import Analysis.MeanInequalitiesPow
+import Analysis.SpecialFunctions.Pow.Continuity
+import Topology.Algebra.Order.LiminfLimsup
#align_import analysis.normed_space.lp_space from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
@@ -207,7 +207,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
#align mem_ℓp.neg_iff Memℓp.neg_iff
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
#print Memℓp.of_exponent_ge /-
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
@@ -1243,7 +1243,7 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
#align lp.single_smul lp.single_smul
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sum_single /-
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
@@ -1271,7 +1271,7 @@ protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
#align lp.norm_single lp.norm_single
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sub_norm_compl_sub_single /-
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -1415,7 +1415,7 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
#print lp.memℓp_of_tendsto /-
/-- If `f` is the pointwise limit of a bounded sequence in `lp E p`, then `f` is in `lp E p`. -/
-theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Metric.Bounded (Set.range F)) {f : ∀ a, E a}
+theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Bornology.IsBounded (Set.range F)) {f : ∀ a, E a}
(hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) : Memℓp f p :=
by
obtain ⟨C, hC, hCF'⟩ := hF.exists_pos_norm_le
mathlib commit https://github.com/leanprover-community/mathlib/commit/442a83d738cb208d3600056c489be16900ba701d
@@ -971,11 +971,11 @@ instance infty_isScalarTower {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)]
#align lp.infty_is_scalar_tower lp.infty_isScalarTower
-/
-#print lp.infty_sMulCommClass /-
-instance infty_sMulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
+#print lp.infty_smulCommClass /-
+instance infty_smulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, SMulCommClass 𝕜 (B i) (B i)] : SMulCommClass 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_comm r (⇑f) ⇑g⟩
-#align lp.infty_smul_comm_class lp.infty_sMulCommClass
+#align lp.infty_smul_comm_class lp.infty_smulCommClass
-/
section StarRing
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -955,7 +955,7 @@ instance : NonUnitalRing (lp B ∞) :=
instance : NonUnitalNormedRing (lp B ∞) :=
{ lp.normedAddCommGroup with
- norm_mul := fun f g =>
+ norm_hMul := fun f g =>
lp.norm_le_of_forall_le (mul_nonneg (norm_nonneg f) (norm_nonneg g)) fun i =>
calc
‖(f * g) i‖ ≤ ‖f i‖ * ‖g i‖ := norm_mul_le _ _
@@ -987,22 +987,22 @@ instance inftyStarRing : StarRing (lp B ∞) :=
{
show StarAddMonoid (lp B ∞) by letI : ∀ i, StarAddMonoid (B i) := fun i => inferInstance;
infer_instance with
- star_mul := fun f g => ext <| star_mul (_ : ∀ i, B i) _ }
+ star_hMul := fun f g => ext <| star_hMul (_ : ∀ i, B i) _ }
#align lp.infty_star_ring lp.inftyStarRing
-/
#print lp.inftyCstarRing /-
instance inftyCstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
- where norm_star_mul_self f := by
+ where norm_star_hMul_self f := by
apply le_antisymm
· rw [← sq]
refine' lp.norm_le_of_forall_le (sq_nonneg ‖f‖) fun i => _
- simp only [lp.star_apply, CstarRing.norm_star_mul_self, ← sq, infty_coe_fn_mul, Pi.mul_apply]
+ simp only [lp.star_apply, CstarRing.norm_star_hMul_self, ← sq, infty_coe_fn_mul, Pi.mul_apply]
refine' sq_le_sq' _ (lp.norm_apply_le_norm ENNReal.top_ne_zero _ _)
linarith [norm_nonneg (f i), norm_nonneg f]
· rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _)]
refine' lp.norm_le_of_forall_le ‖star f * f‖.sqrt_nonneg fun i => _
- rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
+ rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_hMul_self]
exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
#align lp.infty_cstar_ring lp.inftyCstarRing
-/
@@ -1038,7 +1038,7 @@ def lpInftySubring : Subring (PreLp B) :=
{ lp B ∞ with
carrier := {f | Memℓp f ∞}
one_mem' := one_memℓp_infty
- mul_mem' := fun f g hf hg => hf.infty_mul hg }
+ hMul_mem' := fun f g hf hg => hf.infty_mul hg }
#align lp_infty_subring lpInftySubring
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -135,7 +135,7 @@ theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toRea
theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C) :
Memℓp f p := by
apply memℓp_gen
- use ⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.to_real
+ use⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.to_real
apply hasSum_of_isLUB_of_nonneg
· intro b
exact Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,17 +2,14 @@
Copyright (c) 2021 Heather Macbeth. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
-
-! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit 2ebc1d6c2fed9f54c95bbc3998eaa5570527129a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.MeanInequalities
import Mathbin.Analysis.MeanInequalitiesPow
import Mathbin.Analysis.SpecialFunctions.Pow.Continuity
import Mathbin.Topology.Algebra.Order.LiminfLimsup
+#align_import analysis.normed_space.lp_space from "leanprover-community/mathlib"@"2ebc1d6c2fed9f54c95bbc3998eaa5570527129a"
+
/-!
# ℓp space
@@ -210,7 +207,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
#align mem_ℓp.neg_iff Memℓp.neg_iff
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
#print Memℓp.of_exponent_ge /-
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
@@ -1246,7 +1243,7 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
#align lp.single_smul lp.single_smul
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sum_single /-
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
@@ -1274,7 +1271,7 @@ protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
#align lp.norm_single lp.norm_single
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
#print lp.norm_sub_norm_compl_sub_single /-
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -86,22 +86,31 @@ def Memℓp (f : ∀ i, E i) (p : ℝ≥0∞) : Prop :=
#align mem_ℓp Memℓp
-/
+#print memℓp_zero_iff /-
theorem memℓp_zero_iff {f : ∀ i, E i} : Memℓp f 0 ↔ Set.Finite {i | f i ≠ 0} := by
dsimp [Memℓp] <;> rw [if_pos rfl]
#align mem_ℓp_zero_iff memℓp_zero_iff
+-/
+#print memℓp_zero /-
theorem memℓp_zero {f : ∀ i, E i} (hf : Set.Finite {i | f i ≠ 0}) : Memℓp f 0 :=
memℓp_zero_iff.2 hf
#align mem_ℓp_zero memℓp_zero
+-/
+#print memℓp_infty_iff /-
theorem memℓp_infty_iff {f : ∀ i, E i} : Memℓp f ∞ ↔ BddAbove (Set.range fun i => ‖f i‖) := by
dsimp [Memℓp] <;> rw [if_neg ENNReal.top_ne_zero, if_pos rfl]
#align mem_ℓp_infty_iff memℓp_infty_iff
+-/
+#print memℓp_infty /-
theorem memℓp_infty {f : ∀ i, E i} (hf : BddAbove (Set.range fun i => ‖f i‖)) : Memℓp f ∞ :=
memℓp_infty_iff.2 hf
#align mem_ℓp_infty memℓp_infty
+-/
+#print memℓp_gen_iff /-
theorem memℓp_gen_iff (hp : 0 < p.toReal) {f : ∀ i, E i} :
Memℓp f p ↔ Summable fun i => ‖f i‖ ^ p.toReal :=
by
@@ -109,7 +118,9 @@ theorem memℓp_gen_iff (hp : 0 < p.toReal) {f : ∀ i, E i} :
dsimp [Memℓp]
rw [if_neg hp.1.ne', if_neg hp.2.Ne]
#align mem_ℓp_gen_iff memℓp_gen_iff
+-/
+#print memℓp_gen /-
theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toReal) : Memℓp f p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -121,7 +132,9 @@ theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toRea
simpa using ((Set.Finite.of_summable_const (by norm_num) H).image fun i => ‖f i‖).BddAbove
exact (memℓp_gen_iff hp).2 hf
#align mem_ℓp_gen memℓp_gen
+-/
+#print memℓp_gen' /-
theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C) :
Memℓp f p := by
apply memℓp_gen
@@ -134,7 +147,9 @@ theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i i
rintro - ⟨s, rfl⟩
exact hf s
#align mem_ℓp_gen' memℓp_gen'
+-/
+#print zero_memℓp /-
theorem zero_memℓp : Memℓp (0 : ∀ i, E i) p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -146,26 +161,36 @@ theorem zero_memℓp : Memℓp (0 : ∀ i, E i) p :=
· apply memℓp_gen
simp [Real.zero_rpow hp.ne', summable_zero]
#align zero_mem_ℓp zero_memℓp
+-/
+#print zero_mem_ℓp' /-
theorem zero_mem_ℓp' : Memℓp (fun i : α => (0 : E i)) p :=
zero_memℓp
#align zero_mem_ℓp' zero_mem_ℓp'
+-/
namespace Memℓp
+#print Memℓp.finite_dsupport /-
theorem finite_dsupport {f : ∀ i, E i} (hf : Memℓp f 0) : Set.Finite {i | f i ≠ 0} :=
memℓp_zero_iff.1 hf
#align mem_ℓp.finite_dsupport Memℓp.finite_dsupport
+-/
+#print Memℓp.bddAbove /-
theorem bddAbove {f : ∀ i, E i} (hf : Memℓp f ∞) : BddAbove (Set.range fun i => ‖f i‖) :=
memℓp_infty_iff.1 hf
#align mem_ℓp.bdd_above Memℓp.bddAbove
+-/
+#print Memℓp.summable /-
theorem summable (hp : 0 < p.toReal) {f : ∀ i, E i} (hf : Memℓp f p) :
Summable fun i => ‖f i‖ ^ p.toReal :=
(memℓp_gen_iff hp).1 hf
#align mem_ℓp.summable Memℓp.summable
+-/
+#print Memℓp.neg /-
theorem neg {f : ∀ i, E i} (hf : Memℓp f p) : Memℓp (-f) p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -176,13 +201,17 @@ theorem neg {f : ∀ i, E i} (hf : Memℓp f p) : Memℓp (-f) p :=
· apply memℓp_gen
simpa using hf.summable hp
#align mem_ℓp.neg Memℓp.neg
+-/
+#print Memℓp.neg_iff /-
@[simp]
theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
⟨fun h => neg_neg f ▸ h.neg, Memℓp.neg⟩
#align mem_ℓp.neg_iff Memℓp.neg_iff
+-/
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+#print Memℓp.of_exponent_ge /-
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
rcases ENNReal.trichotomy₂ hpq with
@@ -224,7 +253,9 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
contrapose! hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
#align mem_ℓp.of_exponent_ge Memℓp.of_exponent_ge
+-/
+#print Memℓp.add /-
theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (f + g) p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -256,11 +287,15 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
Real.rpow_sum_le_const_mul_sum_rpow_of_nonneg (Finset.univ : Finset (Fin 2)) h fun i _ =>
(F i).coe_nonneg
#align mem_ℓp.add Memℓp.add
+-/
+#print Memℓp.sub /-
theorem sub {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (f - g) p := by
rw [sub_eq_add_neg]; exact hf.add hg.neg
#align mem_ℓp.sub Memℓp.sub
+-/
+#print Memℓp.finset_sum /-
theorem finset_sum {ι} (s : Finset ι) {f : ι → ∀ i, E i} (hf : ∀ i ∈ s, Memℓp (f i) p) :
Memℓp (fun a => ∑ i in s, f i a) p :=
by
@@ -272,11 +307,13 @@ theorem finset_sum {ι} (s : Finset ι) {f : ι → ∀ i, E i} (hf : ∀ i ∈
simp only [his, Finset.sum_insert, not_false_iff]
exact (hf i (s.mem_insert_self i)).add (ih fun j hj => hf j (Finset.mem_insert_of_mem hj))
#align mem_ℓp.finset_sum Memℓp.finset_sum
+-/
section BoundedSMul
variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
+#print Memℓp.const_smul /-
theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c • f) p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -296,10 +333,13 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
intro i
exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
#align mem_ℓp.const_smul Memℓp.const_smul
+-/
+#print Memℓp.const_mul /-
theorem const_mul {f : α → 𝕜} (hf : Memℓp f p) (c : 𝕜) : Memℓp (fun x => c * f x) p :=
@Memℓp.const_smul α (fun i => 𝕜) _ _ 𝕜 _ _ (fun i => by infer_instance) _ hf c
#align mem_ℓp.const_mul Memℓp.const_mul
+-/
end BoundedSMul
@@ -352,46 +392,63 @@ instance : Coe (lp E p) (∀ i, E i) :=
instance : CoeFun (lp E p) fun _ => ∀ i, E i :=
⟨fun f => ((f : ∀ i, E i) : ∀ i, E i)⟩
+#print lp.ext /-
@[ext]
theorem ext {f g : lp E p} (h : (f : ∀ i, E i) = g) : f = g :=
Subtype.ext h
#align lp.ext lp.ext
+-/
+#print lp.ext_iff /-
protected theorem ext_iff {f g : lp E p} : f = g ↔ (f : ∀ i, E i) = g :=
Subtype.ext_iff
#align lp.ext_iff lp.ext_iff
+-/
+#print lp.eq_zero' /-
theorem eq_zero' [IsEmpty α] (f : lp E p) : f = 0 :=
Subsingleton.elim f 0
#align lp.eq_zero' lp.eq_zero'
+-/
+#print lp.monotone /-
protected theorem monotone {p q : ℝ≥0∞} (hpq : q ≤ p) : lp E q ≤ lp E p := fun f hf =>
Memℓp.of_exponent_ge hf hpq
#align lp.monotone lp.monotone
+-/
+#print lp.memℓp /-
protected theorem memℓp (f : lp E p) : Memℓp f p :=
f.Prop
#align lp.mem_ℓp lp.memℓp
+-/
variable (E p)
+#print lp.coeFn_zero /-
@[simp]
theorem coeFn_zero : ⇑(0 : lp E p) = 0 :=
rfl
#align lp.coe_fn_zero lp.coeFn_zero
+-/
variable {E p}
+#print lp.coeFn_neg /-
@[simp]
theorem coeFn_neg (f : lp E p) : ⇑(-f) = -f :=
rfl
#align lp.coe_fn_neg lp.coeFn_neg
+-/
+#print lp.coeFn_add /-
@[simp]
theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
rfl
#align lp.coe_fn_add lp.coeFn_add
+-/
+#print lp.coeFn_sum /-
@[simp]
theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
@@ -401,33 +458,43 @@ theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
intro i s his
simp [Finset.sum_insert his]
#align lp.coe_fn_sum lp.coeFn_sum
+-/
+#print lp.coeFn_sub /-
@[simp]
theorem coeFn_sub (f g : lp E p) : ⇑(f - g) = f - g :=
rfl
#align lp.coe_fn_sub lp.coeFn_sub
+-/
instance : Norm (lp E p)
where norm f :=
if hp : p = 0 then by subst hp <;> exact (lp.memℓp f).finite_dsupport.toFinset.card
else if p = ∞ then ⨆ i, ‖f i‖ else (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal)
+#print lp.norm_eq_card_dsupport /-
theorem norm_eq_card_dsupport (f : lp E 0) : ‖f‖ = (lp.memℓp f).finite_dsupport.toFinset.card :=
dif_pos rfl
#align lp.norm_eq_card_dsupport lp.norm_eq_card_dsupport
+-/
+#print lp.norm_eq_ciSup /-
theorem norm_eq_ciSup (f : lp E ∞) : ‖f‖ = ⨆ i, ‖f i‖ :=
by
dsimp [norm]
rw [dif_neg ENNReal.top_ne_zero, if_pos rfl]
#align lp.norm_eq_csupr lp.norm_eq_ciSup
+-/
+#print lp.isLUB_norm /-
theorem isLUB_norm [Nonempty α] (f : lp E ∞) : IsLUB (Set.range fun i => ‖f i‖) ‖f‖ :=
by
rw [lp.norm_eq_ciSup]
exact isLUB_ciSup (lp.memℓp f)
#align lp.is_lub_norm lp.isLUB_norm
+-/
+#print lp.norm_eq_tsum_rpow /-
theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ = (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal) :=
by
@@ -435,7 +502,9 @@ theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
rw [ENNReal.toReal_pos_iff] at hp
rw [dif_neg hp.1.ne', if_neg hp.2.Ne]
#align lp.norm_eq_tsum_rpow lp.norm_eq_tsum_rpow
+-/
+#print lp.norm_rpow_eq_tsum /-
theorem norm_rpow_eq_tsum (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ ^ p.toReal = ∑' i, ‖f i‖ ^ p.toReal :=
by
@@ -447,14 +516,18 @@ theorem norm_rpow_eq_tsum (hp : 0 < p.toReal) (f : lp E p) :
(0 : ℝ) = 0 ^ p.to_real := by rw [Real.zero_rpow hp.ne']
_ ≤ _ := Real.rpow_le_rpow rfl.le (norm_nonneg (f i)) hp.le
#align lp.norm_rpow_eq_tsum lp.norm_rpow_eq_tsum
+-/
+#print lp.hasSum_norm /-
theorem hasSum_norm (hp : 0 < p.toReal) (f : lp E p) :
HasSum (fun i => ‖f i‖ ^ p.toReal) (‖f‖ ^ p.toReal) :=
by
rw [norm_rpow_eq_tsum hp]
exact ((lp.memℓp f).Summable hp).HasSum
#align lp.has_sum_norm lp.hasSum_norm
+-/
+#print lp.norm_nonneg' /-
theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -468,7 +541,9 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
refine' Real.rpow_nonneg_of_nonneg (tsum_nonneg _) _
exact fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
#align lp.norm_nonneg' lp.norm_nonneg'
+-/
+#print lp.norm_zero /-
@[simp]
theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
by
@@ -479,7 +554,9 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
have hp' : 1 / p.to_real ≠ 0 := one_div_ne_zero hp.ne'
simpa [Real.zero_rpow hp.ne'] using Real.zero_rpow hp'
#align lp.norm_zero lp.norm_zero
+-/
+#print lp.norm_eq_zero_iff /-
theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
classical
refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
@@ -505,10 +582,14 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
exact this.1
#align lp.norm_eq_zero_iff lp.norm_eq_zero_iff
+-/
+#print lp.eq_zero_iff_coeFn_eq_zero /-
theorem eq_zero_iff_coeFn_eq_zero {f : lp E p} : f = 0 ↔ ⇑f = 0 := by rw [lp.ext_iff, coe_fn_zero]
#align lp.eq_zero_iff_coe_fn_eq_zero lp.eq_zero_iff_coeFn_eq_zero
+-/
+#print lp.norm_neg /-
@[simp]
theorem norm_neg ⦃f : lp E p⦄ : ‖-f‖ = ‖f‖ :=
by
@@ -523,6 +604,7 @@ theorem norm_neg ⦃f : lp E p⦄ : ‖-f‖ = ‖f‖ :=
apply (lp.hasSum_norm hp (-f)).unique
simpa using lp.hasSum_norm hp f
#align lp.norm_neg lp.norm_neg
+-/
instance [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p) :=
AddGroupNorm.toNormedAddCommGroup
@@ -555,6 +637,7 @@ instance [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p) :=
exact Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp''.le
eq_zero_of_map_eq_zero' := fun f => norm_eq_zero_iff.1 }
+#print lp.tsum_mul_le_mul_norm /-
-- TODO: define an `ennreal` version of `is_conjugate_exponent`, and then express this inequality
-- in a better version which also covers the case `p = 1, q = ∞`.
/-- Hölder inequality -/
@@ -571,19 +654,25 @@ protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConj
rw [← hC.tsum_eq] at hC'
exact ⟨hC.summable, hC'⟩
#align lp.tsum_mul_le_mul_norm lp.tsum_mul_le_mul_norm
+-/
+#print lp.summable_mul /-
protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
(f : lp E p) (g : lp E q) : Summable fun i => ‖f i‖ * ‖g i‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).1
#align lp.summable_mul lp.summable_mul
+-/
+#print lp.tsum_mul_le_mul_norm' /-
protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
(f : lp E p) (g : lp E q) : ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).2
#align lp.tsum_mul_le_mul_norm' lp.tsum_mul_le_mul_norm'
+-/
section ComparePointwise
+#print lp.norm_apply_le_norm /-
theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤ ‖f‖ :=
by
rcases eq_or_ne p ∞ with (rfl | hp')
@@ -594,7 +683,9 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
rw [← Real.rpow_le_rpow_iff (norm_nonneg _) (norm_nonneg' _) hp'']
convert le_hasSum (has_sum_norm hp'' f) i fun i hi => this i
#align lp.norm_apply_le_norm lp.norm_apply_le_norm
+-/
+#print lp.sum_rpow_le_norm_rpow /-
theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
∑ i in s, ‖f i‖ ^ p.toReal ≤ ‖f‖ ^ p.toReal :=
by
@@ -603,32 +694,41 @@ theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
refine' sum_le_tsum _ (fun i hi => this i) _
exact (lp.memℓp f).Summable hp
#align lp.sum_rpow_le_norm_rpow lp.sum_rpow_le_norm_rpow
+-/
+#print lp.norm_le_of_forall_le' /-
theorem norm_le_of_forall_le' [Nonempty α] {f : lp E ∞} (C : ℝ) (hCf : ∀ i, ‖f i‖ ≤ C) : ‖f‖ ≤ C :=
by
refine' (is_lub_norm f).2 _
rintro - ⟨i, rfl⟩
exact hCf i
#align lp.norm_le_of_forall_le' lp.norm_le_of_forall_le'
+-/
+#print lp.norm_le_of_forall_le /-
theorem norm_le_of_forall_le {f : lp E ∞} {C : ℝ} (hC : 0 ≤ C) (hCf : ∀ i, ‖f i‖ ≤ C) : ‖f‖ ≤ C :=
by
cases isEmpty_or_nonempty α
· simpa [eq_zero' f] using hC
· exact norm_le_of_forall_le' C hCf
#align lp.norm_le_of_forall_le lp.norm_le_of_forall_le
+-/
+#print lp.norm_le_of_tsum_le /-
theorem norm_le_of_tsum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
(hf : ∑' i, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
by
rw [← Real.rpow_le_rpow_iff (norm_nonneg' _) hC hp, norm_rpow_eq_tsum hp]
exact hf
#align lp.norm_le_of_tsum_le lp.norm_le_of_tsum_le
+-/
+#print lp.norm_le_of_forall_sum_le /-
theorem norm_le_of_forall_sum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
(hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
norm_le_of_tsum_le hp hC (tsum_le_of_sum_le ((lp.memℓp f).Summable hp) hf)
#align lp.norm_le_of_forall_sum_le lp.norm_le_of_forall_sum_le
+-/
end ComparePointwise
@@ -654,31 +754,39 @@ instance [∀ i, Module 𝕜ᵐᵒᵖ (E i)] [∀ i, IsCentralScalar 𝕜 (E i)]
variable [∀ i, BoundedSMul 𝕜 (E i)] [∀ i, BoundedSMul 𝕜' (E i)]
+#print lp.mem_lp_const_smul /-
theorem mem_lp_const_smul (c : 𝕜) (f : lp E p) : c • (f : PreLp E) ∈ lp E p :=
(lp.memℓp f).const_smul c
#align lp.mem_lp_const_smul lp.mem_lp_const_smul
+-/
variable (E p 𝕜)
+#print lpSubmodule /-
/-- The `𝕜`-submodule of elements of `Π i : α, E i` whose `lp` norm is finite. This is `lp E p`,
with extra structure. -/
def lpSubmodule : Submodule 𝕜 (PreLp E) :=
{ lp E p with smul_mem' := fun c f hf => by simpa using mem_lp_const_smul c ⟨f, hf⟩ }
#align lp_submodule lpSubmodule
+-/
variable {E p 𝕜}
+#print lp.coe_lpSubmodule /-
theorem coe_lpSubmodule : (lpSubmodule E p 𝕜).toAddSubgroup = lp E p :=
rfl
#align lp.coe_lp_submodule lp.coe_lpSubmodule
+-/
instance : Module 𝕜 (lp E p) :=
{ (lpSubmodule E p 𝕜).Module with }
+#print lp.coeFn_smul /-
@[simp]
theorem coeFn_smul (c : 𝕜) (f : lp E p) : ⇑(c • f) = c • f :=
rfl
#align lp.coe_fn_smul lp.coeFn_smul
+-/
instance [∀ i, SMulCommClass 𝕜' 𝕜 (E i)] : SMulCommClass 𝕜' 𝕜 (lp E p) :=
⟨fun r c f => Subtype.ext <| smul_comm _ _ _⟩
@@ -689,6 +797,7 @@ instance [SMul 𝕜' 𝕜] [∀ i, IsScalarTower 𝕜' 𝕜 (E i)] : IsScalarTow
instance [∀ i, Module 𝕜ᵐᵒᵖ (E i)] [∀ i, IsCentralScalar 𝕜 (E i)] : IsCentralScalar 𝕜 (lp E p) :=
⟨fun r f => Subtype.ext <| op_smul_eq_smul _ _⟩
+#print lp.norm_const_smul_le /-
theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f‖ ≤ ‖c‖ * ‖f‖ :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -720,6 +829,7 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
rw [← NNReal.mul_rpow]
exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
#align lp.norm_const_smul_le lp.norm_const_smul_le
+-/
instance [Fact (1 ≤ p)] : BoundedSMul 𝕜 (lp E p) :=
BoundedSMul.of_norm_smul_le <| norm_const_smul_le (zero_lt_one.trans_le <| Fact.out (1 ≤ p)).ne'
@@ -732,6 +842,7 @@ variable {𝕜 : Type _}
variable [NormedDivisionRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
+#print lp.norm_const_smul /-
theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ :=
by
obtain rfl | hc := eq_or_ne c 0
@@ -740,6 +851,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
have := mul_le_mul_of_nonneg_left (norm_const_smul_le hp c⁻¹ (c • f)) (norm_nonneg c)
rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
#align lp.norm_const_smul lp.norm_const_smul
+-/
end DivisionRing
@@ -755,6 +867,7 @@ section NormedStarGroup
variable [∀ i, StarAddMonoid (E i)] [∀ i, NormedStarGroup (E i)]
+#print Memℓp.star_mem /-
theorem Memℓp.star_mem {f : ∀ i, E i} (hf : Memℓp f p) : Memℓp (star f) p :=
by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -765,23 +878,30 @@ theorem Memℓp.star_mem {f : ∀ i, E i} (hf : Memℓp f p) : Memℓp (star f)
· apply memℓp_gen
simpa using hf.summable hp
#align mem_ℓp.star_mem Memℓp.star_mem
+-/
+#print Memℓp.star_iff /-
@[simp]
theorem Memℓp.star_iff {f : ∀ i, E i} : Memℓp (star f) p ↔ Memℓp f p :=
⟨fun h => star_star f ▸ Memℓp.star_mem h, Memℓp.star_mem⟩
#align mem_ℓp.star_iff Memℓp.star_iff
+-/
instance : Star (lp E p) where unit f := ⟨(star f : ∀ i, E i), f.property.star_mem⟩
+#print lp.coeFn_star /-
@[simp]
theorem coeFn_star (f : lp E p) : ⇑(star f) = star f :=
rfl
#align lp.coe_fn_star lp.coeFn_star
+-/
+#print lp.star_apply /-
@[simp]
protected theorem star_apply (f : lp E p) (i : α) : star f i = star (f i) :=
rfl
#align lp.star_apply lp.star_apply
+-/
instance : InvolutiveStar (lp E p) where star_involutive x := by ext; simp
@@ -808,6 +928,7 @@ section NonUnitalNormedRing
variable {I : Type _} {B : I → Type _} [∀ i, NonUnitalNormedRing (B i)]
+#print Memℓp.infty_mul /-
theorem Memℓp.infty_mul {f g : ∀ i, B i} (hf : Memℓp f ∞) (hg : Memℓp g ∞) : Memℓp (f * g) ∞ :=
by
rw [memℓp_infty_iff]
@@ -820,13 +941,16 @@ theorem Memℓp.infty_mul {f g : ∀ i, B i} (hf : Memℓp f ∞) (hg : Memℓp
mul_le_mul (hCf ⟨i, rfl⟩) (hCg ⟨i, rfl⟩) (norm_nonneg _)
((norm_nonneg _).trans (hCf ⟨i, rfl⟩))
#align mem_ℓp.infty_mul Memℓp.infty_mul
+-/
instance : Mul (lp B ∞) where mul f g := ⟨(f * g : ∀ i, B i), f.property.infty_mul g.property⟩
+#print lp.infty_coeFn_mul /-
@[simp]
theorem infty_coeFn_mul (f g : lp B ∞) : ⇑(f * g) = f * g :=
rfl
#align lp.infty_coe_fn_mul lp.infty_coeFn_mul
+-/
instance : NonUnitalRing (lp B ∞) :=
Function.Injective.nonUnitalRing lp.hasCoeToFun.coe Subtype.coe_injective (lp.coeFn_zero B ∞)
@@ -842,28 +966,35 @@ instance : NonUnitalNormedRing (lp B ∞) :=
mul_le_mul (lp.norm_apply_le_norm ENNReal.top_ne_zero f i)
(lp.norm_apply_le_norm ENNReal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _) }
+#print lp.infty_isScalarTower /-
-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
instance infty_isScalarTower {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, IsScalarTower 𝕜 (B i) (B i)] : IsScalarTower 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_assoc r (⇑f) ⇑g⟩
#align lp.infty_is_scalar_tower lp.infty_isScalarTower
+-/
+#print lp.infty_sMulCommClass /-
instance infty_sMulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, SMulCommClass 𝕜 (B i) (B i)] : SMulCommClass 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_comm r (⇑f) ⇑g⟩
#align lp.infty_smul_comm_class lp.infty_sMulCommClass
+-/
section StarRing
variable [∀ i, StarRing (B i)] [∀ i, NormedStarGroup (B i)]
+#print lp.inftyStarRing /-
instance inftyStarRing : StarRing (lp B ∞) :=
{
show StarAddMonoid (lp B ∞) by letI : ∀ i, StarAddMonoid (B i) := fun i => inferInstance;
infer_instance with
star_mul := fun f g => ext <| star_mul (_ : ∀ i, B i) _ }
#align lp.infty_star_ring lp.inftyStarRing
+-/
+#print lp.inftyCstarRing /-
instance inftyCstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
where norm_star_mul_self f := by
apply le_antisymm
@@ -877,6 +1008,7 @@ instance inftyCstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
#align lp.infty_cstar_ring lp.inftyCstarRing
+-/
end StarRing
@@ -894,12 +1026,15 @@ instance PreLp.ring : Ring (PreLp B) :=
variable [∀ i, NormOneClass (B i)]
+#print one_memℓp_infty /-
theorem one_memℓp_infty : Memℓp (1 : ∀ i, B i) ∞ :=
⟨1, by rintro i ⟨i, rfl⟩; exact norm_one.le⟩
#align one_mem_ℓp_infty one_memℓp_infty
+-/
variable (B)
+#print lpInftySubring /-
/-- The `𝕜`-subring of elements of `Π i : α, B i` whose `lp` norm is finite. This is `lp E ∞`,
with extra structure. -/
def lpInftySubring : Subring (PreLp B) :=
@@ -908,52 +1043,71 @@ def lpInftySubring : Subring (PreLp B) :=
one_mem' := one_memℓp_infty
mul_mem' := fun f g hf hg => hf.infty_mul hg }
#align lp_infty_subring lpInftySubring
+-/
variable {B}
+#print lp.inftyRing /-
instance inftyRing : Ring (lp B ∞) :=
(lpInftySubring B).toRing
#align lp.infty_ring lp.inftyRing
+-/
+#print Memℓp.infty_pow /-
theorem Memℓp.infty_pow {f : ∀ i, B i} (hf : Memℓp f ∞) (n : ℕ) : Memℓp (f ^ n) ∞ :=
(lpInftySubring B).pow_mem hf n
#align mem_ℓp.infty_pow Memℓp.infty_pow
+-/
+#print nat_cast_memℓp_infty /-
theorem nat_cast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
natCast_mem (lpInftySubring B) n
#align nat_cast_mem_ℓp_infty nat_cast_memℓp_infty
+-/
+#print int_cast_memℓp_infty /-
theorem int_cast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
coe_int_mem (lpInftySubring B) z
#align int_cast_mem_ℓp_infty int_cast_memℓp_infty
+-/
+#print lp.infty_coeFn_one /-
@[simp]
theorem infty_coeFn_one : ⇑(1 : lp B ∞) = 1 :=
rfl
#align lp.infty_coe_fn_one lp.infty_coeFn_one
+-/
+#print lp.infty_coeFn_pow /-
@[simp]
theorem infty_coeFn_pow (f : lp B ∞) (n : ℕ) : ⇑(f ^ n) = f ^ n :=
rfl
#align lp.infty_coe_fn_pow lp.infty_coeFn_pow
+-/
+#print lp.infty_coeFn_nat_cast /-
@[simp]
theorem infty_coeFn_nat_cast (n : ℕ) : ⇑(n : lp B ∞) = n :=
rfl
#align lp.infty_coe_fn_nat_cast lp.infty_coeFn_nat_cast
+-/
+#print lp.infty_coeFn_int_cast /-
@[simp]
theorem infty_coeFn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z :=
rfl
#align lp.infty_coe_fn_int_cast lp.infty_coeFn_int_cast
+-/
instance [Nonempty I] : NormOneClass (lp B ∞)
where norm_one := by
simp_rw [lp.norm_eq_ciSup, infty_coe_fn_one, Pi.one_apply, norm_one, ciSup_const]
+#print lp.inftyNormedRing /-
instance inftyNormedRing : NormedRing (lp B ∞) :=
{ lp.inftyRing, lp.nonUnitalNormedRing with }
#align lp.infty_normed_ring lp.inftyNormedRing
+-/
end NormedRing
@@ -961,14 +1115,18 @@ section NormedCommRing
variable {I : Type _} {B : I → Type _} [∀ i, NormedCommRing (B i)] [∀ i, NormOneClass (B i)]
+#print lp.inftyCommRing /-
instance inftyCommRing : CommRing (lp B ∞) :=
{ lp.inftyRing with
mul_comm := fun f g => by ext; simp only [lp.infty_coeFn_mul, Pi.mul_apply, mul_comm] }
#align lp.infty_comm_ring lp.inftyCommRing
+-/
+#print lp.inftyNormedCommRing /-
instance inftyNormedCommRing : NormedCommRing (lp B ∞) :=
{ lp.inftyCommRing, lp.inftyNormedRing with }
#align lp.infty_normed_comm_ring lp.inftyNormedCommRing
+-/
end NormedCommRing
@@ -993,14 +1151,17 @@ instance PreLp.algebra : Algebra 𝕜 (PreLp B) :=
variable [∀ i, NormOneClass (B i)]
+#print algebraMap_memℓp_infty /-
theorem algebraMap_memℓp_infty (k : 𝕜) : Memℓp (algebraMap 𝕜 (∀ i, B i) k) ∞ :=
by
rw [Algebra.algebraMap_eq_smul_one]
exact (one_mem_ℓp_infty.const_smul k : Memℓp (k • 1 : ∀ i, B i) ∞)
#align algebra_map_mem_ℓp_infty algebraMap_memℓp_infty
+-/
variable (𝕜 B)
+#print lpInftySubalgebra /-
/-- The `𝕜`-subalgebra of elements of `Π i : α, B i` whose `lp` norm is finite. This is `lp E ∞`,
with extra structure. -/
def lpInftySubalgebra : Subalgebra 𝕜 (PreLp B) :=
@@ -1008,12 +1169,15 @@ def lpInftySubalgebra : Subalgebra 𝕜 (PreLp B) :=
carrier := {f | Memℓp f ∞}
algebraMap_mem' := algebraMap_memℓp_infty }
#align lp_infty_subalgebra lpInftySubalgebra
+-/
variable {𝕜 B}
+#print lp.inftyNormedAlgebra /-
instance inftyNormedAlgebra : NormedAlgebra 𝕜 (lp B ∞) :=
{ (lpInftySubalgebra 𝕜 B).Algebra, (lp.normedSpace : NormedSpace 𝕜 (lp B ∞)) with }
#align lp.infty_normed_algebra lp.inftyNormedAlgebra
+-/
end Algebra
@@ -1023,6 +1187,7 @@ variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, Bo
variable [DecidableEq α]
+#print lp.single /-
/-- The element of `lp E p` which is `a : E i` at the index `i`, and zero elsewhere. -/
protected def single (p) (i : α) (a : E i) : lp E p :=
⟨fun j => if h : j = i then Eq.ndrec a h.symm else 0,
@@ -1035,11 +1200,14 @@ protected def single (p) (i : α) (a : E i) : lp E p :=
rintro rfl
simp⟩
#align lp.single lp.single
+-/
+#print lp.single_apply /-
protected theorem single_apply (p) (i : α) (a : E i) (j : α) :
lp.single p i a j = if h : j = i then Eq.ndrec a h.symm else 0 :=
rfl
#align lp.single_apply lp.single_apply
+-/
#print lp.single_apply_self /-
protected theorem single_apply_self (p) (i : α) (a : E i) : lp.single p i a i = a := by
@@ -1047,10 +1215,13 @@ protected theorem single_apply_self (p) (i : α) (a : E i) : lp.single p i a i =
#align lp.single_apply_self lp.single_apply_self
-/
+#print lp.single_apply_ne /-
protected theorem single_apply_ne (p) (i : α) (a : E i) {j : α} (hij : j ≠ i) :
lp.single p i a j = 0 := by rw [lp.single_apply, dif_neg hij]
#align lp.single_apply_ne lp.single_apply_ne
+-/
+#print lp.single_neg /-
@[simp]
protected theorem single_neg (p) (i : α) (a : E i) : lp.single p i (-a) = -lp.single p i a :=
by
@@ -1060,7 +1231,9 @@ protected theorem single_neg (p) (i : α) (a : E i) : lp.single p i (-a) = -lp.s
simp [lp.single_apply_self]
· simp [lp.single_apply_ne p i _ hi]
#align lp.single_neg lp.single_neg
+-/
+#print lp.single_smul /-
@[simp]
protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
lp.single p i (c • a) = c • lp.single p i a :=
@@ -1071,8 +1244,10 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
simp [lp.single_apply_self]
· simp [lp.single_apply_ne p i _ hi]
#align lp.single_smul lp.single_smul
+-/
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
+#print lp.norm_sum_single /-
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
@@ -1088,15 +1263,19 @@ protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Fins
rw [if_pos hi]
simpa [Finset.sum_congr rfl h'] using hasSum_sum_of_ne_finset_zero h
#align lp.norm_sum_single lp.norm_sum_single
+-/
+#print lp.norm_single /-
protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
‖lp.single p i (f i)‖ = ‖f i‖ :=
by
refine' Real.rpow_left_injOn hp.ne' (norm_nonneg' _) (norm_nonneg _) _
simpa using lp.norm_sum_single hp f {i}
#align lp.norm_single lp.norm_single
+-/
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
+#print lp.norm_sub_norm_compl_sub_single /-
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
@@ -1117,12 +1296,16 @@ protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p
have : HasSum F (∑ i in s, F i) := hasSum_sum_of_ne_finset_zero hF
rwa [Finset.sum_congr rfl hF'] at this
#align lp.norm_sub_norm_compl_sub_single lp.norm_sub_norm_compl_sub_single
+-/
+#print lp.norm_compl_sum_single /-
protected theorem norm_compl_sum_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ‖f‖ ^ p.toReal - ∑ i in s, ‖f i‖ ^ p.toReal :=
by linarith [lp.norm_sub_norm_compl_sub_single hp f s]
#align lp.norm_compl_sum_single lp.norm_compl_sum_single
+-/
+#print lp.hasSum_single /-
/-- The canonical finitely-supported approximations to an element `f` of `lp` converge to it, in the
`lp` topology. -/
protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
@@ -1151,6 +1334,7 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
by simp only [Real.abs_rpow_of_nonneg (norm_nonneg _), abs_norm]
linarith
#align lp.has_sum_single lp.hasSum_single
+-/
end Single
@@ -1160,6 +1344,7 @@ open Filter
open scoped Topology uniformity
+#print lp.uniformContinuous_coe /-
/-- The coercion from `lp E p` to `Π i, E i` is uniformly continuous. -/
theorem uniformContinuous_coe [_i : Fact (1 ≤ p)] : UniformContinuous (coe : lp E p → ∀ i, E i) :=
by
@@ -1174,9 +1359,11 @@ theorem uniformContinuous_coe [_i : Fact (1 ≤ p)] : UniformContinuous (coe : l
have : ‖f i - g i‖ ≤ ‖f - g‖ := norm_apply_le_norm hp (f - g) i
exact this.trans_lt hfg
#align lp.uniform_continuous_coe lp.uniformContinuous_coe
+-/
variable {ι : Type _} {l : Filter ι} [Filter.NeBot l]
+#print lp.norm_apply_le_of_tendsto /-
theorem norm_apply_le_of_tendsto {C : ℝ} {F : ι → lp E ∞} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C)
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (a : α) : ‖f a‖ ≤ C :=
by
@@ -1186,11 +1373,11 @@ theorem norm_apply_le_of_tendsto {C : ℝ} {F : ι → lp E ∞} (hCF : ∀ᶠ k
intro k hCFk
exact (norm_apply_le_norm ENNReal.top_ne_zero (F k) a).trans hCFk
#align lp.norm_apply_le_of_tendsto lp.norm_apply_le_of_tendsto
+-/
variable [_i : Fact (1 ≤ p)]
-include _i
-
+#print lp.sum_rpow_le_of_tendsto /-
theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C)
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (s : Finset α) :
∑ i : α in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal :=
@@ -1209,7 +1396,9 @@ theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (h
refine' (lp.sum_rpow_le_norm_rpow hp'' (F k) s).trans _
exact Real.rpow_le_rpow (norm_nonneg _) hCFk hp''.le
#align lp.sum_rpow_le_of_tendsto lp.sum_rpow_le_of_tendsto
+-/
+#print lp.norm_le_of_tendsto /-
/-- "Semicontinuity of the `lp` norm": If all sufficiently large elements of a sequence in `lp E p`
have `lp` norm `≤ C`, then the pointwise limit, if it exists, also has `lp` norm `≤ C`. -/
theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C) {f : lp E p}
@@ -1225,7 +1414,9 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
apply norm_le_of_forall_sum_le hp' hC
exact sum_rpow_le_of_tendsto hp.ne hCF hf
#align lp.norm_le_of_tendsto lp.norm_le_of_tendsto
+-/
+#print lp.memℓp_of_tendsto /-
/-- If `f` is the pointwise limit of a bounded sequence in `lp E p`, then `f` is in `lp E p`. -/
theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Metric.Bounded (Set.range F)) {f : ∀ a, E a}
(hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) : Memℓp f p :=
@@ -1240,7 +1431,9 @@ theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Metric.Bounded (Set.range F
· apply memℓp_gen'
exact sum_rpow_le_of_tendsto hp.ne (eventually_of_forall hCF) hf
#align lp.mem_ℓp_of_tendsto lp.memℓp_of_tendsto
+-/
+#print lp.tendsto_lp_of_tendsto_pi /-
/-- If a sequence is Cauchy in the `lp E p` topology and pointwise convergent to a element `f` of
`lp E p`, then it converges to `f` in the `lp E p` topology. -/
theorem tendsto_lp_of_tendsto_pi {F : ℕ → lp E p} (hF : CauchySeq F) {f : lp E p}
@@ -1257,6 +1450,7 @@ theorem tendsto_lp_of_tendsto_pi {F : ℕ → lp E p} (hF : CauchySeq F) {f : lp
intro a
exact (hf.apply a).const_sub (F n a)
#align lp.tendsto_lp_of_tendsto_pi lp.tendsto_lp_of_tendsto_pi
+-/
variable [∀ a, CompleteSpace (E a)]
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -122,7 +122,7 @@ theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toRea
exact (memℓp_gen_iff hp).2 hf
#align mem_ℓp_gen memℓp_gen
-theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, (∑ i in s, ‖f i‖ ^ p.toReal) ≤ C) :
+theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C) :
Memℓp f p := by
apply memℓp_gen
use ⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.to_real
@@ -560,7 +560,7 @@ instance [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p) :=
/-- Hölder inequality -/
protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
(f : lp E p) (g : lp E q) :
- (Summable fun i => ‖f i‖ * ‖g i‖) ∧ (∑' i, ‖f i‖ * ‖g i‖) ≤ ‖f‖ * ‖g‖ :=
+ (Summable fun i => ‖f i‖ * ‖g i‖) ∧ ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
by
have hf₁ : ∀ i, 0 ≤ ‖f i‖ := fun i => norm_nonneg _
have hg₁ : ∀ i, 0 ≤ ‖g i‖ := fun i => norm_nonneg _
@@ -578,7 +578,7 @@ protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExp
#align lp.summable_mul lp.summable_mul
protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
- (f : lp E p) (g : lp E q) : (∑' i, ‖f i‖ * ‖g i‖) ≤ ‖f‖ * ‖g‖ :=
+ (f : lp E p) (g : lp E q) : ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).2
#align lp.tsum_mul_le_mul_norm' lp.tsum_mul_le_mul_norm'
@@ -596,7 +596,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
#align lp.norm_apply_le_norm lp.norm_apply_le_norm
theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
- (∑ i in s, ‖f i‖ ^ p.toReal) ≤ ‖f‖ ^ p.toReal :=
+ ∑ i in s, ‖f i‖ ^ p.toReal ≤ ‖f‖ ^ p.toReal :=
by
rw [lp.norm_rpow_eq_tsum hp f]
have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
@@ -619,14 +619,14 @@ theorem norm_le_of_forall_le {f : lp E ∞} {C : ℝ} (hC : 0 ≤ C) (hCf : ∀
#align lp.norm_le_of_forall_le lp.norm_le_of_forall_le
theorem norm_le_of_tsum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
- (hf : (∑' i, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
+ (hf : ∑' i, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
by
rw [← Real.rpow_le_rpow_iff (norm_nonneg' _) hC hp, norm_rpow_eq_tsum hp]
exact hf
#align lp.norm_le_of_tsum_le lp.norm_le_of_tsum_le
theorem norm_le_of_forall_sum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
- (hf : ∀ s : Finset α, (∑ i in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
+ (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
norm_le_of_tsum_le hp hC (tsum_le_of_sum_le ((lp.memℓp f).Summable hp) hf)
#align lp.norm_le_of_forall_sum_le lp.norm_le_of_forall_sum_le
@@ -1139,15 +1139,15 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
rw [dist_comm] at hs
simp only [dist_eq_norm, Real.norm_eq_abs] at hs ⊢
have H :
- ‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real =
+ ‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real =
‖f‖ ^ p.to_real - ∑ i in s, ‖f i‖ ^ p.to_real :=
by
simpa only [coe_fn_neg, Pi.neg_apply, lp.single_neg, Finset.sum_neg_distrib, neg_sub_neg,
norm_neg, _root_.norm_neg] using lp.norm_compl_sum_single hp' (-f) s
rw [← H] at hs
have :
- |‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real| =
- ‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real :=
+ |‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real| =
+ ‖∑ i in s, lp.single p i (f i : E i) - f‖ ^ p.to_real :=
by simp only [Real.abs_rpow_of_nonneg (norm_nonneg _), abs_norm]
linarith
#align lp.has_sum_single lp.hasSum_single
@@ -1193,7 +1193,7 @@ include _i
theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C)
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (s : Finset α) :
- (∑ i : α in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal :=
+ ∑ i : α in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal :=
by
have hp' : p ≠ 0 := (zero_lt_one.trans_le _i.elim).ne'
have hp'' : 0 < p.to_real := ENNReal.toReal_pos hp' hp
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -446,7 +446,6 @@ theorem norm_rpow_eq_tsum (hp : 0 < p.toReal) (f : lp E p) :
calc
(0 : ℝ) = 0 ^ p.to_real := by rw [Real.zero_rpow hp.ne']
_ ≤ _ := Real.rpow_le_rpow rfl.le (norm_nonneg (f i)) hp.le
-
#align lp.norm_rpow_eq_tsum lp.norm_rpow_eq_tsum
theorem hasSum_norm (hp : 0 < p.toReal) (f : lp E p) :
@@ -820,7 +819,6 @@ theorem Memℓp.infty_mul {f g : ∀ i, B i} (hf : Memℓp f ∞) (hg : Memℓp
_ ≤ Cf * Cg :=
mul_le_mul (hCf ⟨i, rfl⟩) (hCg ⟨i, rfl⟩) (norm_nonneg _)
((norm_nonneg _).trans (hCf ⟨i, rfl⟩))
-
#align mem_ℓp.infty_mul Memℓp.infty_mul
instance : Mul (lp B ∞) where mul f g := ⟨(f * g : ∀ i, B i), f.property.infty_mul g.property⟩
@@ -842,8 +840,7 @@ instance : NonUnitalNormedRing (lp B ∞) :=
‖(f * g) i‖ ≤ ‖f i‖ * ‖g i‖ := norm_mul_le _ _
_ ≤ ‖f‖ * ‖g‖ :=
mul_le_mul (lp.norm_apply_le_norm ENNReal.top_ne_zero f i)
- (lp.norm_apply_le_norm ENNReal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _)
- }
+ (lp.norm_apply_le_norm ENNReal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _) }
-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
instance infty_isScalarTower {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -182,7 +182,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
⟨fun h => neg_neg f ▸ h.neg, Memℓp.neg⟩
#align mem_ℓp.neg_iff Memℓp.neg_iff
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
rcases ENNReal.trichotomy₂ hpq with
@@ -1075,7 +1075,7 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
· simp [lp.single_apply_ne p i _ hi]
#align lp.single_smul lp.single_smul
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
@@ -1099,7 +1099,7 @@ protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
simpa using lp.norm_sum_single hp f {i}
#align lp.norm_single lp.norm_single
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (i «expr ∉ » s) -/
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit de83b43717abe353f425855fcf0cedf9ea0fe8a4
+! leanprover-community/mathlib commit 2ebc1d6c2fed9f54c95bbc3998eaa5570527129a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -16,6 +16,9 @@ import Mathbin.Topology.Algebra.Order.LiminfLimsup
/-!
# ℓp space
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file describes properties of elements `f` of a pi-type `Π i, E i` with finite "norm",
defined for `p:ℝ≥0∞` as the size of the support of `f` if `p=0`, `(∑' a, ‖f a‖^p) ^ (1/p)` for
`0 < p < ∞` and `⨆ a, ‖f a‖` for `p=∞`.
@@ -78,16 +81,16 @@ variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddC
* admits an upper bound for `set.range (λ i, ‖f i‖)`, if `p = ∞`, or
* has the series `∑' i, ‖f i‖ ^ p` be summable, if `0 < p < ∞`. -/
def Memℓp (f : ∀ i, E i) (p : ℝ≥0∞) : Prop :=
- if p = 0 then Set.Finite { i | f i ≠ 0 }
+ if p = 0 then Set.Finite {i | f i ≠ 0}
else if p = ∞ then BddAbove (Set.range fun i => ‖f i‖) else Summable fun i => ‖f i‖ ^ p.toReal
#align mem_ℓp Memℓp
-/
-theorem memℓp_zero_iff {f : ∀ i, E i} : Memℓp f 0 ↔ Set.Finite { i | f i ≠ 0 } := by
+theorem memℓp_zero_iff {f : ∀ i, E i} : Memℓp f 0 ↔ Set.Finite {i | f i ≠ 0} := by
dsimp [Memℓp] <;> rw [if_pos rfl]
#align mem_ℓp_zero_iff memℓp_zero_iff
-theorem memℓp_zero {f : ∀ i, E i} (hf : Set.Finite { i | f i ≠ 0 }) : Memℓp f 0 :=
+theorem memℓp_zero {f : ∀ i, E i} (hf : Set.Finite {i | f i ≠ 0}) : Memℓp f 0 :=
memℓp_zero_iff.2 hf
#align mem_ℓp_zero memℓp_zero
@@ -150,7 +153,7 @@ theorem zero_mem_ℓp' : Memℓp (fun i : α => (0 : E i)) p :=
namespace Memℓp
-theorem finite_dsupport {f : ∀ i, E i} (hf : Memℓp f 0) : Set.Finite { i | f i ≠ 0 } :=
+theorem finite_dsupport {f : ∀ i, E i} (hf : Memℓp f 0) : Set.Finite {i | f i ≠ 0} :=
memℓp_zero_iff.1 hf
#align mem_ℓp.finite_dsupport Memℓp.finite_dsupport
@@ -209,8 +212,8 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
Real.rpow_le_rpow this (hA ⟨i, rfl⟩) (inv_nonneg.mpr hq.le)
· apply memℓp_gen
have hf' := hfq.summable hq
- refine' summable_of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ { i | 1 ≤ ‖f i‖ } _ _ _)
- · have H : { x : α | 1 ≤ ‖f x‖ ^ q.to_real }.Finite := by
+ refine' summable_of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ {i | 1 ≤ ‖f i‖} _ _ _)
+ · have H : {x : α | 1 ≤ ‖f x‖ ^ q.to_real}.Finite := by
simpa using
eventually_lt_of_tendsto_lt (by norm_num : (0 : ℝ) < 1) hf'.tendsto_cofinite_zero
exact H.subset fun i hi => Real.one_le_rpow hi hq.le
@@ -334,7 +337,7 @@ instance PreLp.unique [IsEmpty α] : Unique (PreLp E) :=
/-- lp space -/
def lp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) : AddSubgroup (PreLp E)
where
- carrier := { f | Memℓp f p }
+ carrier := {f | Memℓp f p}
zero_mem' := zero_memℓp
add_mem' f g := Memℓp.add
neg_mem' f := Memℓp.neg
@@ -393,10 +396,10 @@ theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
classical
- refine' Finset.induction _ _ s
- · simp
- intro i s his
- simp [Finset.sum_insert his]
+ refine' Finset.induction _ _ s
+ · simp
+ intro i s his
+ simp [Finset.sum_insert his]
#align lp.coe_fn_sum lp.coeFn_sum
@[simp]
@@ -480,28 +483,28 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
classical
- refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
- rcases p.trichotomy with (rfl | rfl | hp)
- · ext i
- have : { i : α | ¬f i = 0 } = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
- have : (¬f i = 0) = False := congr_fun this i
- tauto
- · cases' isEmpty_or_nonempty α with _i _i <;> skip
- · simp
- have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
- ext i
- have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
- simpa using this
- · have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
- by
- have := lp.hasSum_norm hp f
- rwa [h, Real.zero_rpow hp.ne'] at this
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
- rw [hasSum_zero_iff_of_nonneg this] at hf
- ext i
- have : f i = 0 ∧ p.to_real ≠ 0 := by
- simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
- exact this.1
+ refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
+ rcases p.trichotomy with (rfl | rfl | hp)
+ · ext i
+ have : {i : α | ¬f i = 0} = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
+ have : (¬f i = 0) = False := congr_fun this i
+ tauto
+ · cases' isEmpty_or_nonempty α with _i _i <;> skip
+ · simp
+ have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
+ ext i
+ have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
+ simpa using this
+ · have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
+ by
+ have := lp.hasSum_norm hp f
+ rwa [h, Real.zero_rpow hp.ne'] at this
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ rw [hasSum_zero_iff_of_nonneg this] at hf
+ ext i
+ have : f i = 0 ∧ p.to_real ≠ 0 := by
+ simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
+ exact this.1
#align lp.norm_eq_zero_iff lp.norm_eq_zero_iff
theorem eq_zero_iff_coeFn_eq_zero {f : lp E p} : f = 0 ↔ ⇑f = 0 := by rw [lp.ext_iff, coe_fn_zero]
@@ -904,7 +907,7 @@ variable (B)
with extra structure. -/
def lpInftySubring : Subring (PreLp B) :=
{ lp B ∞ with
- carrier := { f | Memℓp f ∞ }
+ carrier := {f | Memℓp f ∞}
one_mem' := one_memℓp_infty
mul_mem' := fun f g hf hg => hf.infty_mul hg }
#align lp_infty_subring lpInftySubring
@@ -1005,7 +1008,7 @@ variable (𝕜 B)
with extra structure. -/
def lpInftySubalgebra : Subalgebra 𝕜 (PreLp B) :=
{ lpInftySubring B with
- carrier := { f | Memℓp f ∞ }
+ carrier := {f | Memℓp f ∞}
algebraMap_mem' := algebraMap_memℓp_infty }
#align lp_infty_subalgebra lpInftySubalgebra
@@ -1248,7 +1251,7 @@ theorem tendsto_lp_of_tendsto_pi {F : ℕ → lp E p} (hF : CauchySeq F) {f : lp
by
rw [metric.nhds_basis_closed_ball.tendsto_right_iff]
intro ε hε
- have hε' : { p : lp E p × lp E p | ‖p.1 - p.2‖ < ε } ∈ 𝓤 (lp E p) :=
+ have hε' : {p : lp E p × lp E p | ‖p.1 - p.2‖ < ε} ∈ 𝓤 (lp E p) :=
normed_add_comm_group.uniformity_basis_dist.mem_of_mem hε
refine' (hF.eventually_eventually hε').mono _
rintro n (hn : ∀ᶠ l in at_top, ‖(fun f => F n - f) (F l)‖ < ε)
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -102,7 +102,7 @@ theorem memℓp_infty {f : ∀ i, E i} (hf : BddAbove (Set.range fun i => ‖f i
theorem memℓp_gen_iff (hp : 0 < p.toReal) {f : ∀ i, E i} :
Memℓp f p ↔ Summable fun i => ‖f i‖ ^ p.toReal :=
by
- rw [ENNReal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
dsimp [Memℓp]
rw [if_neg hp.1.ne', if_neg hp.2.Ne]
#align mem_ℓp_gen_iff memℓp_gen_iff
@@ -217,7 +217,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
· show ∀ i, ¬|‖f i‖ ^ p.to_real| ≤ ‖f i‖ ^ q.to_real → 1 ≤ ‖f i‖
intro i hi
have : 0 ≤ ‖f i‖ ^ p.to_real := Real.rpow_nonneg_of_nonneg (norm_nonneg _) p.to_real
- simp only [abs_of_nonneg, this] at hi
+ simp only [abs_of_nonneg, this] at hi
contrapose! hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
#align mem_ℓp.of_exponent_ge Memℓp.of_exponent_ge
@@ -248,7 +248,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
· simpa using NNReal.coe_le_coe.2 (NNReal.rpow_add_le_add_rpow ‖f i‖₊ ‖g i‖₊ hp.le h.le)
· let F : Fin 2 → ℝ≥0 := ![‖f i‖₊, ‖g i‖₊]
have : ∀ i, (0 : ℝ) ≤ F i := fun i => (F i).coe_nonneg
- simp only [not_lt] at h
+ simp only [not_lt] at h
simpa [F, Fin.sum_univ_succ] using
Real.rpow_sum_le_const_mul_sum_rpow_of_nonneg (Finset.univ : Finset (Fin 2)) h fun i _ =>
(F i).coe_nonneg
@@ -288,7 +288,7 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
· apply memℓp_gen
have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.to_real) : ℝ)
simp_rw [← coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul, NNReal.summable_coe, ←
- NNReal.mul_rpow] at this⊢
+ NNReal.mul_rpow] at this ⊢
refine' NNReal.summable_of_le _ this
intro i
exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
@@ -319,7 +319,8 @@ subgroup itself, because this allows all the spaces `lp E p` (for varying `p`) t
the same ambient group, which permits lemma statements like `lp.monotone` (below). -/
@[nolint unused_arguments]
def PreLp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] : Type _ :=
- ∀ i, E i deriving AddCommGroup
+ ∀ i, E i
+deriving AddCommGroup
#align pre_lp PreLp
-/
@@ -428,7 +429,7 @@ theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ = (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal) :=
by
dsimp [norm]
- rw [ENNReal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
rw [dif_neg hp.1.ne', if_neg hp.2.Ne]
#align lp.norm_eq_tsum_rpow lp.norm_eq_tsum_rpow
@@ -494,9 +495,9 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
· have hf : HasSum (fun i : α => ‖f i‖ ^ p.to_real) 0 :=
by
have := lp.hasSum_norm hp f
- rwa [h, Real.zero_rpow hp.ne'] at this
+ rwa [h, Real.zero_rpow hp.ne'] at this
have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
- rw [hasSum_zero_iff_of_nonneg this] at hf
+ rw [hasSum_zero_iff_of_nonneg this] at hf
ext i
have : f i = 0 ∧ p.to_real ≠ 0 := by
simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
@@ -565,7 +566,7 @@ protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConj
have hg₂ := lp.hasSum_norm hpq.symm.pos g
obtain ⟨C, -, hC', hC⟩ :=
Real.inner_le_Lp_mul_Lq_hasSum_of_nonneg hpq (norm_nonneg' _) (norm_nonneg' _) hf₁ hg₁ hf₂ hg₂
- rw [← hC.tsum_eq] at hC'
+ rw [← hC.tsum_eq] at hC'
exact ⟨hC.summable, hC'⟩
#align lp.tsum_mul_le_mul_norm lp.tsum_mul_le_mul_norm
@@ -694,23 +695,24 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
· simp [lp.eq_zero' f]
have hcf := lp.isLUB_norm (c • f)
have hfc := (lp.isLUB_norm f).mul_left (norm_nonneg c)
- simp_rw [← Set.range_comp, Function.comp] at hfc
+ simp_rw [← Set.range_comp, Function.comp] at hfc
-- TODO: some `is_lub` API should make it a one-liner from here.
refine' hcf.right _
have := hfc.left
- simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff'] at this⊢
+ simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff'] at this
+ ⊢
intro a
exact (norm_smul_le _ _).trans (this a)
· letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
have coe_nnnorm : ∀ f : lp E p, ↑‖f‖₊ = ‖f‖ := fun _ => rfl
suffices ‖c • f‖₊ ^ p.to_real ≤ (‖c‖₊ * ‖f‖₊) ^ p.to_real by
- rwa [NNReal.rpow_le_rpow_iff hp] at this
+ rwa [NNReal.rpow_le_rpow_iff hp] at this
clear_value inst
rw [NNReal.mul_rpow]
have hLHS := lp.hasSum_norm hp (c • f)
have hRHS := (lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
simp_rw [← coe_nnnorm, ← _root_.coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul,
- NNReal.hasSum_coe] at hRHS hLHS
+ NNReal.hasSum_coe] at hRHS hLHS
refine' hasSum_mono hLHS hRHS fun i => _
dsimp only
rw [← NNReal.mul_rpow]
@@ -734,7 +736,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
· simp
refine' le_antisymm (norm_const_smul_le hp c f) _
have := mul_le_mul_of_nonneg_left (norm_const_smul_le hp c⁻¹ (c • f)) (norm_nonneg c)
- rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
+ rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
#align lp.norm_const_smul lp.norm_const_smul
end DivisionRing
@@ -788,7 +790,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p)
rcases p.trichotomy with (rfl | rfl | h)
· exfalso
have := ENNReal.toReal_mono ENNReal.zero_ne_top hp.elim
- norm_num at this
+ norm_num at this
· simp only [lp.norm_eq_ciSup, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
@@ -1113,7 +1115,7 @@ protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p
Pi.sub_apply, Finset.sum_apply, Finset.sum_dite_eq, sub_eq_self]
simp [Real.zero_rpow hp.ne']
have : HasSum F (∑ i in s, F i) := hasSum_sum_of_ne_finset_zero hF
- rwa [Finset.sum_congr rfl hF'] at this
+ rwa [Finset.sum_congr rfl hF'] at this
#align lp.norm_sub_norm_compl_sub_single lp.norm_sub_norm_compl_sub_single
protected theorem norm_compl_sum_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
@@ -1129,20 +1131,20 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
have hp₀ : 0 < p := zero_lt_one.trans_le (Fact.out _)
have hp' : 0 < p.to_real := ENNReal.toReal_pos hp₀.ne' hp
have := lp.hasSum_norm hp' f
- rw [HasSum, Metric.tendsto_nhds] at this⊢
+ rw [HasSum, Metric.tendsto_nhds] at this ⊢
intro ε hε
refine' (this _ (Real.rpow_pos_of_pos hε p.to_real)).mono _
intro s hs
rw [← Real.rpow_lt_rpow_iff dist_nonneg (le_of_lt hε) hp']
- rw [dist_comm] at hs
- simp only [dist_eq_norm, Real.norm_eq_abs] at hs⊢
+ rw [dist_comm] at hs
+ simp only [dist_eq_norm, Real.norm_eq_abs] at hs ⊢
have H :
‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real =
‖f‖ ^ p.to_real - ∑ i in s, ‖f i‖ ^ p.to_real :=
by
simpa only [coe_fn_neg, Pi.neg_apply, lp.single_neg, Finset.sum_neg_distrib, neg_sub_neg,
norm_neg, _root_.norm_neg] using lp.norm_compl_sum_single hp' (-f) s
- rw [← H] at hs
+ rw [← H] at hs
have :
|‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real| =
‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -72,6 +72,7 @@ variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddC
-/
+#print Memℓp /-
/-- The property that `f : Π i : α, E i`
* is finitely supported, if `p = 0`, or
* admits an upper bound for `set.range (λ i, ‖f i‖)`, if `p = ∞`, or
@@ -80,6 +81,7 @@ def Memℓp (f : ∀ i, E i) (p : ℝ≥0∞) : Prop :=
if p = 0 then Set.Finite { i | f i ≠ 0 }
else if p = ∞ then BddAbove (Set.range fun i => ‖f i‖) else Summable fun i => ‖f i‖ ^ p.toReal
#align mem_ℓp Memℓp
+-/
theorem memℓp_zero_iff {f : ∀ i, E i} : Memℓp f 0 ↔ Set.Finite { i | f i ≠ 0 } := by
dsimp [Memℓp] <;> rw [if_pos rfl]
@@ -307,6 +309,7 @@ The space of elements of `Π i, E i` satisfying the predicate `mem_ℓp`.
-/
+#print PreLp /-
/-- We define `pre_lp E` to be a type synonym for `Π i, E i` which, importantly, does not inherit
the `pi` topology on `Π i, E i` (otherwise this topology would descend to `lp E p` and conflict
with the normed group topology we will later equip it with.)
@@ -318,11 +321,15 @@ the same ambient group, which permits lemma statements like `lp.monotone` (below
def PreLp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] : Type _ :=
∀ i, E i deriving AddCommGroup
#align pre_lp PreLp
+-/
+#print PreLp.unique /-
instance PreLp.unique [IsEmpty α] : Unique (PreLp E) :=
Pi.uniqueOfIsEmpty E
#align pre_lp.unique PreLp.unique
+-/
+#print lp /-
/-- lp space -/
def lp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) : AddSubgroup (PreLp E)
where
@@ -331,6 +338,7 @@ def lp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) :
add_mem' f g := Memℓp.add
neg_mem' f := Memℓp.neg
#align lp lp
+-/
namespace lp
@@ -404,15 +412,15 @@ theorem norm_eq_card_dsupport (f : lp E 0) : ‖f‖ = (lp.memℓp f).finite_dsu
dif_pos rfl
#align lp.norm_eq_card_dsupport lp.norm_eq_card_dsupport
-theorem norm_eq_csupr (f : lp E ∞) : ‖f‖ = ⨆ i, ‖f i‖ :=
+theorem norm_eq_ciSup (f : lp E ∞) : ‖f‖ = ⨆ i, ‖f i‖ :=
by
dsimp [norm]
rw [dif_neg ENNReal.top_ne_zero, if_pos rfl]
-#align lp.norm_eq_csupr lp.norm_eq_csupr
+#align lp.norm_eq_csupr lp.norm_eq_ciSup
theorem isLUB_norm [Nonempty α] (f : lp E ∞) : IsLUB (Set.range fun i => ‖f i‖) ‖f‖ :=
by
- rw [lp.norm_eq_csupr]
+ rw [lp.norm_eq_ciSup]
exact isLUB_ciSup (lp.memℓp f)
#align lp.is_lub_norm lp.isLUB_norm
@@ -449,7 +457,7 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
rcases p.trichotomy with (rfl | rfl | hp)
· simp [lp.norm_eq_card_dsupport f]
· cases' isEmpty_or_nonempty α with _i _i <;> skip
- · rw [lp.norm_eq_csupr]
+ · rw [lp.norm_eq_ciSup]
simp [Real.ciSup_empty]
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
@@ -463,7 +471,7 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
by
rcases p.trichotomy with (rfl | rfl | hp)
· simp [lp.norm_eq_card_dsupport]
- · simp [lp.norm_eq_csupr]
+ · simp [lp.norm_eq_ciSup]
· rw [lp.norm_eq_tsum_rpow hp]
have hp' : 1 / p.to_real ≠ 0 := one_div_ne_zero hp.ne'
simpa [Real.zero_rpow hp.ne'] using Real.zero_rpow hp'
@@ -781,7 +789,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p)
· exfalso
have := ENNReal.toReal_mono ENNReal.zero_ne_top hp.elim
norm_num at this
- · simp only [lp.norm_eq_csupr, lp.star_apply, norm_star]
+ · simp only [lp.norm_eq_ciSup, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
variable {𝕜 : Type _} [Star 𝕜] [NormedRing 𝕜]
@@ -854,7 +862,7 @@ instance inftyStarRing : StarRing (lp B ∞) :=
star_mul := fun f g => ext <| star_mul (_ : ∀ i, B i) _ }
#align lp.infty_star_ring lp.inftyStarRing
-instance infty_cstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
+instance inftyCstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
where norm_star_mul_self f := by
apply le_antisymm
· rw [← sq]
@@ -866,7 +874,7 @@ instance infty_cstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
refine' lp.norm_le_of_forall_le ‖star f * f‖.sqrt_nonneg fun i => _
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
-#align lp.infty_cstar_ring lp.infty_cstarRing
+#align lp.infty_cstar_ring lp.inftyCstarRing
end StarRing
@@ -876,9 +884,11 @@ section NormedRing
variable {I : Type _} {B : I → Type _} [∀ i, NormedRing (B i)]
+#print PreLp.ring /-
instance PreLp.ring : Ring (PreLp B) :=
Pi.ring
#align pre_lp.ring PreLp.ring
+-/
variable [∀ i, NormOneClass (B i)]
@@ -937,7 +947,7 @@ theorem infty_coeFn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z :=
instance [Nonempty I] : NormOneClass (lp B ∞)
where norm_one := by
- simp_rw [lp.norm_eq_csupr, infty_coe_fn_one, Pi.one_apply, norm_one, ciSup_const]
+ simp_rw [lp.norm_eq_ciSup, infty_coe_fn_one, Pi.one_apply, norm_one, ciSup_const]
instance inftyNormedRing : NormedRing (lp B ∞) :=
{ lp.inftyRing, lp.nonUnitalNormedRing with }
@@ -966,14 +976,18 @@ variable {I : Type _} {𝕜 : Type _} {B : I → Type _}
variable [NormedField 𝕜] [∀ i, NormedRing (B i)] [∀ i, NormedAlgebra 𝕜 (B i)]
+#print Pi.algebraOfNormedAlgebra /-
/-- A variant of `pi.algebra` that lean can't find otherwise. -/
instance Pi.algebraOfNormedAlgebra : Algebra 𝕜 (∀ i, B i) :=
@Pi.algebra I 𝕜 B _ _ fun i => NormedAlgebra.toAlgebra
#align pi.algebra_of_normed_algebra Pi.algebraOfNormedAlgebra
+-/
+#print PreLp.algebra /-
instance PreLp.algebra : Algebra 𝕜 (PreLp B) :=
Pi.algebraOfNormedAlgebra
#align pre_lp.algebra PreLp.algebra
+-/
variable [∀ i, NormOneClass (B i)]
@@ -1025,9 +1039,11 @@ protected theorem single_apply (p) (i : α) (a : E i) (j : α) :
rfl
#align lp.single_apply lp.single_apply
+#print lp.single_apply_self /-
protected theorem single_apply_self (p) (i : α) (a : E i) : lp.single p i a i = a := by
rw [lp.single_apply, dif_pos rfl]
#align lp.single_apply_self lp.single_apply_self
+-/
protected theorem single_apply_ne (p) (i : α) (a : E i) {j : α} (hij : j ≠ i) :
lp.single p i a j = 0 := by rw [lp.single_apply, dif_neg hij]
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -62,7 +62,7 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
noncomputable section
-open NNReal ENNReal BigOperators
+open scoped NNReal ENNReal BigOperators
variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddCommGroup (E i)]
@@ -1140,7 +1140,7 @@ section Topology
open Filter
-open Topology uniformity
+open scoped Topology uniformity
/-- The coercion from `lp E p` to `Π i, E i` is uniformly continuous. -/
theorem uniformContinuous_coe [_i : Fact (1 ≤ p)] : UniformContinuous (coe : lp E p → ∀ i, E i) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -252,10 +252,8 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
(F i).coe_nonneg
#align mem_ℓp.add Memℓp.add
-theorem sub {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (f - g) p :=
- by
- rw [sub_eq_add_neg]
- exact hf.add hg.neg
+theorem sub {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (f - g) p := by
+ rw [sub_eq_add_neg]; exact hf.add hg.neg
#align mem_ℓp.sub Memℓp.sub
theorem finset_sum {ι} (s : Finset ι) {f : ι → ∀ i, E i} (hf : ∀ i ∈ s, Memℓp (f i) p) :
@@ -473,10 +471,7 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 :=
theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
classical
- refine'
- ⟨fun h => _, by
- rintro rfl
- exact norm_zero⟩
+ refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
rcases p.trichotomy with (rfl | rfl | hp)
· ext i
have : { i : α | ¬f i = 0 } = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
@@ -776,10 +771,7 @@ protected theorem star_apply (f : lp E p) (i : α) : star f i = star (f i) :=
rfl
#align lp.star_apply lp.star_apply
-instance : InvolutiveStar (lp E p)
- where star_involutive x := by
- ext
- simp
+instance : InvolutiveStar (lp E p) where star_involutive x := by ext; simp
instance : StarAddMonoid (lp E p) where star_add f g := ext <| star_add _ _
@@ -857,9 +849,7 @@ variable [∀ i, StarRing (B i)] [∀ i, NormedStarGroup (B i)]
instance inftyStarRing : StarRing (lp B ∞) :=
{
- show StarAddMonoid (lp B ∞)
- by
- letI : ∀ i, StarAddMonoid (B i) := fun i => inferInstance
+ show StarAddMonoid (lp B ∞) by letI : ∀ i, StarAddMonoid (B i) := fun i => inferInstance;
infer_instance with
star_mul := fun f g => ext <| star_mul (_ : ∀ i, B i) _ }
#align lp.infty_star_ring lp.inftyStarRing
@@ -893,9 +883,7 @@ instance PreLp.ring : Ring (PreLp B) :=
variable [∀ i, NormOneClass (B i)]
theorem one_memℓp_infty : Memℓp (1 : ∀ i, B i) ∞ :=
- ⟨1, by
- rintro i ⟨i, rfl⟩
- exact norm_one.le⟩
+ ⟨1, by rintro i ⟨i, rfl⟩; exact norm_one.le⟩
#align one_mem_ℓp_infty one_memℓp_infty
variable (B)
@@ -963,9 +951,7 @@ variable {I : Type _} {B : I → Type _} [∀ i, NormedCommRing (B i)] [∀ i, N
instance inftyCommRing : CommRing (lp B ∞) :=
{ lp.inftyRing with
- mul_comm := fun f g => by
- ext
- simp only [lp.infty_coeFn_mul, Pi.mul_apply, mul_comm] }
+ mul_comm := fun f g => by ext; simp only [lp.infty_coeFn_mul, Pi.mul_apply, mul_comm] }
#align lp.infty_comm_ring lp.inftyCommRing
instance inftyNormedCommRing : NormedCommRing (lp B ∞) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/e1a18cad9cd462973d760af7de36b05776b8811c
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
+! leanprover-community/mathlib commit de83b43717abe353f425855fcf0cedf9ea0fe8a4
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -270,9 +270,9 @@ theorem finset_sum {ι} (s : Finset ι) {f : ι → ∀ i, E i} (hf : ∀ i ∈
exact (hf i (s.mem_insert_self i)).add (ih fun j hj => hf j (Finset.mem_insert_of_mem hj))
#align mem_ℓp.finset_sum Memℓp.finset_sum
-section NormedSpace
+section BoundedSMul
-variable {𝕜 : Type _} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
+variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c • f) p :=
by
@@ -283,18 +283,22 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
· obtain ⟨A, hA⟩ := hf.bdd_above
refine' memℓp_infty ⟨‖c‖ * A, _⟩
rintro a ⟨i, rfl⟩
- simpa [norm_smul] using mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c)
+ refine' (norm_smul_le _ _).trans _
+ exact mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c)
· apply memℓp_gen
- convert(hf.summable hp).mul_left (‖c‖ ^ p.to_real)
- ext i
- simp [norm_smul, Real.mul_rpow (norm_nonneg c) (norm_nonneg (f i))]
+ have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.to_real) : ℝ)
+ simp_rw [← coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul, NNReal.summable_coe, ←
+ NNReal.mul_rpow] at this⊢
+ refine' NNReal.summable_of_le _ this
+ intro i
+ exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
#align mem_ℓp.const_smul Memℓp.const_smul
theorem const_mul {f : α → 𝕜} (hf : Memℓp f p) (c : 𝕜) : Memℓp (fun x => c * f x) p :=
- @Memℓp.const_smul α (fun i => 𝕜) _ _ 𝕜 _ _ _ hf c
+ @Memℓp.const_smul α (fun i => 𝕜) _ _ 𝕜 _ _ (fun i => by infer_instance) _ hf c
#align mem_ℓp.const_mul Memℓp.const_mul
-end NormedSpace
+end BoundedSMul
end Memℓp
@@ -622,13 +626,28 @@ theorem norm_le_of_forall_sum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f
end ComparePointwise
-section NormedSpace
+section BoundedSMul
-variable {𝕜 : Type _} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
+variable {𝕜 : Type _} {𝕜' : Type _}
+
+variable [NormedRing 𝕜] [NormedRing 𝕜']
+
+variable [∀ i, Module 𝕜 (E i)] [∀ i, Module 𝕜' (E i)]
instance : Module 𝕜 (PreLp E) :=
Pi.module α E 𝕜
+instance [∀ i, SMulCommClass 𝕜' 𝕜 (E i)] : SMulCommClass 𝕜' 𝕜 (PreLp E) :=
+ Pi.smulCommClass
+
+instance [SMul 𝕜' 𝕜] [∀ i, IsScalarTower 𝕜' 𝕜 (E i)] : IsScalarTower 𝕜' 𝕜 (PreLp E) :=
+ Pi.isScalarTower
+
+instance [∀ i, Module 𝕜ᵐᵒᵖ (E i)] [∀ i, IsCentralScalar 𝕜 (E i)] : IsCentralScalar 𝕜 (PreLp E) :=
+ Pi.isCentralScalar
+
+variable [∀ i, BoundedSMul 𝕜 (E i)] [∀ i, BoundedSMul 𝕜' (E i)]
+
theorem mem_lp_const_smul (c : 𝕜) (f : lp E p) : c • (f : PreLp E) ∈ lp E p :=
(lp.memℓp f).const_smul c
#align lp.mem_lp_const_smul lp.mem_lp_const_smul
@@ -655,41 +674,73 @@ theorem coeFn_smul (c : 𝕜) (f : lp E p) : ⇑(c • f) = c • f :=
rfl
#align lp.coe_fn_smul lp.coeFn_smul
-theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ :=
+instance [∀ i, SMulCommClass 𝕜' 𝕜 (E i)] : SMulCommClass 𝕜' 𝕜 (lp E p) :=
+ ⟨fun r c f => Subtype.ext <| smul_comm _ _ _⟩
+
+instance [SMul 𝕜' 𝕜] [∀ i, IsScalarTower 𝕜' 𝕜 (E i)] : IsScalarTower 𝕜' 𝕜 (lp E p) :=
+ ⟨fun r c f => Subtype.ext <| smul_assoc _ _ _⟩
+
+instance [∀ i, Module 𝕜ᵐᵒᵖ (E i)] [∀ i, IsCentralScalar 𝕜 (E i)] : IsCentralScalar 𝕜 (lp E p) :=
+ ⟨fun r f => Subtype.ext <| op_smul_eq_smul _ _⟩
+
+theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f‖ ≤ ‖c‖ * ‖f‖ :=
by
rcases p.trichotomy with (rfl | rfl | hp)
· exact absurd rfl hp
· cases isEmpty_or_nonempty α <;> skip
· simp [lp.eq_zero' f]
- apply (lp.isLUB_norm (c • f)).unique
- convert(lp.isLUB_norm f).mul_left (norm_nonneg c)
- ext a
- simp [coe_fn_smul, norm_smul]
- · suffices ‖c • f‖ ^ p.to_real = (‖c‖ * ‖f‖) ^ p.to_real
- by
- refine' Real.rpow_left_injOn hp.ne' _ _ this
- · exact norm_nonneg' _
- · exact mul_nonneg (norm_nonneg _) (norm_nonneg' _)
- apply (lp.hasSum_norm hp (c • f)).unique
- convert(lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
- · simp [coe_fn_smul, norm_smul, Real.mul_rpow (norm_nonneg c) (norm_nonneg _)]
- have hf : 0 ≤ ‖f‖ := lp.norm_nonneg' f
- simp [coe_fn_smul, norm_smul, Real.mul_rpow (norm_nonneg c) hf]
+ have hcf := lp.isLUB_norm (c • f)
+ have hfc := (lp.isLUB_norm f).mul_left (norm_nonneg c)
+ simp_rw [← Set.range_comp, Function.comp] at hfc
+ -- TODO: some `is_lub` API should make it a one-liner from here.
+ refine' hcf.right _
+ have := hfc.left
+ simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff'] at this⊢
+ intro a
+ exact (norm_smul_le _ _).trans (this a)
+ · letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
+ have coe_nnnorm : ∀ f : lp E p, ↑‖f‖₊ = ‖f‖ := fun _ => rfl
+ suffices ‖c • f‖₊ ^ p.to_real ≤ (‖c‖₊ * ‖f‖₊) ^ p.to_real by
+ rwa [NNReal.rpow_le_rpow_iff hp] at this
+ clear_value inst
+ rw [NNReal.mul_rpow]
+ have hLHS := lp.hasSum_norm hp (c • f)
+ have hRHS := (lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
+ simp_rw [← coe_nnnorm, ← _root_.coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul,
+ NNReal.hasSum_coe] at hRHS hLHS
+ refine' hasSum_mono hLHS hRHS fun i => _
+ dsimp only
+ rw [← NNReal.mul_rpow]
+ exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
+#align lp.norm_const_smul_le lp.norm_const_smul_le
+
+instance [Fact (1 ≤ p)] : BoundedSMul 𝕜 (lp E p) :=
+ BoundedSMul.of_norm_smul_le <| norm_const_smul_le (zero_lt_one.trans_le <| Fact.out (1 ≤ p)).ne'
+
+end BoundedSMul
+
+section DivisionRing
+
+variable {𝕜 : Type _}
+
+variable [NormedDivisionRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
+
+theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ :=
+ by
+ obtain rfl | hc := eq_or_ne c 0
+ · simp
+ refine' le_antisymm (norm_const_smul_le hp c f) _
+ have := mul_le_mul_of_nonneg_left (norm_const_smul_le hp c⁻¹ (c • f)) (norm_nonneg c)
+ rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this
#align lp.norm_const_smul lp.norm_const_smul
-instance [Fact (1 ≤ p)] : NormedSpace 𝕜 (lp E p)
- where norm_smul_le c f :=
- by
- have hp : 0 < p := zero_lt_one.trans_le (Fact.out _)
- simp [norm_const_smul hp.ne']
+end DivisionRing
+
+section NormedSpace
-variable {𝕜' : Type _} [NormedField 𝕜']
+variable {𝕜 : Type _} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
-instance [∀ i, NormedSpace 𝕜' (E i)] [SMul 𝕜' 𝕜] [∀ i, IsScalarTower 𝕜' 𝕜 (E i)] :
- IsScalarTower 𝕜' 𝕜 (lp E p) := by
- refine' ⟨fun r c f => _⟩
- ext1
- exact (lp.coeFn_smul _ _).trans (smul_assoc _ _ _)
+instance [Fact (1 ≤ p)] : NormedSpace 𝕜 (lp E p) where norm_smul_le c f := norm_smul_le _ _
end NormedSpace
@@ -741,9 +792,9 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p)
· simp only [lp.norm_eq_csupr, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
-variable {𝕜 : Type _} [Star 𝕜] [NormedField 𝕜]
+variable {𝕜 : Type _} [Star 𝕜] [NormedRing 𝕜]
-variable [∀ i, NormedSpace 𝕜 (E i)] [∀ i, StarModule 𝕜 (E i)]
+variable [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)] [∀ i, StarModule 𝕜 (E i)]
instance : StarModule 𝕜 (lp E p) where star_smul r f := ext <| star_smul _ _
@@ -790,12 +841,12 @@ instance : NonUnitalNormedRing (lp B ∞) :=
}
-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
-instance infty_isScalarTower {𝕜} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (B i)]
+instance infty_isScalarTower {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, IsScalarTower 𝕜 (B i) (B i)] : IsScalarTower 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_assoc r (⇑f) ⇑g⟩
#align lp.infty_is_scalar_tower lp.infty_isScalarTower
-instance infty_sMulCommClass {𝕜} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (B i)]
+instance infty_sMulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, SMulCommClass 𝕜 (B i) (B i)] : SMulCommClass 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_comm r (⇑f) ⇑g⟩
#align lp.infty_smul_comm_class lp.infty_sMulCommClass
@@ -966,7 +1017,7 @@ end Algebra
section Single
-variable {𝕜 : Type _} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
+variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
variable [DecidableEq α]
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -4,12 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit f9dd3204df14a0749cd456fac1e6849dfe7d2b88
+! leanprover-community/mathlib commit 8f9fea08977f7e450770933ee6abb20733b47c92
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Analysis.MeanInequalities
import Mathbin.Analysis.MeanInequalitiesPow
+import Mathbin.Analysis.SpecialFunctions.Pow.Continuity
import Mathbin.Topology.Algebra.Order.LiminfLimsup
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -123,7 +123,7 @@ theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, (∑ i
apply hasSum_of_isLUB_of_nonneg
· intro b
exact Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
- apply isLUB_csupᵢ
+ apply isLUB_ciSup
use C
rintro - ⟨s, rfl⟩
exact hf s
@@ -410,7 +410,7 @@ theorem norm_eq_csupr (f : lp E ∞) : ‖f‖ = ⨆ i, ‖f i‖ :=
theorem isLUB_norm [Nonempty α] (f : lp E ∞) : IsLUB (Set.range fun i => ‖f i‖) ‖f‖ :=
by
rw [lp.norm_eq_csupr]
- exact isLUB_csupᵢ (lp.memℓp f)
+ exact isLUB_ciSup (lp.memℓp f)
#align lp.is_lub_norm lp.isLUB_norm
theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
@@ -447,7 +447,7 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ :=
· simp [lp.norm_eq_card_dsupport f]
· cases' isEmpty_or_nonempty α with _i _i <;> skip
· rw [lp.norm_eq_csupr]
- simp [Real.csupᵢ_empty]
+ simp [Real.ciSup_empty]
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
· rw [lp.norm_eq_tsum_rpow hp f]
@@ -897,7 +897,7 @@ theorem infty_coeFn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z :=
instance [Nonempty I] : NormOneClass (lp B ∞)
where norm_one := by
- simp_rw [lp.norm_eq_csupr, infty_coe_fn_one, Pi.one_apply, norm_one, csupᵢ_const]
+ simp_rw [lp.norm_eq_csupr, infty_coe_fn_one, Pi.one_apply, norm_one, ciSup_const]
instance inftyNormedRing : NormedRing (lp B ∞) :=
{ lp.inftyRing, lp.nonUnitalNormedRing with }
mathlib commit https://github.com/leanprover-community/mathlib/commit/92c69b77c5a7dc0f7eeddb552508633305157caa
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit 57ac39bd365c2f80589a700f9fbb664d3a1a30c2
+! leanprover-community/mathlib commit f9dd3204df14a0749cd456fac1e6849dfe7d2b88
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -1092,7 +1092,7 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
have :
|‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real| =
‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.to_real :=
- by simp only [Real.abs_rpow_of_nonneg (norm_nonneg _), abs_norm_eq_norm]
+ by simp only [Real.abs_rpow_of_nonneg (norm_nonneg _), abs_norm]
linarith
#align lp.has_sum_single lp.hasSum_single
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -284,7 +284,7 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
rintro a ⟨i, rfl⟩
simpa [norm_smul] using mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c)
· apply memℓp_gen
- convert (hf.summable hp).mul_left (‖c‖ ^ p.to_real)
+ convert(hf.summable hp).mul_left (‖c‖ ^ p.to_real)
ext i
simp [norm_smul, Real.mul_rpow (norm_nonneg c) (norm_nonneg (f i))]
#align mem_ℓp.const_smul Memℓp.const_smul
@@ -661,7 +661,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
· cases isEmpty_or_nonempty α <;> skip
· simp [lp.eq_zero' f]
apply (lp.isLUB_norm (c • f)).unique
- convert (lp.isLUB_norm f).mul_left (norm_nonneg c)
+ convert(lp.isLUB_norm f).mul_left (norm_nonneg c)
ext a
simp [coe_fn_smul, norm_smul]
· suffices ‖c • f‖ ^ p.to_real = (‖c‖ * ‖f‖) ^ p.to_real
@@ -670,7 +670,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
· exact norm_nonneg' _
· exact mul_nonneg (norm_nonneg _) (norm_nonneg' _)
apply (lp.hasSum_norm hp (c • f)).unique
- convert (lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
+ convert(lp.hasSum_norm hp f).mul_left (‖c‖ ^ p.to_real)
· simp [coe_fn_smul, norm_smul, Real.mul_rpow (norm_nonneg c) (norm_nonneg _)]
have hf : 0 ≤ ‖f‖ := lp.norm_nonneg' f
simp [coe_fn_smul, norm_smul, Real.mul_rpow (norm_nonneg c) hf]
mathlib commit https://github.com/leanprover-community/mathlib/commit/21e3562c5e12d846c7def5eff8cdbc520d7d4936
@@ -392,7 +392,7 @@ theorem coeFn_sub (f g : lp E p) : ⇑(f - g) = f - g :=
rfl
#align lp.coe_fn_sub lp.coeFn_sub
-instance : HasNorm (lp E p)
+instance : Norm (lp E p)
where norm f :=
if hp : p = 0 then by subst hp <;> exact (lp.memℓp f).finite_dsupport.toFinset.card
else if p = ∞ then ⨆ i, ‖f i‖ else (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal)
mathlib commit https://github.com/leanprover-community/mathlib/commit/3b267e70a936eebb21ab546f49a8df34dd300b25
@@ -109,10 +109,10 @@ theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toRea
rcases p.trichotomy with (rfl | rfl | hp)
· apply memℓp_zero
have H : Summable fun i : α => (1 : ℝ) := by simpa using hf
- exact (finite_of_summable_const (by norm_num) H).Subset (Set.subset_univ _)
+ exact (Set.Finite.of_summable_const (by norm_num) H).Subset (Set.subset_univ _)
· apply memℓp_infty
have H : Summable fun i : α => (1 : ℝ) := by simpa using hf
- simpa using ((finite_of_summable_const (by norm_num) H).image fun i => ‖f i‖).BddAbove
+ simpa using ((Set.Finite.of_summable_const (by norm_num) H).image fun i => ‖f i‖).BddAbove
exact (memℓp_gen_iff hp).2 hf
#align mem_ℓp_gen memℓp_gen
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -176,7 +176,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
⟨fun h => neg_neg f ▸ h.neg, Memℓp.neg⟩
#align mem_ℓp.neg_iff Memℓp.neg_iff
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
rcases ENNReal.trichotomy₂ hpq with
@@ -1016,7 +1016,7 @@ protected theorem single_smul (p) (i : α) (a : E i) (c : 𝕜) :
· simp [lp.single_apply_ne p i _ hi]
#align lp.single_smul lp.single_smul
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Finset α) :
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
@@ -1040,7 +1040,7 @@ protected theorem norm_single (hp : 0 < p.toReal) (f : ∀ i, E i) (i : α) :
simpa using lp.norm_sum_single hp f {i}
#align lp.norm_single lp.norm_single
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (i «expr ∉ » s) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (i «expr ∉ » s) -/
protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
‖f‖ ^ p.toReal - ‖f - ∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal :=
by
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
+! leanprover-community/mathlib commit 57ac39bd365c2f80589a700f9fbb664d3a1a30c2
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -679,7 +679,7 @@ theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ =
instance [Fact (1 ≤ p)] : NormedSpace 𝕜 (lp E p)
where norm_smul_le c f :=
by
- have hp : 0 < p := ennreal.zero_lt_one.trans_le (Fact.out _)
+ have hp : 0 < p := zero_lt_one.trans_le (Fact.out _)
simp [norm_const_smul hp.ne']
variable {𝕜' : Type _} [NormedField 𝕜']
@@ -1072,7 +1072,7 @@ protected theorem norm_compl_sum_single (hp : 0 < p.toReal) (f : lp E p) (s : Fi
protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
HasSum (fun i : α => lp.single p i (f i : E i)) f :=
by
- have hp₀ : 0 < p := ennreal.zero_lt_one.trans_le (Fact.out _)
+ have hp₀ : 0 < p := zero_lt_one.trans_le (Fact.out _)
have hp' : 0 < p.to_real := ENNReal.toReal_pos hp₀.ne' hp
have := lp.hasSum_norm hp' f
rw [HasSum, Metric.tendsto_nhds] at this⊢
@@ -1107,7 +1107,7 @@ open Topology uniformity
/-- The coercion from `lp E p` to `Π i, E i` is uniformly continuous. -/
theorem uniformContinuous_coe [_i : Fact (1 ≤ p)] : UniformContinuous (coe : lp E p → ∀ i, E i) :=
by
- have hp : p ≠ 0 := (ennreal.zero_lt_one.trans_le _i.elim).ne'
+ have hp : p ≠ 0 := (zero_lt_one.trans_le _i.elim).ne'
rw [uniformContinuous_pi]
intro i
rw [normed_add_comm_group.uniformity_basis_dist.uniform_continuous_iff
@@ -1139,7 +1139,7 @@ theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (h
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (s : Finset α) :
(∑ i : α in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal :=
by
- have hp' : p ≠ 0 := (ennreal.zero_lt_one.trans_le _i.elim).ne'
+ have hp' : p ≠ 0 := (zero_lt_one.trans_le _i.elim).ne'
have hp'' : 0 < p.to_real := ENNReal.toReal_pos hp' hp
let G : (∀ a, E a) → ℝ := fun f => ∑ a in s, ‖f a‖ ^ p.to_real
have hG : Continuous G := by
@@ -1164,7 +1164,7 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
rcases eq_top_or_lt_top p with (rfl | hp)
· apply norm_le_of_forall_le hC
exact norm_apply_le_of_tendsto hCF hf
- · have : 0 < p := ennreal.zero_lt_one.trans_le _i.elim
+ · have : 0 < p := zero_lt_one.trans_le _i.elim
have hp' : 0 < p.to_real := ENNReal.toReal_pos this.ne' hp.ne
apply norm_le_of_forall_sum_le hp' hC
exact sum_rpow_le_of_tendsto hp.ne hCF hf
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -61,7 +61,7 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
noncomputable section
-open NNReal Ennreal BigOperators
+open NNReal ENNReal BigOperators
variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddCommGroup (E i)]
@@ -89,7 +89,7 @@ theorem memℓp_zero {f : ∀ i, E i} (hf : Set.Finite { i | f i ≠ 0 }) : Mem
#align mem_ℓp_zero memℓp_zero
theorem memℓp_infty_iff {f : ∀ i, E i} : Memℓp f ∞ ↔ BddAbove (Set.range fun i => ‖f i‖) := by
- dsimp [Memℓp] <;> rw [if_neg Ennreal.top_ne_zero, if_pos rfl]
+ dsimp [Memℓp] <;> rw [if_neg ENNReal.top_ne_zero, if_pos rfl]
#align mem_ℓp_infty_iff memℓp_infty_iff
theorem memℓp_infty {f : ∀ i, E i} (hf : BddAbove (Set.range fun i => ‖f i‖)) : Memℓp f ∞ :=
@@ -99,7 +99,7 @@ theorem memℓp_infty {f : ∀ i, E i} (hf : BddAbove (Set.range fun i => ‖f i
theorem memℓp_gen_iff (hp : 0 < p.toReal) {f : ∀ i, E i} :
Memℓp f p ↔ Summable fun i => ‖f i‖ ^ p.toReal :=
by
- rw [Ennreal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
dsimp [Memℓp]
rw [if_neg hp.1.ne', if_neg hp.2.Ne]
#align mem_ℓp_gen_iff memℓp_gen_iff
@@ -179,7 +179,7 @@ theorem neg_iff {f : ∀ i, E i} : Memℓp (-f) p ↔ Memℓp f p :=
/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (i «expr ∉ » hfq.finite_dsupport.to_finset) -/
theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (hpq : q ≤ p) : Memℓp f p :=
by
- rcases Ennreal.trichotomy₂ hpq with
+ rcases ENNReal.trichotomy₂ hpq with
(⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, hp⟩ | ⟨rfl, rfl⟩ | ⟨hq, rfl⟩ | ⟨hq, hp, hpq'⟩)
· exact hfq
· apply memℓp_infty
@@ -404,7 +404,7 @@ theorem norm_eq_card_dsupport (f : lp E 0) : ‖f‖ = (lp.memℓp f).finite_dsu
theorem norm_eq_csupr (f : lp E ∞) : ‖f‖ = ⨆ i, ‖f i‖ :=
by
dsimp [norm]
- rw [dif_neg Ennreal.top_ne_zero, if_pos rfl]
+ rw [dif_neg ENNReal.top_ne_zero, if_pos rfl]
#align lp.norm_eq_csupr lp.norm_eq_csupr
theorem isLUB_norm [Nonempty α] (f : lp E ∞) : IsLUB (Set.range fun i => ‖f i‖) ‖f‖ :=
@@ -417,7 +417,7 @@ theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ = (∑' i, ‖f i‖ ^ p.toReal) ^ (1 / p.toReal) :=
by
dsimp [norm]
- rw [Ennreal.toReal_pos_iff] at hp
+ rw [ENNReal.toReal_pos_iff] at hp
rw [dif_neg hp.1.ne', if_neg hp.2.Ne]
#align lp.norm_eq_tsum_rpow lp.norm_eq_tsum_rpow
@@ -578,7 +578,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
rcases eq_or_ne p ∞ with (rfl | hp')
· haveI : Nonempty α := ⟨i⟩
exact (is_lub_norm f).1 ⟨i, rfl⟩
- have hp'' : 0 < p.to_real := Ennreal.toReal_pos hp hp'
+ have hp'' : 0 < p.to_real := ENNReal.toReal_pos hp hp'
have : ∀ i, 0 ≤ ‖f i‖ ^ p.to_real := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
rw [← Real.rpow_le_rpow_iff (norm_nonneg _) (norm_nonneg' _) hp'']
convert le_hasSum (has_sum_norm hp'' f) i fun i hi => this i
@@ -735,7 +735,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p)
where norm_star f := by
rcases p.trichotomy with (rfl | rfl | h)
· exfalso
- have := Ennreal.toReal_mono Ennreal.zero_ne_top hp.elim
+ have := ENNReal.toReal_mono ENNReal.zero_ne_top hp.elim
norm_num at this
· simp only [lp.norm_eq_csupr, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
@@ -784,8 +784,8 @@ instance : NonUnitalNormedRing (lp B ∞) :=
calc
‖(f * g) i‖ ≤ ‖f i‖ * ‖g i‖ := norm_mul_le _ _
_ ≤ ‖f‖ * ‖g‖ :=
- mul_le_mul (lp.norm_apply_le_norm Ennreal.top_ne_zero f i)
- (lp.norm_apply_le_norm Ennreal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _)
+ mul_le_mul (lp.norm_apply_le_norm ENNReal.top_ne_zero f i)
+ (lp.norm_apply_le_norm ENNReal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _)
}
-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
@@ -818,12 +818,12 @@ instance infty_cstarRing [∀ i, CstarRing (B i)] : CstarRing (lp B ∞)
· rw [← sq]
refine' lp.norm_le_of_forall_le (sq_nonneg ‖f‖) fun i => _
simp only [lp.star_apply, CstarRing.norm_star_mul_self, ← sq, infty_coe_fn_mul, Pi.mul_apply]
- refine' sq_le_sq' _ (lp.norm_apply_le_norm Ennreal.top_ne_zero _ _)
+ refine' sq_le_sq' _ (lp.norm_apply_le_norm ENNReal.top_ne_zero _ _)
linarith [norm_nonneg (f i), norm_nonneg f]
· rw [← sq, ← Real.le_sqrt (norm_nonneg _) (norm_nonneg _)]
refine' lp.norm_le_of_forall_le ‖star f * f‖.sqrt_nonneg fun i => _
rw [Real.le_sqrt (norm_nonneg _) (norm_nonneg _), sq, ← CstarRing.norm_star_mul_self]
- exact lp.norm_apply_le_norm Ennreal.top_ne_zero (star f * f) i
+ exact lp.norm_apply_le_norm ENNReal.top_ne_zero (star f * f) i
#align lp.infty_cstar_ring lp.infty_cstarRing
end StarRing
@@ -1073,7 +1073,7 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
HasSum (fun i : α => lp.single p i (f i : E i)) f :=
by
have hp₀ : 0 < p := ennreal.zero_lt_one.trans_le (Fact.out _)
- have hp' : 0 < p.to_real := Ennreal.toReal_pos hp₀.ne' hp
+ have hp' : 0 < p.to_real := ENNReal.toReal_pos hp₀.ne' hp
have := lp.hasSum_norm hp' f
rw [HasSum, Metric.tendsto_nhds] at this⊢
intro ε hε
@@ -1128,7 +1128,7 @@ theorem norm_apply_le_of_tendsto {C : ℝ} {F : ι → lp E ∞} (hCF : ∀ᶠ k
(tendsto.comp (continuous_apply a).ContinuousAt hf).norm
refine' le_of_tendsto this (hCF.mono _)
intro k hCFk
- exact (norm_apply_le_norm Ennreal.top_ne_zero (F k) a).trans hCFk
+ exact (norm_apply_le_norm ENNReal.top_ne_zero (F k) a).trans hCFk
#align lp.norm_apply_le_of_tendsto lp.norm_apply_le_of_tendsto
variable [_i : Fact (1 ≤ p)]
@@ -1140,7 +1140,7 @@ theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (h
(∑ i : α in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal :=
by
have hp' : p ≠ 0 := (ennreal.zero_lt_one.trans_le _i.elim).ne'
- have hp'' : 0 < p.to_real := Ennreal.toReal_pos hp' hp
+ have hp'' : 0 < p.to_real := ENNReal.toReal_pos hp' hp
let G : (∀ a, E a) → ℝ := fun f => ∑ a in s, ‖f a‖ ^ p.to_real
have hG : Continuous G := by
refine' continuous_finset_sum s _
@@ -1165,7 +1165,7 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
· apply norm_le_of_forall_le hC
exact norm_apply_le_of_tendsto hCF hf
· have : 0 < p := ennreal.zero_lt_one.trans_le _i.elim
- have hp' : 0 < p.to_real := Ennreal.toReal_pos this.ne' hp.ne
+ have hp' : 0 < p.to_real := ENNReal.toReal_pos this.ne' hp.ne
apply norm_le_of_forall_sum_le hp' hC
exact sum_rpow_le_of_tendsto hp.ne hCF hf
#align lp.norm_le_of_tendsto lp.norm_le_of_tendsto
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
Notably, these cause issues on nightly-2024-04-25
Co-authored-by: adamtopaz <github@adamtopaz.com>
@@ -266,10 +266,12 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
· obtain ⟨A, hA⟩ := hf.bddAbove
refine' memℓp_infty ⟨‖c‖ * A, _⟩
rintro a ⟨i, rfl⟩
+ dsimp only [Pi.smul_apply]
refine' (norm_smul_le _ _).trans _
gcongr
exact hA ⟨i, rfl⟩
· apply memℓp_gen
+ dsimp only [Pi.smul_apply]
have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.toReal) : ℝ)
simp_rw [← coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul, NNReal.summable_coe,
← NNReal.mul_rpow] at this ⊢
nat_cast
/int_cast
/rat_cast
to natCast
/intCast
/ratCast
(#11486)
Now that I am defining NNRat.cast
, I want a definitive answer to this naming issue. Plenty of lemmas in mathlib already use natCast
/intCast
/ratCast
over nat_cast
/int_cast
/rat_cast
, and this matches with the general expectation that underscore-separated name parts correspond to a single declaration.
@@ -883,13 +883,13 @@ theorem _root_.Memℓp.infty_pow {f : ∀ i, B i} (hf : Memℓp f ∞) (n : ℕ)
(lpInftySubring B).pow_mem hf n
#align mem_ℓp.infty_pow Memℓp.infty_pow
-theorem _root_.nat_cast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
+theorem _root_.natCast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :=
natCast_mem (lpInftySubring B) n
-#align nat_cast_mem_ℓp_infty nat_cast_memℓp_infty
+#align nat_cast_mem_ℓp_infty natCast_memℓp_infty
-theorem _root_.int_cast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
+theorem _root_.intCast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
intCast_mem (lpInftySubring B) z
-#align int_cast_mem_ℓp_infty int_cast_memℓp_infty
+#align int_cast_mem_ℓp_infty intCast_memℓp_infty
@[simp]
theorem infty_coeFn_one : ⇑(1 : lp B ∞) = 1 :=
@@ -902,14 +902,14 @@ theorem infty_coeFn_pow (f : lp B ∞) (n : ℕ) : ⇑(f ^ n) = (⇑f) ^ n :=
#align lp.infty_coe_fn_pow lp.infty_coeFn_pow
@[simp]
-theorem infty_coeFn_nat_cast (n : ℕ) : ⇑(n : lp B ∞) = n :=
+theorem infty_coeFn_natCast (n : ℕ) : ⇑(n : lp B ∞) = n :=
rfl
-#align lp.infty_coe_fn_nat_cast lp.infty_coeFn_nat_cast
+#align lp.infty_coe_fn_nat_cast lp.infty_coeFn_natCast
@[simp]
-theorem infty_coeFn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z :=
+theorem infty_coeFn_intCast (z : ℤ) : ⇑(z : lp B ∞) = z :=
rfl
-#align lp.infty_coe_fn_int_cast lp.infty_coeFn_int_cast
+#align lp.infty_coe_fn_int_cast lp.infty_coeFn_intCast
instance [Nonempty I] : NormOneClass (lp B ∞) where
norm_one := by simp_rw [lp.norm_eq_ciSup, infty_coeFn_one, Pi.one_apply, norm_one, ciSup_const]
In all cases, the original proof works now. I presume this is due to simp changes in Lean 4.7, but haven't verified.
@@ -502,9 +502,7 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
add_le' := fun f g => by
rcases p.dichotomy with (rfl | hp')
· cases isEmpty_or_nonempty α
- · -- porting note (#10745): was `simp [lp.eq_zero' f]`
- rw [lp.eq_zero' f]
- simp only [zero_add, norm_zero, le_refl] -- porting note (#11083): just `simp` was slow
+ · simp only [lp.eq_zero' f, zero_add, norm_zero, le_refl]
refine' (lp.isLUB_norm (f + g)).2 _
rintro x ⟨i, rfl⟩
refine' le_trans _ (add_mem_upperBounds_add
@@ -890,7 +890,7 @@ theorem _root_.nat_cast_memℓp_infty (n : ℕ) : Memℓp (n : ∀ i, B i) ∞ :
#align nat_cast_mem_ℓp_infty nat_cast_memℓp_infty
theorem _root_.int_cast_memℓp_infty (z : ℤ) : Memℓp (z : ∀ i, B i) ∞ :=
- coe_int_mem (lpInftySubring B) z
+ intCast_mem (lpInftySubring B) z
#align int_cast_mem_ℓp_infty int_cast_memℓp_infty
@[simp]
Tendsto.fst
, Tendsto.snd
and Tendsto.apply
(these are about product of filters)Tendsto.apply
to Tendsto.apply_nhds
, and add Tendsto.fst_nhds
and Tendsto.snd_nhds
(these are about neighborhoods in a product space)@@ -1191,7 +1191,7 @@ theorem tendsto_lp_of_tendsto_pi {F : ℕ → lp E p} (hF : CauchySeq F) {f : lp
refine' norm_le_of_tendsto (hn.mono fun k hk => hk.le) _
rw [tendsto_pi_nhds]
intro a
- exact (hf.apply a).const_sub (F n a)
+ exact (hf.apply_nhds a).const_sub (F n a)
#align lp.tendsto_lp_of_tendsto_pi lp.tendsto_lp_of_tendsto_pi
variable [∀ a, CompleteSpace (E a)]
@@ -215,7 +215,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
rcases p.trichotomy with (rfl | rfl | hp)
· apply memℓp_zero
refine' (hf.finite_dsupport.union hg.finite_dsupport).subset fun i => _
- simp only [Pi.add_apply, Ne.def, Set.mem_union, Set.mem_setOf_eq]
+ simp only [Pi.add_apply, Ne, Set.mem_union, Set.mem_setOf_eq]
contrapose!
rintro ⟨hf', hg'⟩
simp [hf', hg']
@@ -987,7 +987,7 @@ protected def single (p) (i : α) (a : E i) : lp E p :=
refine' (memℓp_zero _).of_exponent_ge (zero_le p)
refine' (Set.finite_singleton i).subset _
intro j
- simp only [forall_exists_index, Set.mem_singleton_iff, Ne.def, dite_eq_right_iff,
+ simp only [forall_exists_index, Set.mem_singleton_iff, Ne, dite_eq_right_iff,
Set.mem_setOf_eq, not_forall]
rintro rfl
simp⟩
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -602,9 +602,7 @@ end ComparePointwise
section BoundedSMul
variable {𝕜 : Type*} {𝕜' : Type*}
-
variable [NormedRing 𝕜] [NormedRing 𝕜']
-
variable [∀ i, Module 𝕜 (E i)] [∀ i, Module 𝕜' (E i)]
instance : Module 𝕜 (PreLp E) :=
@@ -698,7 +696,6 @@ end BoundedSMul
section DivisionRing
variable {𝕜 : Type*}
-
variable [NormedDivisionRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
theorem norm_const_smul (hp : p ≠ 0) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ := by
@@ -768,7 +765,6 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p) where
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
variable {𝕜 : Type*} [Star 𝕜] [NormedRing 𝕜]
-
variable [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)] [∀ i, StarModule 𝕜 (E i)]
instance : StarModule 𝕜 (lp E p) where
@@ -944,7 +940,6 @@ end NormedCommRing
section Algebra
variable {I : Type*} {𝕜 : Type*} {B : I → Type*}
-
variable [NormedField 𝕜] [∀ i, NormedRing (B i)] [∀ i, NormedAlgebra 𝕜 (B i)]
/-- A variant of `Pi.algebra` that lean can't find otherwise. -/
@@ -984,7 +979,6 @@ end Algebra
section Single
variable {𝕜 : Type*} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
-
variable [DecidableEq α]
/-- The element of `lp E p` which is `a : E i` at the index `i`, and zero elsewhere. -/
@@ -1174,8 +1174,7 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
/-- If `f` is the pointwise limit of a bounded sequence in `lp E p`, then `f` is in `lp E p`. -/
theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Bornology.IsBounded (Set.range F)) {f : ∀ a, E a}
(hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) : Memℓp f p := by
- obtain ⟨C, _, hCF'⟩ := hF.exists_pos_norm_le
- have hCF : ∀ k, ‖F k‖ ≤ C := fun k => hCF' _ ⟨k, rfl⟩
+ obtain ⟨C, hCF⟩ : ∃ C, ∀ k, ‖F k‖ ≤ C := hF.exists_norm_le.imp fun _ ↦ Set.forall_mem_range.1
rcases eq_top_or_lt_top p with (rfl | hp)
· apply memℓp_infty
use C
This is a very large PR, but it has been reviewed piecemeal already in PRs to the bump/v4.7.0
branch as we update to intermediate nightlies.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: damiano <adomani@gmail.com>
@@ -763,7 +763,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p) where
rcases p.trichotomy with (rfl | rfl | h)
· exfalso
have := ENNReal.toReal_mono ENNReal.zero_ne_top hp.elim
- norm_num at this
+ set_option tactic.skipAssignedInstances false in norm_num at this
· simp only [lp.norm_eq_ciSup, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
slow / slower
porting notes (#11084)
Classifies by adding issue number #11083 to porting notes claiming anything semantically equivalent to:
attribute
because it caused extremely slow tactic
"@@ -479,7 +479,7 @@ theorem eq_zero_iff_coeFn_eq_zero {f : lp E p} : f = 0 ↔ ⇑f = 0 := by
rw [lp.ext_iff, coeFn_zero]
#align lp.eq_zero_iff_coe_fn_eq_zero lp.eq_zero_iff_coeFn_eq_zero
--- porting note: this was very slow, so I squeezed the `simp` calls
+-- porting note (#11083): this was very slow, so I squeezed the `simp` calls
@[simp]
theorem norm_neg ⦃f : lp E p⦄ : ‖-f‖ = ‖f‖ := by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -504,7 +504,7 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
· cases isEmpty_or_nonempty α
· -- porting note (#10745): was `simp [lp.eq_zero' f]`
rw [lp.eq_zero' f]
- simp only [zero_add, norm_zero, le_refl] -- porting note: just `simp` was slow
+ simp only [zero_add, norm_zero, le_refl] -- porting note (#11083): just `simp` was slow
refine' (lp.isLUB_norm (f + g)).2 _
rintro x ⟨i, rfl⟩
refine' le_trans _ (add_mem_upperBounds_add
@@ -230,7 +230,7 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
refine' .of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
· intro; positivity
· refine' (Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp.le).trans _
- dsimp only
+ dsimp only [C]
split_ifs with h
· simpa using NNReal.coe_le_coe.2 (NNReal.rpow_add_le_add_rpow ‖f i‖₊ ‖g i‖₊ hp.le h.le)
· let F : Fin 2 → ℝ≥0 := ![‖f i‖₊, ‖g i‖₊]
@@ -1060,12 +1060,12 @@ protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p
have hF : ∀ i ∉ s, F i = 0 := by
intro i hi
suffices ‖f i‖ ^ p.toReal - ‖f i - ite (i ∈ s) (f i) 0‖ ^ p.toReal = 0 by
- simpa only [coeFn_sum, lp.single_apply, coeFn_sub, Pi.sub_apply, Finset.sum_apply,
+ simpa only [F, coeFn_sum, lp.single_apply, coeFn_sub, Pi.sub_apply, Finset.sum_apply,
Finset.sum_dite_eq] using this
simp only [if_neg hi, sub_zero, sub_self]
have hF' : ∀ i ∈ s, F i = ‖f i‖ ^ p.toReal := by
intro i hi
- simp only [coeFn_sum, lp.single_apply, if_pos hi, sub_self, eq_self_iff_true, coeFn_sub,
+ simp only [F, coeFn_sum, lp.single_apply, if_pos hi, sub_self, eq_self_iff_true, coeFn_sub,
Pi.sub_apply, Finset.sum_apply, Finset.sum_dite_eq, sub_eq_self]
simp [Real.zero_rpow hp.ne']
have : HasSum F (∑ i in s, F i) := hasSum_sum_of_ne_finset_zero hF
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -1180,7 +1180,7 @@ theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Bornology.IsBounded (Set.ra
· apply memℓp_infty
use C
rintro _ ⟨a, rfl⟩
- refine' norm_apply_le_of_tendsto (eventually_of_forall hCF) hf a
+ exact norm_apply_le_of_tendsto (eventually_of_forall hCF) hf a
· apply memℓp_gen'
exact sum_rpow_le_of_tendsto hp.ne (eventually_of_forall hCF) hf
#align lp.mem_ℓp_of_tendsto lp.memℓp_of_tendsto
@@ -372,7 +372,7 @@ theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
rfl
#align lp.coe_fn_add lp.coeFn_add
--- porting note: removed `@[simp]` because `simp` can prove this
+-- porting note (#10618): removed `@[simp]` because `simp` can prove this
theorem coeFn_sum {ι : Type*} (f : ι → lp E p) (s : Finset ι) :
⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
simp
@@ -502,7 +502,7 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
add_le' := fun f g => by
rcases p.dichotomy with (rfl | hp')
· cases isEmpty_or_nonempty α
- · -- Porting note: was `simp [lp.eq_zero' f]`
+ · -- porting note (#10745): was `simp [lp.eq_zero' f]`
rw [lp.eq_zero' f]
simp only [zero_add, norm_zero, le_refl] -- porting note: just `simp` was slow
refine' (lp.isLUB_norm (f + g)).2 _
ℝ≥0
(#10589)
It happens often that we have p q : ℝ≥0
that are conjugate. So far, we only had a predicate for real numbers to be conjugate, which made dealing with ℝ≥0
conjugates clumsy.
This PR
NNReal.IsConjExponent
, NNReal.conjExponent
Real.IsConjugateExponent
, Real.conjugateExponent
to Real.IsConjExponent
, Real.conjExponent
Real
and NNReal
versionsFrom LeanAPAP
@@ -526,10 +526,10 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
apply norm_add_le
eq_zero_of_map_eq_zero' := fun f => norm_eq_zero_iff.1 }
--- TODO: define an `ENNReal` version of `IsConjugateExponent`, and then express this inequality
+-- TODO: define an `ENNReal` version of `IsConjExponent`, and then express this inequality
-- in a better version which also covers the case `p = 1, q = ∞`.
/-- Hölder inequality -/
-protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
+protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal)
(f : lp E p) (g : lp E q) :
(Summable fun i => ‖f i‖ * ‖g i‖) ∧ ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ := by
have hf₁ : ∀ i, 0 ≤ ‖f i‖ := fun i => norm_nonneg _
@@ -542,12 +542,12 @@ protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConj
exact ⟨hC.summable, hC'⟩
#align lp.tsum_mul_le_mul_norm lp.tsum_mul_le_mul_norm
-protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
+protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal)
(f : lp E p) (g : lp E q) : Summable fun i => ‖f i‖ * ‖g i‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).1
#align lp.summable_mul lp.summable_mul
-protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
+protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjExponent q.toReal)
(f : lp E p) (g : lp E q) : ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).2
#align lp.tsum_mul_le_mul_norm' lp.tsum_mul_le_mul_norm'
Real.ciSup_empty
(#10217)
and a few more to clarify that they are about IsEmpty
, not about ∅
. Make a few more lemmas simp.`
@@ -433,7 +433,7 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ := by
· simp [lp.norm_eq_card_dsupport f]
· cases' isEmpty_or_nonempty α with _i _i
· rw [lp.norm_eq_ciSup]
- simp [Real.ciSup_empty]
+ simp [Real.iSup_of_isEmpty]
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
· rw [lp.norm_eq_tsum_rpow hp f]
@[inherit_doc]
on notations (#9942)
Make all the notations that unambiguously should inherit the docstring of their definition actually inherit it.
Also write a few docstrings by hand. I only wrote the ones I was competent to write and which I was sure of. Some docstrings come from mathlib3 as they were lost during the early port.
This PR is only intended as a first pass There are many more docstrings to add.
@@ -320,8 +320,8 @@ def lp (E : α → Type*) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) : A
neg_mem' := Memℓp.neg
#align lp lp
-scoped[lp] notation "ℓ^∞(" ι ", " E ")" => lp (fun i : ι => E) ∞
-scoped[lp] notation "ℓ^∞(" ι ")" => lp (fun i : ι => ℝ) ∞
+@[inherit_doc] scoped[lp] notation "ℓ^∞(" ι ", " E ")" => lp (fun i : ι => E) ∞
+@[inherit_doc] scoped[lp] notation "ℓ^∞(" ι ")" => lp (fun i : ι => ℝ) ∞
namespace lp
@@ -6,6 +6,7 @@ Authors: Heather Macbeth
import Mathlib.Analysis.MeanInequalities
import Mathlib.Analysis.MeanInequalitiesPow
import Mathlib.Analysis.SpecialFunctions.Pow.Continuity
+import Mathlib.Data.Set.Image
import Mathlib.Topology.Algebra.Order.LiminfLimsup
#align_import analysis.normed_space.lp_space from "leanprover-community/mathlib"@"de83b43717abe353f425855fcf0cedf9ea0fe8a4"
After this PR, no file in Geometry
uses autoImplicit, and in Analysis
it's scoped to six declarations.
@@ -55,8 +55,6 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
-/
-set_option autoImplicit true
-
noncomputable section
open scoped NNReal ENNReal BigOperators Function
@@ -1222,6 +1220,7 @@ end lp
section Lipschitz
open ENNReal lp
+variable {ι : Type*}
lemma LipschitzWith.uniformly_bounded [PseudoMetricSpace α] (g : α → ι → ℝ) {K : ℝ≥0}
(hg : ∀ i, LipschitzWith K (g · i)) (a₀ : α) (hga₀b : Memℓp (g a₀) ∞) (a : α) :
rpow_nonneg_of_nonneg
to rpow_nonneg
(#9518)
This better matches other lemma names.
From LeanAPAP
@@ -121,7 +121,7 @@ theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i i
use ⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal
apply hasSum_of_isLUB_of_nonneg
· intro b
- exact Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ exact Real.rpow_nonneg (norm_nonneg _) _
apply isLUB_ciSup
use C
rintro - ⟨s, rfl⟩
@@ -206,7 +206,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
exact H.subset fun i hi => Real.one_le_rpow hi hq.le
· show ∀ i, ¬|‖f i‖ ^ p.toReal| ≤ ‖f i‖ ^ q.toReal → 1 ≤ ‖f i‖
intro i hi
- have : 0 ≤ ‖f i‖ ^ p.toReal := Real.rpow_nonneg_of_nonneg (norm_nonneg _) p.toReal
+ have : 0 ≤ ‖f i‖ ^ p.toReal := Real.rpow_nonneg (norm_nonneg _) p.toReal
simp only [abs_of_nonneg, this] at hi
contrapose! hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
@@ -438,8 +438,8 @@ theorem norm_nonneg' (f : lp E p) : 0 ≤ ‖f‖ := by
inhabit α
exact (norm_nonneg (f default)).trans ((lp.isLUB_norm f).1 ⟨default, rfl⟩)
· rw [lp.norm_eq_tsum_rpow hp f]
- refine' Real.rpow_nonneg_of_nonneg (tsum_nonneg _) _
- exact fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ refine' Real.rpow_nonneg (tsum_nonneg _) _
+ exact fun i => Real.rpow_nonneg (norm_nonneg _) _
#align lp.norm_nonneg' lp.norm_nonneg'
@[simp]
@@ -468,7 +468,7 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
· have hf : HasSum (fun i : α => ‖f i‖ ^ p.toReal) 0 := by
have := lp.hasSum_norm hp f
rwa [h, Real.zero_rpow hp.ne'] at this
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg (norm_nonneg _) _
rw [hasSum_zero_iff_of_nonneg this] at hf
ext i
have : f i = 0 ∧ p.toReal ≠ 0 := by
@@ -560,7 +560,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
· haveI : Nonempty α := ⟨i⟩
exact (isLUB_norm f).1 ⟨i, rfl⟩
have hp'' : 0 < p.toReal := ENNReal.toReal_pos hp hp'
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg (norm_nonneg _) _
rw [← Real.rpow_le_rpow_iff (norm_nonneg _) (norm_nonneg' _) hp'']
convert le_hasSum (hasSum_norm hp'' f) i fun i _ => this i
#align lp.norm_apply_le_norm lp.norm_apply_le_norm
@@ -568,7 +568,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
∑ i in s, ‖f i‖ ^ p.toReal ≤ ‖f‖ ^ p.toReal := by
rw [lp.norm_rpow_eq_tsum hp f]
- have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg (norm_nonneg _) _
refine' sum_le_tsum _ (fun i _ => this i) _
exact (lp.memℓp f).summable hp
#align lp.sum_rpow_le_norm_rpow lp.sum_rpow_le_norm_rpow
Set.image2
etc (#9275)
Set.image2
to use ∃ a ∈ s, ∃ b ∈ t, f a b = c
instead of ∃ a b, a ∈ s ∧ b ∈ t ∧ f a b = c
.Set.seq
as Set.image2
. The new definition is equal to the old one but rw [Set.seq]
gives a different result.Filter.map₂
to use ∃ u ∈ f, ∃ v ∈ g, image2 m u v ⊆ s
instead of ∃ u v, u ∈ f ∧ v ∈ g ∧ ...
Set.mem_image2
, Finset.mem_image₂
, Set.mem_mul
, Finset.mem_div
etcThe two reasons to make the change are:
∃ a ∈ s, ∃ b ∈ t, _
is a simp
-normal form, and@@ -509,7 +509,7 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
refine' (lp.isLUB_norm (f + g)).2 _
rintro x ⟨i, rfl⟩
refine' le_trans _ (add_mem_upperBounds_add
- (lp.isLUB_norm f).1 (lp.isLUB_norm g).1 ⟨_, _, ⟨i, rfl⟩, ⟨i, rfl⟩, rfl⟩)
+ (lp.isLUB_norm f).1 (lp.isLUB_norm g).1 ⟨_, ⟨i, rfl⟩, _, ⟨i, rfl⟩, rfl⟩)
exact norm_add_le (f i) (g i)
· have hp'' : 0 < p.toReal := zero_lt_one.trans_le hp'
have hf₁ : ∀ i, 0 ≤ ‖f i‖ := fun i => norm_nonneg _
@@ -185,7 +185,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
· simp [hi]
· exact (hC ⟨i, hi, rfl⟩).trans (le_max_right _ _)
· apply memℓp_gen
- have : ∀ (i) (_ : i ∉ hfq.finite_dsupport.toFinset), ‖f i‖ ^ p.toReal = 0 := by
+ have : ∀ i ∉ hfq.finite_dsupport.toFinset, ‖f i‖ ^ p.toReal = 0 := by
intro i hi
have : f i = 0 := by simpa using hi
simp [this, Real.zero_rpow hp.ne']
@@ -1039,8 +1039,7 @@ protected theorem norm_sum_single (hp : 0 < p.toReal) (f : ∀ i, E i) (s : Fins
‖∑ i in s, lp.single p i (f i)‖ ^ p.toReal = ∑ i in s, ‖f i‖ ^ p.toReal := by
refine' (hasSum_norm hp (∑ i in s, lp.single p i (f i))).unique _
simp only [lp.single_apply, coeFn_sum, Finset.sum_apply, Finset.sum_dite_eq]
- have h : ∀ (i) (_ : i ∉ s), ‖ite (i ∈ s) (f i) 0‖ ^ p.toReal = 0 := by
- intro i hi
+ have h : ∀ i ∉ s, ‖ite (i ∈ s) (f i) 0‖ ^ p.toReal = 0 := fun i hi ↦ by
simp [if_neg hi, Real.zero_rpow hp.ne']
have h' : ∀ i ∈ s, ‖f i‖ ^ p.toReal = ‖ite (i ∈ s) (f i) 0‖ ^ p.toReal := by
intro i hi
∃ x ∈ s, _
instead of ∃ (x) (_ : x ∈ s), _
(#9184)
Search for [∀∃].*(_
and manually replace some occurrences with more readable versions.
In case of ∀
, the new expressions are defeq to the old ones.
In case of ∃
, they differ by exists_prop
.
In some rare cases, golf proofs that needed fixing.
@@ -1059,7 +1059,7 @@ protected theorem norm_sub_norm_compl_sub_single (hp : 0 < p.toReal) (f : lp E p
∑ i in s, ‖f i‖ ^ p.toReal := by
refine' ((hasSum_norm hp f).sub (hasSum_norm hp (f - ∑ i in s, lp.single p i (f i)))).unique _
let F : α → ℝ := fun i => ‖f i‖ ^ p.toReal - ‖(f - ∑ i in s, lp.single p i (f i)) i‖ ^ p.toReal
- have hF : ∀ (i) (_ : i ∉ s), F i = 0 := by
+ have hF : ∀ i ∉ s, F i = 0 := by
intro i hi
suffices ‖f i‖ ^ p.toReal - ‖f i - ite (i ∈ s) (f i) 0‖ ^ p.toReal = 0 by
simpa only [coeFn_sum, lp.single_apply, coeFn_sub, Pi.sub_apply, Finset.sum_apply,
Following on from previous gcongr
golfing PRs #4702 and #4784.
This is a replacement for #7901: this round of golfs, first introduced there, there exposed some performance issues in gcongr
, hopefully fixed by #8731, and I am opening a new PR so that the performance can be checked against current master rather than master at the time of #7901.
@@ -195,7 +195,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
obtain ⟨A, hA⟩ := (hfq.summable hq).tendsto_cofinite_zero.bddAbove_range_of_cofinite
use A ^ q.toReal⁻¹
rintro x ⟨i, rfl⟩
- have : 0 ≤ ‖f i‖ ^ q.toReal := Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
+ have : 0 ≤ ‖f i‖ ^ q.toReal := by positivity
simpa [← Real.rpow_mul, mul_inv_cancel hq.ne'] using
Real.rpow_le_rpow this (hA ⟨i, rfl⟩) (inv_nonneg.mpr hq.le)
· apply memℓp_gen
@@ -268,14 +268,16 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
refine' memℓp_infty ⟨‖c‖ * A, _⟩
rintro a ⟨i, rfl⟩
refine' (norm_smul_le _ _).trans _
- exact mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c)
+ gcongr
+ exact hA ⟨i, rfl⟩
· apply memℓp_gen
have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.toReal) : ℝ)
simp_rw [← coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul, NNReal.summable_coe,
← NNReal.mul_rpow] at this ⊢
refine' NNReal.summable_of_le _ this
intro i
- exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
+ gcongr
+ apply nnnorm_smul_le
#align mem_ℓp.const_smul Memℓp.const_smul
theorem const_mul {f : α → 𝕜} (hf : Memℓp f p) (c : 𝕜) : Memℓp (fun x => c * f x) p :=
@@ -418,7 +420,7 @@ theorem norm_rpow_eq_tsum (hp : 0 < p.toReal) (f : lp E p) :
intro i
calc
(0 : ℝ) = (0 : ℝ) ^ p.toReal := by rw [Real.zero_rpow hp.ne']
- _ ≤ _ := Real.rpow_le_rpow rfl.le (norm_nonneg (f i)) hp.le
+ _ ≤ _ := by gcongr; apply norm_nonneg
#align lp.norm_rpow_eq_tsum lp.norm_rpow_eq_tsum
theorem hasSum_norm (hp : 0 < p.toReal) (f : lp E p) :
@@ -521,7 +523,8 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
rw [← Real.rpow_le_rpow_iff (norm_nonneg' (f + g)) hC₁ hp'']
refine' hasSum_le _ (lp.hasSum_norm hp'' (f + g)) hCfg
intro i
- exact Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp''.le
+ gcongr
+ apply norm_add_le
eq_zero_of_map_eq_zero' := fun f => norm_eq_zero_iff.1 }
-- TODO: define an `ENNReal` version of `IsConjugateExponent`, and then express this inequality
@@ -684,7 +687,8 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
rw [← NNReal.mul_rpow]
-- Porting note: added
rw [lp.coeFn_smul, Pi.smul_apply]
- exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
+ gcongr
+ apply nnnorm_smul_le
#align lp.norm_const_smul_le lp.norm_const_smul_le
instance [Fact (1 ≤ p)] : BoundedSMul 𝕜 (lp E p) :=
@@ -1151,7 +1155,7 @@ theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (h
refine' hCF.mono _
intro k hCFk
refine' (lp.sum_rpow_le_norm_rpow hp'' (F k) s).trans _
- exact Real.rpow_le_rpow (norm_nonneg _) hCFk hp''.le
+ gcongr
#align lp.sum_rpow_le_of_tendsto lp.sum_rpow_le_of_tendsto
/-- "Semicontinuity of the `lp` norm": If all sufficiently large elements of a sequence in `lp E p`
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -57,9 +57,6 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
set_option autoImplicit true
-
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-
noncomputable section
open scoped NNReal ENNReal BigOperators Function
summable_of_norm_bounded
-> Summable.of_norm_bounded
;summable_of_norm_bounded_eventually
-> Summable.of_norm_bounded_eventually
;summable_of_nnnorm_bounded
-> Summable.of_nnnorm_bounded
;summable_of_summable_norm
-> Summable.of_norm
;summable_of_summable_nnnorm
-> Summable.of_nnnorm
;Summable.of_norm_bounded_eventually_nat
Summable.norm
@@ -203,7 +203,7 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
Real.rpow_le_rpow this (hA ⟨i, rfl⟩) (inv_nonneg.mpr hq.le)
· apply memℓp_gen
have hf' := hfq.summable hq
- refine' summable_of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ { i | 1 ≤ ‖f i‖ } _ _ _)
+ refine' .of_norm_bounded_eventually _ hf' (@Set.Finite.subset _ { i | 1 ≤ ‖f i‖ } _ _ _)
· have H : { x : α | 1 ≤ ‖f x‖ ^ q.toReal }.Finite := by
simpa using eventually_lt_of_tendsto_lt (by norm_num) hf'.tendsto_cofinite_zero
exact H.subset fun i hi => Real.one_le_rpow hi hq.le
@@ -231,9 +231,8 @@ theorem add {f g : ∀ i, E i} (hf : Memℓp f p) (hg : Memℓp g p) : Memℓp (
exact le_trans (norm_add_le _ _) (add_le_add (hA ⟨i, rfl⟩) (hB ⟨i, rfl⟩))
apply memℓp_gen
let C : ℝ := if p.toReal < 1 then 1 else (2 : ℝ) ^ (p.toReal - 1)
- refine'
- summable_of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
- · exact fun b => Real.rpow_nonneg_of_nonneg (norm_nonneg (f b + g b)) p.toReal
+ refine' .of_nonneg_of_le _ (fun i => _) (((hf.summable hp).add (hg.summable hp)).mul_left C)
+ · intro; positivity
· refine' (Real.rpow_le_rpow (norm_nonneg _) (norm_add_le _ _) hp.le).trans _
dsimp only
split_ifs with h
attribute [simp] ... in
-> attribute [local simp] ... in
(#7678)
Mathlib.Logic.Unique contains the line attribute [simp] eq_iff_true_of_subsingleton in ...
:
Despite what the in
part may imply, this adds the lemma to the simp set "globally", including for downstream files; it is likely that attribute [local simp] eq_iff_true_of_subsingleton in ...
was meant instead (or maybe scoped simp
, but I think "scoped" refers to the current namespace). Indeed, the relevant lemma is not marked with @[simp]
for possible slowness: https://github.com/leanprover/std4/blob/846e9e1d6bb534774d1acd2dc430e70987da3c18/Std/Logic.lean#L749. Adding it to the simp set causes the example at https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Regression.20in.20simp to slow down.
This PR changes this and fixes the relevant downstream simp
s. There was also one ocurrence of attribute [simp] FullSubcategory.comp_def FullSubcategory.id_def in
in Mathlib.CategoryTheory.Monoidal.Subcategory but that was much easier to fix.
@@ -462,7 +462,7 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
have : (¬f i = 0) = False := congr_fun this i
tauto
· cases' isEmpty_or_nonempty α with _i _i
- · simp
+ · simp [eq_iff_true_of_subsingleton]
have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
ext i
have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
@@ -14,7 +14,7 @@ import Mathlib.Topology.Algebra.Order.LiminfLimsup
# ℓp space
This file describes properties of elements `f` of a pi-type `∀ i, E i` with finite "norm",
-defined for `p:ℝ≥0∞` as the size of the support of `f` if `p=0`, `(∑' a, ‖f a‖^p) ^ (1/p)` for
+defined for `p : ℝ≥0∞` as the size of the support of `f` if `p=0`, `(∑' a, ‖f a‖^p) ^ (1/p)` for
`0 < p < ∞` and `⨆ a, ‖f a‖` for `p=∞`.
The Prop-valued `Memℓp f p` states that a function `f : ∀ i, E i` has finite norm according
Two pairs of the form foo
and foo'
, where foo'
is the simp lemma (and hence used in many simp only
s) and foo
is not used at all.
Swap the primes, so that when it is time (now!) to upstream the lemma we actually use, it doesn't need to have a prime...
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -670,7 +670,7 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
refine' hcf.right _
have := hfc.left
simp_rw [mem_upperBounds, Set.mem_range,
- forall_exists_index, forall_apply_eq_imp_iff'] at this ⊢
+ forall_exists_index, forall_apply_eq_imp_iff] at this ⊢
intro a
exact (norm_smul_le _ _).trans (this a)
· letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
Metric.Bounded
(#7240)
Use Bornology.IsBounded
instead.
@@ -1174,7 +1174,7 @@ theorem norm_le_of_tendsto {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l,
#align lp.norm_le_of_tendsto lp.norm_le_of_tendsto
/-- If `f` is the pointwise limit of a bounded sequence in `lp E p`, then `f` is in `lp E p`. -/
-theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Metric.Bounded (Set.range F)) {f : ∀ a, E a}
+theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Bornology.IsBounded (Set.range F)) {f : ∀ a, E a}
(hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) : Memℓp f p := by
obtain ⟨C, _, hCF'⟩ := hF.exists_pos_norm_le
have hCF : ∀ k, ‖F k‖ ≤ C := fun k => hCF' _ ⟨k, rfl⟩
@@ -1212,7 +1212,7 @@ instance completeSpace : CompleteSpace (lp E p) :=
obtain ⟨f, hf⟩ := cauchySeq_tendsto_of_complete
((uniformContinuous_coe (p := p)).comp_cauchySeq hF)
-- Since the Cauchy sequence is bounded, its pointwise limit `f` is in `lp E p`.
- have hf' : Memℓp f p := memℓp_of_tendsto hF.bounded_range hf
+ have hf' : Memℓp f p := memℓp_of_tendsto hF.isBounded_range hf
-- And therefore `f` is its limit in the `lp E p` topology as well as pointwise.
exact ⟨⟨f, hf'⟩, tendsto_lp_of_tendsto_pi hF hf⟩)
@@ -816,16 +816,16 @@ instance nonUnitalNormedRing : NonUnitalNormedRing (lp B ∞) :=
mul_le_mul (lp.norm_apply_le_norm ENNReal.top_ne_zero f i)
(lp.norm_apply_le_norm ENNReal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _) }
--- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
+-- we also want a `NonUnitalNormedCommRing` instance, but this has to wait for mathlib3 #13719
instance infty_isScalarTower {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, IsScalarTower 𝕜 (B i) (B i)] : IsScalarTower 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_assoc (N := ∀ i, B i) (α := ∀ i, B i) r (⇑f) (⇑g)⟩
#align lp.infty_is_scalar_tower lp.infty_isScalarTower
-instance infty_sMulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
+instance infty_smulCommClass {𝕜} [NormedRing 𝕜] [∀ i, Module 𝕜 (B i)] [∀ i, BoundedSMul 𝕜 (B i)]
[∀ i, SMulCommClass 𝕜 (B i) (B i)] : SMulCommClass 𝕜 (lp B ∞) (lp B ∞) :=
⟨fun r f g => lp.ext <| smul_comm (N := ∀ i, B i) (α := ∀ i, B i) r (⇑f) (⇑g)⟩
-#align lp.infty_smul_comm_class lp.infty_sMulCommClass
+#align lp.infty_smul_comm_class lp.infty_smulCommClass
section StarRing
Also rename dimH_image_le_of_locally_lipschitz_on
to dimH_image_le_of_locally_lipschitzOn
.
@@ -1253,7 +1253,7 @@ theorem LipschitzOnWith.coordinate [PseudoMetricSpace α] (f : α → ℓ^∞(ι
theorem LipschitzWith.coordinate [PseudoMetricSpace α] {f : α → ℓ^∞(ι)} (K : ℝ≥0) :
LipschitzWith K f ↔ ∀ i : ι, LipschitzWith K (fun a : α ↦ f a i) := by
- simp_rw [← lipschitz_on_univ]
+ simp_rw [← lipschitzOn_univ]
apply LipschitzOnWith.coordinate
end Lipschitz
The main reasons is that having h : 0 < denom
in the context should suffice for field_simp
to do its job, without the need to manually pass h.ne
or similar.
Quite a few have := … ≠ 0
could be dropped, and some field_simp
calls no longer need explicit arguments; this is promising.
This does break some proofs where field_simp
was not used as a closing tactic, and it now
shuffles terms around a bit different. These were fixed. Using field_simp
in the middle of a proof seems rather fragile anyways.
As a drive-by contribution, positivity
now knows about π > 0
.
fixes: #4835
Co-authored-by: Matthew Ballard <matt@mrb.email>
@@ -417,7 +417,7 @@ theorem norm_eq_tsum_rpow (hp : 0 < p.toReal) (f : lp E p) :
theorem norm_rpow_eq_tsum (hp : 0 < p.toReal) (f : lp E p) :
‖f‖ ^ p.toReal = ∑' i, ‖f i‖ ^ p.toReal := by
rw [norm_eq_tsum_rpow hp, ← Real.rpow_mul]
- · field_simp [hp.ne']
+ · field_simp
apply tsum_nonneg
intro i
calc
Autoimplicits are highly controversial and also defeat the performance-improving work in #6474.
The intent of this PR is to make autoImplicit
opt-in on a per-file basis, by disabling it in the lakefile and enabling it again with set_option autoImplicit true
in the few files that rely on it.
That also keeps this PR small, as opposed to attempting to "fix" files to not need it any more.
I claim that many of the uses of autoImplicit
in these files are accidental; situations such as:
variables
are in scope, but pasting the lemma in the wrong sectionHaving set_option autoImplicit false
as the default prevents these types of mistake being made in the 90% of files where autoImplicit
s are not used at all, and causes them to be caught by CI during review.
I think there were various points during the port where we encouraged porters to delete the universes u v
lines; I think having autoparams for universe variables only would cover a lot of the cases we actually use them, while avoiding any real shortcomings.
A Zulip poll (after combining overlapping votes accordingly) was in favor of this change with 5:5:18
as the no:dontcare:yes
vote ratio.
While this PR was being reviewed, a handful of files gained some more likely-accidental autoImplicits. In these places, set_option autoImplicit true
has been placed locally within a section, rather than at the top of the file.
@@ -55,6 +55,8 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
-/
+set_option autoImplicit true
+
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -62,7 +62,7 @@ noncomputable section
open scoped NNReal ENNReal BigOperators Function
-variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddCommGroup (E i)]
+variable {α : Type*} {E : α → Type*} {p q : ℝ≥0∞} [∀ i, NormedAddCommGroup (E i)]
/-!
### `Memℓp` predicate
@@ -259,7 +259,7 @@ theorem finset_sum {ι} (s : Finset ι) {f : ι → ∀ i, E i} (hf : ∀ i ∈
section BoundedSMul
-variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
+variable {𝕜 : Type*} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c • f) p := by
rcases p.trichotomy with (rfl | rfl | hp)
@@ -303,7 +303,7 @@ We choose to deal with this issue by making a type synonym for `∀ i, E i` rath
subgroup itself, because this allows all the spaces `lp E p` (for varying `p`) to be subgroups of
the same ambient group, which permits lemma statements like `lp.monotone` (below). -/
@[nolint unusedArguments]
-def PreLp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] : Type _ :=
+def PreLp (E : α → Type*) [∀ i, NormedAddCommGroup (E i)] : Type _ :=
∀ i, E i --deriving AddCommGroup
#align pre_lp PreLp
@@ -314,7 +314,7 @@ instance PreLp.unique [IsEmpty α] : Unique (PreLp E) :=
#align pre_lp.unique PreLp.unique
/-- lp space -/
-def lp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) : AddSubgroup (PreLp E) where
+def lp (E : α → Type*) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) : AddSubgroup (PreLp E) where
carrier := { f | Memℓp f p }
zero_mem' := zero_memℓp
add_mem' := Memℓp.add
@@ -374,7 +374,7 @@ theorem coeFn_add (f g : lp E p) : ⇑(f + g) = f + g :=
#align lp.coe_fn_add lp.coeFn_add
-- porting note: removed `@[simp]` because `simp` can prove this
-theorem coeFn_sum {ι : Type _} (f : ι → lp E p) (s : Finset ι) :
+theorem coeFn_sum {ι : Type*} (f : ι → lp E p) (s : Finset ι) :
⇑(∑ i in s, f i) = ∑ i in s, ⇑(f i) := by
simp
#align lp.coe_fn_sum lp.coeFn_sum
@@ -601,7 +601,7 @@ end ComparePointwise
section BoundedSMul
-variable {𝕜 : Type _} {𝕜' : Type _}
+variable {𝕜 : Type*} {𝕜' : Type*}
variable [NormedRing 𝕜] [NormedRing 𝕜']
@@ -696,7 +696,7 @@ end BoundedSMul
section DivisionRing
-variable {𝕜 : Type _}
+variable {𝕜 : Type*}
variable [NormedDivisionRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
@@ -712,7 +712,7 @@ end DivisionRing
section NormedSpace
-variable {𝕜 : Type _} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
+variable {𝕜 : Type*} [NormedField 𝕜] [∀ i, NormedSpace 𝕜 (E i)]
instance instNormedSpace [Fact (1 ≤ p)] : NormedSpace 𝕜 (lp E p) where
norm_smul_le c f := norm_smul_le c f
@@ -766,7 +766,7 @@ instance [hp : Fact (1 ≤ p)] : NormedStarGroup (lp E p) where
· simp only [lp.norm_eq_ciSup, lp.star_apply, norm_star]
· simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star]
-variable {𝕜 : Type _} [Star 𝕜] [NormedRing 𝕜]
+variable {𝕜 : Type*} [Star 𝕜] [NormedRing 𝕜]
variable [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)] [∀ i, StarModule 𝕜 (E i)]
@@ -777,7 +777,7 @@ end NormedStarGroup
section NonUnitalNormedRing
-variable {I : Type _} {B : I → Type _} [∀ i, NonUnitalNormedRing (B i)]
+variable {I : Type*} {B : I → Type*} [∀ i, NonUnitalNormedRing (B i)]
theorem _root_.Memℓp.infty_mul {f g : ∀ i, B i} (hf : Memℓp f ∞) (hg : Memℓp g ∞) :
Memℓp (f * g) ∞ := by
@@ -855,7 +855,7 @@ end NonUnitalNormedRing
section NormedRing
-variable {I : Type _} {B : I → Type _} [∀ i, NormedRing (B i)]
+variable {I : Type*} {B : I → Type*} [∀ i, NormedRing (B i)]
instance _root_.PreLp.ring : Ring (PreLp B) :=
Pi.ring
@@ -927,7 +927,7 @@ end NormedRing
section NormedCommRing
-variable {I : Type _} {B : I → Type _} [∀ i, NormedCommRing (B i)] [∀ i, NormOneClass (B i)]
+variable {I : Type*} {B : I → Type*} [∀ i, NormedCommRing (B i)] [∀ i, NormOneClass (B i)]
instance inftyCommRing : CommRing (lp B ∞) :=
{ lp.inftyRing with
@@ -942,7 +942,7 @@ end NormedCommRing
section Algebra
-variable {I : Type _} {𝕜 : Type _} {B : I → Type _}
+variable {I : Type*} {𝕜 : Type*} {B : I → Type*}
variable [NormedField 𝕜] [∀ i, NormedRing (B i)] [∀ i, NormedAlgebra 𝕜 (B i)]
@@ -982,7 +982,7 @@ end Algebra
section Single
-variable {𝕜 : Type _} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
+variable {𝕜 : Type*} [NormedRing 𝕜] [∀ i, Module 𝕜 (E i)] [∀ i, BoundedSMul 𝕜 (E i)]
variable [DecidableEq α]
@@ -1125,7 +1125,7 @@ theorem uniformContinuous_coe [_i : Fact (1 ≤ p)] :
exact this.trans_lt hfg
#align lp.uniform_continuous_coe lp.uniformContinuous_coe
-variable {ι : Type _} {l : Filter ι} [Filter.NeBot l]
+variable {ι : Type*} {l : Filter ι} [Filter.NeBot l]
theorem norm_apply_le_of_tendsto {C : ℝ} {F : ι → lp E ∞} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C)
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (a : α) : ‖f a‖ ≤ C := by
@@ -56,7 +56,7 @@ say that `‖-f‖ = ‖f‖`, instead of the non-working `f.norm_neg`.
-/
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
noncomputable section
@@ -2,17 +2,14 @@
Copyright (c) 2021 Heather Macbeth. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Heather Macbeth
-
-! This file was ported from Lean 3 source module analysis.normed_space.lp_space
-! leanprover-community/mathlib commit de83b43717abe353f425855fcf0cedf9ea0fe8a4
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.MeanInequalities
import Mathlib.Analysis.MeanInequalitiesPow
import Mathlib.Analysis.SpecialFunctions.Pow.Continuity
import Mathlib.Topology.Algebra.Order.LiminfLimsup
+#align_import analysis.normed_space.lp_space from "leanprover-community/mathlib"@"de83b43717abe353f425855fcf0cedf9ea0fe8a4"
+
/-!
# ℓp space
This PR is the result of running
find . -type f -name "*.lean" -exec sed -i -E 's/^( +)\. /\1· /' {} \;
find . -type f -name "*.lean" -exec sed -i -E 'N;s/^( +·)\n +(.*)$/\1 \2/;P;D' {} \;
which firstly replaces .
focusing dots with ·
and secondly removes isolated instances of such dots, unifying them with the following line. A new rule is placed in the style linter to verify this.
@@ -1236,8 +1236,8 @@ lemma LipschitzWith.uniformly_bounded [PseudoMetricSpace α] (g : α → ι →
_ ≤ |g a i - g a₀ i| + |g a₀ i| := abs_add _ _
_ ≤ ↑K * dist a a₀ + M := by
gcongr
- . exact lipschitzWith_iff_dist_le_mul.1 (hg i) a a₀
- . exact hM ⟨i, rfl⟩
+ · exact lipschitzWith_iff_dist_le_mul.1 (hg i) a a₀
+ · exact hM ⟨i, rfl⟩
theorem LipschitzOnWith.coordinate [PseudoMetricSpace α] (f : α → ℓ^∞(ι)) (s : Set α) (K : ℝ≥0) :
LipschitzOnWith K f s ↔ ∀ i : ι, LipschitzOnWith K (fun a : α ↦ f a i) s := by
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -119,7 +119,7 @@ theorem memℓp_gen {f : ∀ i, E i} (hf : Summable fun i => ‖f i‖ ^ p.toRea
exact (memℓp_gen_iff hp).2 hf
#align mem_ℓp_gen memℓp_gen
-theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, (∑ i in s, ‖f i‖ ^ p.toReal) ≤ C) :
+theorem memℓp_gen' {C : ℝ} {f : ∀ i, E i} (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C) :
Memℓp f p := by
apply memℓp_gen
use ⨆ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal
@@ -534,7 +534,7 @@ instance normedAddCommGroup [hp : Fact (1 ≤ p)] : NormedAddCommGroup (lp E p)
/-- Hölder inequality -/
protected theorem tsum_mul_le_mul_norm {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
(f : lp E p) (g : lp E q) :
- (Summable fun i => ‖f i‖ * ‖g i‖) ∧ (∑' i, ‖f i‖ * ‖g i‖) ≤ ‖f‖ * ‖g‖ := by
+ (Summable fun i => ‖f i‖ * ‖g i‖) ∧ ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ := by
have hf₁ : ∀ i, 0 ≤ ‖f i‖ := fun i => norm_nonneg _
have hg₁ : ∀ i, 0 ≤ ‖g i‖ := fun i => norm_nonneg _
have hf₂ := lp.hasSum_norm hpq.pos f
@@ -551,7 +551,7 @@ protected theorem summable_mul {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExp
#align lp.summable_mul lp.summable_mul
protected theorem tsum_mul_le_mul_norm' {p q : ℝ≥0∞} (hpq : p.toReal.IsConjugateExponent q.toReal)
- (f : lp E p) (g : lp E q) : (∑' i, ‖f i‖ * ‖g i‖) ≤ ‖f‖ * ‖g‖ :=
+ (f : lp E p) (g : lp E q) : ∑' i, ‖f i‖ * ‖g i‖ ≤ ‖f‖ * ‖g‖ :=
(lp.tsum_mul_le_mul_norm hpq f g).2
#align lp.tsum_mul_le_mul_norm' lp.tsum_mul_le_mul_norm'
@@ -568,7 +568,7 @@ theorem norm_apply_le_norm (hp : p ≠ 0) (f : lp E p) (i : α) : ‖f i‖ ≤
#align lp.norm_apply_le_norm lp.norm_apply_le_norm
theorem sum_rpow_le_norm_rpow (hp : 0 < p.toReal) (f : lp E p) (s : Finset α) :
- (∑ i in s, ‖f i‖ ^ p.toReal) ≤ ‖f‖ ^ p.toReal := by
+ ∑ i in s, ‖f i‖ ^ p.toReal ≤ ‖f‖ ^ p.toReal := by
rw [lp.norm_rpow_eq_tsum hp f]
have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
refine' sum_le_tsum _ (fun i _ => this i) _
@@ -590,13 +590,13 @@ theorem norm_le_of_forall_le {f : lp E ∞} {C : ℝ} (hC : 0 ≤ C) (hCf : ∀
#align lp.norm_le_of_forall_le lp.norm_le_of_forall_le
theorem norm_le_of_tsum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
- (hf : (∑' i, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal) : ‖f‖ ≤ C := by
+ (hf : ∑' i, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C := by
rw [← Real.rpow_le_rpow_iff (norm_nonneg' _) hC hp, norm_rpow_eq_tsum hp]
exact hf
#align lp.norm_le_of_tsum_le lp.norm_le_of_tsum_le
theorem norm_le_of_forall_sum_le (hp : 0 < p.toReal) {C : ℝ} (hC : 0 ≤ C) {f : lp E p}
- (hf : ∀ s : Finset α, (∑ i in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
+ (hf : ∀ s : Finset α, ∑ i in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal) : ‖f‖ ≤ C :=
norm_le_of_tsum_le hp hC (tsum_le_of_sum_le ((lp.memℓp f).summable hp) hf)
#align lp.norm_le_of_forall_sum_le lp.norm_le_of_forall_sum_le
@@ -1143,7 +1143,7 @@ variable [_i : Fact (1 ≤ p)]
theorem sum_rpow_le_of_tendsto (hp : p ≠ ∞) {C : ℝ} {F : ι → lp E p} (hCF : ∀ᶠ k in l, ‖F k‖ ≤ C)
{f : ∀ a, E a} (hf : Tendsto (id fun i => F i : ι → ∀ a, E a) l (𝓝 f)) (s : Finset α) :
- (∑ i : α in s, ‖f i‖ ^ p.toReal) ≤ C ^ p.toReal := by
+ ∑ i : α in s, ‖f i‖ ^ p.toReal ≤ C ^ p.toReal := by
have hp' : p ≠ 0 := (zero_lt_one.trans_le _i.elim).ne'
have hp'' : 0 < p.toReal := ENNReal.toReal_pos hp' hp
let G : (∀ a, E a) → ℝ := fun f => ∑ a in s, ‖f a‖ ^ p.toReal
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -277,7 +277,7 @@ theorem const_smul {f : ∀ i, E i} (hf : Memℓp f p) (c : 𝕜) : Memℓp (c
· apply memℓp_gen
have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.toReal) : ℝ)
simp_rw [← coe_nnnorm, ← NNReal.coe_rpow, ← NNReal.coe_mul, NNReal.summable_coe,
- ← NNReal.mul_rpow] at this⊢
+ ← NNReal.mul_rpow] at this ⊢
refine' NNReal.summable_of_le _ this
intro i
exact NNReal.rpow_le_rpow (nnnorm_smul_le _ _) ENNReal.toReal_nonneg
@@ -670,7 +670,8 @@ theorem norm_const_smul_le (hp : p ≠ 0) (c : 𝕜) (f : lp E p) : ‖c • f
-- TODO: some `IsLUB` API should make it a one-liner from here.
refine' hcf.right _
have := hfc.left
- simp_rw [mem_upperBounds, Set.mem_range, forall_exists_index, forall_apply_eq_imp_iff'] at this⊢
+ simp_rw [mem_upperBounds, Set.mem_range,
+ forall_exists_index, forall_apply_eq_imp_iff'] at this ⊢
intro a
exact (norm_smul_le _ _).trans (this a)
· letI inst : NNNorm (lp E p) := ⟨fun f => ⟨‖f‖, norm_nonneg' _⟩⟩
@@ -1086,13 +1087,13 @@ protected theorem hasSum_single [Fact (1 ≤ p)] (hp : p ≠ ⊤) (f : lp E p) :
have hp₀ : 0 < p := zero_lt_one.trans_le Fact.out
have hp' : 0 < p.toReal := ENNReal.toReal_pos hp₀.ne' hp
have := lp.hasSum_norm hp' f
- rw [HasSum, Metric.tendsto_nhds] at this⊢
+ rw [HasSum, Metric.tendsto_nhds] at this ⊢
intro ε hε
refine' (this _ (Real.rpow_pos_of_pos hε p.toReal)).mono _
intro s hs
rw [← Real.rpow_lt_rpow_iff dist_nonneg (le_of_lt hε) hp']
rw [dist_comm] at hs
- simp only [dist_eq_norm, Real.norm_eq_abs] at hs⊢
+ simp only [dist_eq_norm, Real.norm_eq_abs] at hs ⊢
have H : ‖(∑ i in s, lp.single p i (f i : E i)) - f‖ ^ p.toReal =
‖f‖ ^ p.toReal - ∑ i in s, ‖f i‖ ^ p.toReal := by
simpa only [coeFn_neg, Pi.neg_apply, lp.single_neg, Finset.sum_neg_distrib, neg_sub_neg,
A function f : α → ℓ^∞(ι, ℝ)
which is K
-Lipschitz on a subset s
admits a K
-Lipschitz extension to the whole space.
Co-authored-by: Ian Bunner <31334766+ian-bunner@users.noreply.github.com>
Co-authored-by: Chris Camano <53490775+chriscamano@users.noreply.github.com>
@@ -63,7 +63,7 @@ local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issu
noncomputable section
-open scoped NNReal ENNReal BigOperators
+open scoped NNReal ENNReal BigOperators Function
variable {α : Type _} {E : α → Type _} {p q : ℝ≥0∞} [∀ i, NormedAddCommGroup (E i)]
@@ -324,6 +324,9 @@ def lp (E : α → Type _) [∀ i, NormedAddCommGroup (E i)] (p : ℝ≥0∞) :
neg_mem' := Memℓp.neg
#align lp lp
+scoped[lp] notation "ℓ^∞(" ι ", " E ")" => lp (fun i : ι => E) ∞
+scoped[lp] notation "ℓ^∞(" ι ")" => lp (fun i : ι => ℝ) ∞
+
namespace lp
-- Porting note: was `Coe`
@@ -1216,3 +1219,41 @@ instance completeSpace : CompleteSpace (lp E p) :=
end Topology
end lp
+
+section Lipschitz
+
+open ENNReal lp
+
+lemma LipschitzWith.uniformly_bounded [PseudoMetricSpace α] (g : α → ι → ℝ) {K : ℝ≥0}
+ (hg : ∀ i, LipschitzWith K (g · i)) (a₀ : α) (hga₀b : Memℓp (g a₀) ∞) (a : α) :
+ Memℓp (g a) ∞ := by
+ rcases hga₀b with ⟨M, hM⟩
+ use ↑K * dist a a₀ + M
+ rintro - ⟨i, rfl⟩
+ calc
+ |g a i| = |g a i - g a₀ i + g a₀ i| := by simp
+ _ ≤ |g a i - g a₀ i| + |g a₀ i| := abs_add _ _
+ _ ≤ ↑K * dist a a₀ + M := by
+ gcongr
+ . exact lipschitzWith_iff_dist_le_mul.1 (hg i) a a₀
+ . exact hM ⟨i, rfl⟩
+
+theorem LipschitzOnWith.coordinate [PseudoMetricSpace α] (f : α → ℓ^∞(ι)) (s : Set α) (K : ℝ≥0) :
+ LipschitzOnWith K f s ↔ ∀ i : ι, LipschitzOnWith K (fun a : α ↦ f a i) s := by
+ simp_rw [lipschitzOnWith_iff_dist_le_mul]
+ constructor
+ · intro hfl i x hx y hy
+ calc
+ dist (f x i) (f y i) ≤ dist (f x) (f y) := lp.norm_apply_le_norm top_ne_zero (f x - f y) i
+ _ ≤ K * dist x y := hfl x hx y hy
+ · intro hgl x hx y hy
+ apply lp.norm_le_of_forall_le; positivity
+ intro i
+ apply hgl i x hx y hy
+
+theorem LipschitzWith.coordinate [PseudoMetricSpace α] {f : α → ℓ^∞(ι)} (K : ℝ≥0) :
+ LipschitzWith K f ↔ ∀ i : ι, LipschitzWith K (fun a : α ↦ f a i) := by
+ simp_rw [← lipschitz_on_univ]
+ apply LipschitzOnWith.coordinate
+
+end Lipschitz
cleanupAnnotations
to push_neg (#5082)
Expr
s now have an mdata
field. It seems that this gets in the way of push_neg
, as reported on Zulip.
The above seems to fix the reported errors.
Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>
@@ -213,7 +213,6 @@ theorem of_exponent_ge {p q : ℝ≥0∞} {f : ∀ i, E i} (hfq : Memℓp f q) (
have : 0 ≤ ‖f i‖ ^ p.toReal := Real.rpow_nonneg_of_nonneg (norm_nonneg _) p.toReal
simp only [abs_of_nonneg, this] at hi
contrapose! hi
- rw [not_le] at hi
exact Real.rpow_le_rpow_of_exponent_ge' (norm_nonneg _) hi.le hq.le hpq'
#align mem_ℓp.of_exponent_ge Memℓp.of_exponent_ge
@@ -1185,7 +1185,7 @@ theorem memℓp_of_tendsto {F : ι → lp E p} (hF : Metric.Bounded (Set.range F
exact sum_rpow_le_of_tendsto hp.ne (eventually_of_forall hCF) hf
#align lp.mem_ℓp_of_tendsto lp.memℓp_of_tendsto
-/-- If a sequence is Cauchy in the `lp E p` topology and pointwise convergent to a element `f` of
+/-- If a sequence is Cauchy in the `lp E p` topology and pointwise convergent to an element `f` of
`lp E p`, then it converges to `f` in the `lp E p` topology. -/
theorem tendsto_lp_of_tendsto_pi {F : ℕ → lp E p} (hF : CauchySeq F) {f : lp E p}
(hf : Tendsto (id fun i => F i : ℕ → ∀ a, E a) atTop (𝓝 f)) : Tendsto F atTop (𝓝 f) := by
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Alex J Best <alex.j.best@gmail.com>
@@ -456,14 +456,14 @@ theorem norm_zero : ‖(0 : lp E p)‖ = 0 := by
theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
rcases p.trichotomy with (rfl | rfl | hp)
- · ext; funext i
+ · ext i
have : { i : α | ¬f i = 0 } = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
have : (¬f i = 0) = False := congr_fun this i
tauto
· cases' isEmpty_or_nonempty α with _i _i
· simp
have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
- ext; funext i
+ ext i
have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
simpa using this
· have hf : HasSum (fun i : α => ‖f i‖ ^ p.toReal) 0 := by
@@ -471,7 +471,7 @@ theorem norm_eq_zero_iff {f : lp E p} : ‖f‖ = 0 ↔ f = 0 := by
rwa [h, Real.zero_rpow hp.ne'] at this
have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
rw [hasSum_zero_iff_of_nonneg this] at hf
- ext; funext i
+ ext i
have : f i = 0 ∧ p.toReal ≠ 0 := by
simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i
exact this.1
Notes Zulip thread :
CoeOut
and CoeFun
instances for lp E p
. This is consistent with mathlib3, but it seems strange and I would expect it to cause problems.PreLp E
with ∀ i, E i
in the aforementioned CoeOut
instance, for example) happening here which is rather convenient, but it's possible it may cause problems. (this abuse was also present in mathlib3)LpSpace
seems wrong semantically, but lpSpace
doesn't seem allowable by our file name conventions.Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Moritz Firsching <firsching@google.com> Co-authored-by: Jireh Loreaux <loreaujy@gmail.com>
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file