Theorem: PiLp.antilipschitzWith_equiv_aux
File: Mathlib/Analysis/NormedSpace/PiLp.lean

tactic: intro x y
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
⊢ AntilipschitzWith (↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) ↑(PiLp.equiv p β)

tactic: rcases p.dichotomy with (rfl | h)
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: simp only [edist_eq_iSup, ENNReal.div_top, ENNReal.zero_toReal, NNReal.rpow_zero,
  ENNReal.coe_one, one_mul, iSup_le_iff]
state_before: case inl
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : (i : ι) → PseudoMetricSpace (α i)
inst✝² : (i : ι) → PseudoEMetricSpace (β i)
inst✝¹ : Fintype ι
inst✝ : Fact (1 ≤ ⊤)
x y : PiLp ⊤ β
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / ⊤)) * edist (↑(PiLp.equiv ⊤ β) x) (↑(PiLp.equiv ⊤ β) y)

tactic: exact fun i => Finset.le_sup (f := fun i => edist (x i) (y i)) (Finset.mem_univ i)
state_before: case inl
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : (i : ι) → PseudoMetricSpace (α i)
inst✝² : (i : ι) → PseudoEMetricSpace (β i)
inst✝¹ : Fintype ι
inst✝ : Fact (1 ≤ ⊤)
x y : PiLp ⊤ β
⊢ ∀ (i : ι), edist (x i) (y i) ≤ edist (↑(PiLp.equiv ⊤ β) x) (↑(PiLp.equiv ⊤ β) y)

tactic: have pos : 0 < p.toReal := zero_lt_one.trans_le h
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: have nonneg : 0 ≤ 1 / p.toReal := one_div_nonneg.2 (le_of_lt pos)
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: have cancel : p.toReal * (1 / p.toReal) = 1 := mul_div_cancel' 1 (ne_of_gt pos)
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: rw [edist_eq_sum pos, ENNReal.toReal_div 1 p]
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ edist x y ≤ ↑(↑(Fintype.card ι) ^ ENNReal.toReal (1 / p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: simp only [edist, ← one_div, ENNReal.one_toReal]
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ (∑ i : ι, edist (x i) (y i) ^ ENNReal.toReal p) ^ (1 / ENNReal.toReal p) ≤
    ↑(↑(Fintype.card ι) ^ (ENNReal.toReal 1 / ENNReal.toReal p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: calc
  (∑ i, edist (x i) (y i) ^ p.toReal) ^ (1 / p.toReal) ≤
      (∑ _i, edist (PiLp.equiv p β x) (PiLp.equiv p β y) ^ p.toReal) ^ (1 / p.toReal) := by
    refine ENNReal.rpow_le_rpow ?_ nonneg
    swap
    refine Finset.sum_le_sum fun i _ => ?_
    apply ENNReal.rpow_le_rpow _ (le_of_lt pos)
    exact Finset.le_sup (f := fun i => edist (x i) (y i)) (Finset.mem_univ i)
  _ =
      ((Fintype.card ι : ℝ≥0) ^ (1 / p.toReal) : ℝ≥0) *
        edist (PiLp.equiv p β x) (PiLp.equiv p β y) := by
    simp only [nsmul_eq_mul, Finset.card_univ, ENNReal.rpow_one, Finset.sum_const,
      ENNReal.mul_rpow_of_nonneg _ _ nonneg, ← ENNReal.rpow_mul, cancel]
    have : (Fintype.card ι : ℝ≥0∞) = (Fintype.card ι : ℝ≥0) :=
      (ENNReal.coe_nat (Fintype.card ι)).symm
    rw [this, ENNReal.coe_rpow_of_nonneg _ nonneg]
state_before: case inr
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ (∑ x_1 : ι, edist (x x_1) (y x_1) ^ ENNReal.toReal p) ^ (1 / ENNReal.toReal p) ≤
    ↑(↑(Fintype.card ι) ^ (1 / ENNReal.toReal p)) *
      Finset.sup Finset.univ fun b => edist (↑(PiLp.equiv p β) x b) (↑(PiLp.equiv p β) y b)

tactic: refine ENNReal.rpow_le_rpow ?_ nonneg
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ (∑ i : ι, edist (x i) (y i) ^ ENNReal.toReal p) ^ (1 / ENNReal.toReal p) ≤
    (∑ _i : ?m.62008, edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) ^ ENNReal.toReal p) ^ (1 / ENNReal.toReal p)

tactic: swap
state_before: case refine_1
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ Fintype ?m.62008

case refine_2
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ ∑ i : ι, edist (x i) (y i) ^ ENNReal.toReal p ≤
    ∑ _i : ?m.62008, edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) ^ ENNReal.toReal p

tactic: refine Finset.sum_le_sum fun i _ => ?_
state_before: case refine_2
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ ∑ i : ι, edist (x i) (y i) ^ ENNReal.toReal p ≤
    ∑ _i : ?m.62008, edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) ^ ENNReal.toReal p

case refine_1
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ Fintype ?m.62008

tactic: apply ENNReal.rpow_le_rpow _ (le_of_lt pos)
state_before: case refine_2
p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
i : ι
x✝ : i ∈ Finset.univ
⊢ edist (x i) (y i) ^ ENNReal.toReal p ≤ edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) ^ ENNReal.toReal p

tactic: exact Finset.le_sup (f := fun i => edist (x i) (y i)) (Finset.mem_univ i)
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
i : ι
x✝ : i ∈ Finset.univ
⊢ edist (x i) (y i) ≤ edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: simp only [nsmul_eq_mul, Finset.card_univ, ENNReal.rpow_one, Finset.sum_const,
  ENNReal.mul_rpow_of_nonneg _ _ nonneg, ← ENNReal.rpow_mul, cancel]
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ (∑ _i : ι, edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) ^ ENNReal.toReal p) ^ (1 / ENNReal.toReal p) =
    ↑(↑(Fintype.card ι) ^ (1 / ENNReal.toReal p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: have : (Fintype.card ι : ℝ≥0∞) = (Fintype.card ι : ℝ≥0) :=
  (ENNReal.coe_nat (Fintype.card ι)).symm
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
⊢ ↑(Fintype.card ι) ^ (1 / ENNReal.toReal p) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) =
    ↑(↑(Fintype.card ι) ^ (1 / ENNReal.toReal p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)

tactic: rw [this, ENNReal.coe_rpow_of_nonneg _ nonneg]
state_before: p : ℝ≥0∞
𝕜 : Type ?u.57170
𝕜' : Type ?u.57173
ι : Type u_1
α : ι → Type ?u.57181
β : ι → Type u_2
inst✝³ : Fact (1 ≤ p)
inst✝² : (i : ι) → PseudoMetricSpace (α i)
inst✝¹ : (i : ι) → PseudoEMetricSpace (β i)
inst✝ : Fintype ι
x y : PiLp p β
h : 1 ≤ ENNReal.toReal p
pos : 0 < ENNReal.toReal p
nonneg : 0 ≤ 1 / ENNReal.toReal p
cancel : ENNReal.toReal p * (1 / ENNReal.toReal p) = 1
this : ↑(Fintype.card ι) = ↑↑(Fintype.card ι)
⊢ ↑(Fintype.card ι) ^ (1 / ENNReal.toReal p) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y) =
    ↑(↑(Fintype.card ι) ^ (1 / ENNReal.toReal p)) * edist (↑(PiLp.equiv p β) x) (↑(PiLp.equiv p β) y)