α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
⊢ f = 0
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
⊢ ‖f‖ = 0 ↔ f = 0
refine' ⟨fun h => _, by rintro rfl; exact norm_zero⟩
case inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
⊢ f = 0

case inr.inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
⊢ f = 0

case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
⊢ f = 0
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
⊢ f = 0
rcases p.trichotomy with (rfl | rfl | hp)
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
⊢ ‖0‖ = 0
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
⊢ f = 0 → ‖f‖ = 0
rintro rfl
no goals
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
⊢ ‖0‖ = 0
exact norm_zero
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
⊢ ↑f i = ↑0 i
case inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
⊢ f = 0
ext i
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
this : {i | ¬↑f i = 0} = ∅
⊢ ↑f i = ↑0 i
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
⊢ ↑f i = ↑0 i
have : { i : α | ¬f i = 0 } = ∅ := by simpa [lp.norm_eq_card_dsupport f] using h
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
this✝ : {i | ¬↑f i = 0} = ∅
this : (¬↑f i = 0) = False
⊢ ↑f i = ↑0 i
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
this : {i | ¬↑f i = 0} = ∅
⊢ ↑f i = ↑0 i
have : (¬f i = 0) = False := congr_fun this i
no goals
case inl.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
this✝ : {i | ¬↑f i = 0} = ∅
this : (¬↑f i = 0) = False
⊢ ↑f i = ↑0 i
tauto
no goals
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E 0 }
h : ‖f‖ = 0
i : α
⊢ {i | ¬↑f i = 0} = ∅
simpa [lp.norm_eq_card_dsupport f] using h
case inr.inl.inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : IsEmpty α
⊢ f = 0

case inr.inl.inr
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
⊢ f = 0
case inr.inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
⊢ f = 0
cases' isEmpty_or_nonempty α with _i _i
case inr.inl.inr
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
⊢ f = 0
case inr.inl.inr
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
⊢ f = 0
have H : IsLUB (Set.range fun i => ‖f i‖) 0 := by simpa [h] using lp.isLUB_norm f
case inr.inl.inr.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
i : α
⊢ ↑f i = ↑0 i
case inr.inl.inr
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
⊢ f = 0
ext i
case inr.inl.inr.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
i : α
this : ‖↑f i‖ = 0
⊢ ↑f i = ↑0 i
case inr.inl.inr.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
i : α
⊢ ↑f i = ↑0 i
have : ‖f i‖ = 0 := le_antisymm (H.1 ⟨i, rfl⟩) (norm_nonneg _)
no goals
case inr.inl.inr.h.h
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
H : IsLUB (Set.range fun i => ‖↑f i‖) 0
i : α
this : ‖↑f i‖ = 0
⊢ ↑f i = ↑0 i
simpa using this
no goals
case inr.inl.inl
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : IsEmpty α
⊢ f = 0
simp
no goals
α : Type u_1
E : α → Type u_2
q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E ⊤ }
h : ‖f‖ = 0
_i : Nonempty α
⊢ IsLUB (Set.range fun i => ‖↑f i‖) 0
simpa [h] using lp.isLUB_norm f
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
⊢ f = 0
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
⊢ f = 0
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
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
⊢ f = 0
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
⊢ f = 0
have : ∀ i, 0 ≤ ‖f i‖ ^ p.toReal := fun i => Real.rpow_nonneg_of_nonneg (norm_nonneg _) _
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
⊢ f = 0
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
⊢ f = 0
rw [hasSum_zero_iff_of_nonneg this] at hf
case inr.inr.h.h
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
i : α
⊢ ↑f i = ↑0 i
case inr.inr
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
⊢ f = 0
ext i
case inr.inr.h.h
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this✝ : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
i : α
this : ↑f i = 0 ∧ ENNReal.toReal p ≠ 0
⊢ ↑f i = ↑0 i
case inr.inr.h.h
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
i : α
⊢ ↑f i = ↑0 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
no goals
case inr.inr.h.h
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this✝ : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
i : α
this : ↑f i = 0 ∧ ENNReal.toReal p ≠ 0
⊢ ↑f i = ↑0 i
exact this.1
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
this : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) (‖f‖ ^ ENNReal.toReal p)
⊢ HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
⊢ HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
have := lp.hasSum_norm hp f
no goals
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
this : HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) (‖f‖ ^ ENNReal.toReal p)
⊢ HasSum (fun i => ‖↑f i‖ ^ ENNReal.toReal p) 0
rwa [h, Real.zero_rpow hp.ne'] at this
no goals
α : Type u_1
E : α → Type u_2
p q : ℝ≥0∞
inst✝ : (i : α) → NormedAddCommGroup (E i)
f : { x // x ∈ lp E p }
h : ‖f‖ = 0
hp : 0 < ENNReal.toReal p
hf : (fun i => ‖↑f i‖ ^ ENNReal.toReal p) = 0
this : ∀ (i : α), 0 ≤ ‖↑f i‖ ^ ENNReal.toReal p
i : α
⊢ ↑f i = 0 ∧ ENNReal.toReal p ≠ 0
simpa [Real.rpow_eq_zero_iff_of_nonneg (norm_nonneg (f i))] using congr_fun hf i