[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
hs : Set.Nonempty s
⊢ Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
[PROOFSTEP]
obtain ⟨x, hx⟩ := hs
[GOAL]
case intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
x : α
hx : x ∈ s
⊢ Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
[PROOFSTEP]
exact ⟨⟨fun _ => x, fun i j _ => le_rfl, fun _ => hx⟩⟩
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f f' : α → E
s : Set α
h : ∀ ⦃x : α⦄, x ∈ s → edist (f x) (f' x) = 0
⊢ eVariationOn f s = eVariationOn f' s
[PROOFSTEP]
dsimp only [eVariationOn]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f f' : α → E
s : Set α
h : ∀ ⦃x : α⦄, x ∈ s → edist (f x) (f' x) = 0
⊢ ⨆ (p : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }),
      ∑ i in Finset.range p.fst, edist (f (↑p.snd (i + 1))) (f (↑p.snd i)) =
    ⨆ (p : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }),
      ∑ i in Finset.range p.fst, edist (f' (↑p.snd (i + 1))) (f' (↑p.snd i))
[PROOFSTEP]
congr 1 with p : 1
[GOAL]
case e_s.h
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f f' : α → E
s : Set α
h : ∀ ⦃x : α⦄, x ∈ s → edist (f x) (f' x) = 0
p : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
⊢ ∑ i in Finset.range p.fst, edist (f (↑p.snd (i + 1))) (f (↑p.snd i)) =
    ∑ i in Finset.range p.fst, edist (f' (↑p.snd (i + 1))) (f' (↑p.snd i))
[PROOFSTEP]
congr 1 with i : 1
[GOAL]
case e_s.h.e_f.h
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f f' : α → E
s : Set α
h : ∀ ⦃x : α⦄, x ∈ s → edist (f x) (f' x) = 0
p : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
i : ℕ
⊢ edist (f (↑p.snd (i + 1))) (f (↑p.snd i)) = edist (f' (↑p.snd (i + 1))) (f' (↑p.snd i))
[PROOFSTEP]
rw [edist_congr_right (h <| p.snd.prop.2 (i + 1)), edist_congr_left (h <| p.snd.prop.2 i)]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f f' : α → E
s : Set α
h : EqOn f f' s
x : α
xs : x ∈ s
⊢ edist (f x) (f' x) = 0
[PROOFSTEP]
rw [h xs, edist_self]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
⊢ ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
cases' le_total n m with hnm hmn
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hnm : n ≤ m
⊢ ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
simp [Finset.Ico_eq_empty_of_le hnm]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hmn : m ≤ n
⊢ ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
let π := projIcc m n hmn
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hmn : m ≤ n
π : ℕ → ↑(Icc m n) := projIcc m n hmn
⊢ ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
let v i := u (π i)
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hmn : m ≤ n
π : ℕ → ↑(Icc m n) := projIcc m n hmn
v : ℕ → α := fun i => u ↑(π i)
⊢ ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
calc
  ∑ i in Finset.Ico m n, edist (f (u (i + 1))) (f (u i)) = ∑ i in Finset.Ico m n, edist (f (v (i + 1))) (f (v i)) :=
    Finset.sum_congr rfl fun i hi ↦ by
      rw [Finset.mem_Ico] at hi 
      simp only [projIcc_of_mem hmn ⟨hi.1, hi.2.le⟩, projIcc_of_mem hmn ⟨hi.1.trans i.le_succ, hi.2⟩]
  _ ≤ ∑ i in Finset.range n, edist (f (v (i + 1))) (f (v i)) :=
    (Finset.sum_mono_set _ (Nat.Iio_eq_range ▸ Finset.Ico_subset_Iio_self))
  _ ≤ eVariationOn f s := sum_le _ _ (fun i j h ↦ hu (π i).2 (π j).2 (monotone_projIcc hmn h)) fun i ↦ us _ (π i).2
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hmn : m ≤ n
π : ℕ → ↑(Icc m n) := projIcc m n hmn
v : ℕ → α := fun i => u ↑(π i)
i : ℕ
hi : i ∈ Finset.Ico m n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
rw [Finset.mem_Ico] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
m n : ℕ
u : ℕ → α
hu : MonotoneOn u (Icc m n)
us : ∀ (i : ℕ), i ∈ Icc m n → u i ∈ s
hmn : m ≤ n
π : ℕ → ↑(Icc m n) := projIcc m n hmn
v : ℕ → α := fun i => u ↑(π i)
i : ℕ
hi : m ≤ i ∧ i < n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
simp only [projIcc_of_mem hmn ⟨hi.1, hi.2.le⟩, projIcc_of_mem hmn ⟨hi.1.trans i.le_succ, hi.2⟩]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
n : ℕ
u : ℕ → α
hu : MonotoneOn u (Iic n)
us : ∀ (i : ℕ), i ≤ n → u i ∈ s
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ eVariationOn f s
[PROOFSTEP]
simpa using sum_le_of_monotoneOn_Icc f (m := 0) (hu.mono Icc_subset_Iic_self) fun i hi ↦ us i hi.2
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
hst : t ⊆ s
⊢ eVariationOn f t ≤ eVariationOn f s
[PROOFSTEP]
apply iSup_le _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
hst : t ⊆ s
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }),
    ∑ i_1 in Finset.range i.fst, edist (f (↑i.snd (i_1 + 1))) (f (↑i.snd i_1)) ≤ eVariationOn f s
[PROOFSTEP]
rintro ⟨n, ⟨u, hu, ut⟩⟩
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
hst : t ⊆ s
n : ℕ
u : ℕ → α
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd i)) ≤
    eVariationOn f s
[PROOFSTEP]
exact sum_le f n hu fun i => hst (ut i)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
wlog hxy : y ≤ x generalizing x y
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
this : ∀ {x y : α}, x ∈ s → y ∈ s → y ≤ x → edist (f x) (f y) ≤ eVariationOn f s
hxy : ¬y ≤ x
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
rw [edist_comm]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
this : ∀ {x y : α}, x ∈ s → y ∈ s → y ≤ x → edist (f x) (f y) ≤ eVariationOn f s
hxy : ¬y ≤ x
⊢ edist (f y) (f x) ≤ eVariationOn f s
[PROOFSTEP]
exact this hy hx (le_of_not_le hxy)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
hxy : y ≤ x
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
let u : ℕ → α := fun n => if n = 0 then y else x
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
hxy : y ≤ x
u : ℕ → α := fun n => if n = 0 then y else x
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
have hu : Monotone u :=
  monotone_nat_of_le_succ fun
    | 0 => hxy
    | (_ + 1) => le_rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
hxy : y ≤ x
u : ℕ → α := fun n => if n = 0 then y else x
hu : Monotone u
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
have us : ∀ i, u i ∈ s := fun
  | 0 => hy
  | (_ + 1) => hx
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x y : α
hx : x ∈ s
hy : y ∈ s
hxy : y ≤ x
u : ℕ → α := fun n => if n = 0 then y else x
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
simpa only [Finset.sum_range_one] using sum_le f 1 hu us
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
⊢ eVariationOn f s = 0 ↔ ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
⊢ eVariationOn f s = 0 → ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
[PROOFSTEP]
rintro h x xs y ys
[GOAL]
case mp
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : eVariationOn f s = 0
x : α
xs : x ∈ s
y : α
ys : y ∈ s
⊢ edist (f x) (f y) = 0
[PROOFSTEP]
rw [← le_zero_iff, ← h]
[GOAL]
case mp
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : eVariationOn f s = 0
x : α
xs : x ∈ s
y : α
ys : y ∈ s
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
exact edist_le f xs ys
[GOAL]
case mpr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
⊢ (∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0) → eVariationOn f s = 0
[PROOFSTEP]
rintro h
[GOAL]
case mpr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
⊢ eVariationOn f s = 0
[PROOFSTEP]
dsimp only [eVariationOn]
[GOAL]
case mpr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
⊢ ⨆ (p : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }),
      ∑ i in Finset.range p.fst, edist (f (↑p.snd (i + 1))) (f (↑p.snd i)) =
    0
[PROOFSTEP]
rw [ENNReal.iSup_eq_zero]
[GOAL]
case mpr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }),
    ∑ i_1 in Finset.range i.fst, edist (f (↑i.snd (i_1 + 1))) (f (↑i.snd i_1)) = 0
[PROOFSTEP]
rintro ⟨n, u, um, us⟩
[GOAL]
case mpr.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
n : ℕ
u : ℕ → α
um : Monotone u
us : ∀ (i : ℕ), u i ∈ s
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) =
    0
[PROOFSTEP]
exact Finset.sum_eq_zero fun i _ => h _ (us i.succ) _ (us i)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : Set.Subsingleton (f '' s)
⊢ eVariationOn f s = 0
[PROOFSTEP]
rw [eq_zero_iff]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : Set.Subsingleton (f '' s)
⊢ ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → edist (f x) (f y) = 0
[PROOFSTEP]
rintro x xs y ys
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : Set.Subsingleton (f '' s)
x : α
xs : x ∈ s
y : α
ys : y ∈ s
⊢ edist (f x) (f y) = 0
[PROOFSTEP]
rw [hf ⟨x, xs, rfl⟩ ⟨y, ys, rfl⟩, edist_self]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
ι : Type u_3
F : ι → α → E
p : Filter ι
f : α → E
s : Set α
Ffs : ∀ (x : α), x ∈ s → Tendsto (fun i => F i x) p (𝓝 (f x))
v : ℝ≥0∞
hv : v < eVariationOn f s
⊢ ∀ᶠ (n : ι) in p, v < eVariationOn (F n) s
[PROOFSTEP]
obtain ⟨⟨n, ⟨u, um, us⟩⟩, hlt⟩ :
  ∃ p : ℕ × { u : ℕ → α // Monotone u ∧ ∀ i, u i ∈ s },
    v < ∑ i in Finset.range p.1, edist (f ((p.2 : ℕ → α) (i + 1))) (f ((p.2 : ℕ → α) i)) :=
  lt_iSup_iff.mp hv
[GOAL]
case intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
ι : Type u_3
F : ι → α → E
p : Filter ι
f : α → E
s : Set α
Ffs : ∀ (x : α), x ∈ s → Tendsto (fun i => F i x) p (𝓝 (f x))
v : ℝ≥0∞
hv : v < eVariationOn f s
n : ℕ
u : ℕ → α
um : Monotone u
us : ∀ (i : ℕ), u i ∈ s
hlt :
  v <
    ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i))
⊢ ∀ᶠ (n : ι) in p, v < eVariationOn (F n) s
[PROOFSTEP]
have :
  Tendsto (fun j => ∑ i : ℕ in Finset.range n, edist (F j (u (i + 1))) (F j (u i))) p
    (𝓝 (∑ i : ℕ in Finset.range n, edist (f (u (i + 1))) (f (u i)))) :=
  by
  apply tendsto_finset_sum
  exact fun i _ => Tendsto.edist (Ffs (u i.succ) (us i.succ)) (Ffs (u i) (us i))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
ι : Type u_3
F : ι → α → E
p : Filter ι
f : α → E
s : Set α
Ffs : ∀ (x : α), x ∈ s → Tendsto (fun i => F i x) p (𝓝 (f x))
v : ℝ≥0∞
hv : v < eVariationOn f s
n : ℕ
u : ℕ → α
um : Monotone u
us : ∀ (i : ℕ), u i ∈ s
hlt :
  v <
    ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i))
⊢ Tendsto (fun j => ∑ i in Finset.range n, edist (F j (u (i + 1))) (F j (u i))) p
    (𝓝 (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))))
[PROOFSTEP]
apply tendsto_finset_sum
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
ι : Type u_3
F : ι → α → E
p : Filter ι
f : α → E
s : Set α
Ffs : ∀ (x : α), x ∈ s → Tendsto (fun i => F i x) p (𝓝 (f x))
v : ℝ≥0∞
hv : v < eVariationOn f s
n : ℕ
u : ℕ → α
um : Monotone u
us : ∀ (i : ℕ), u i ∈ s
hlt :
  v <
    ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i))
⊢ ∀ (i : ℕ),
    i ∈ Finset.range n → Tendsto (fun b => edist (F b (u (i + 1))) (F b (u i))) p (𝓝 (edist (f (u (i + 1))) (f (u i))))
[PROOFSTEP]
exact fun i _ => Tendsto.edist (Ffs (u i.succ) (us i.succ)) (Ffs (u i) (us i))
[GOAL]
case intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
ι : Type u_3
F : ι → α → E
p : Filter ι
f : α → E
s : Set α
Ffs : ∀ (x : α), x ∈ s → Tendsto (fun i => F i x) p (𝓝 (f x))
v : ℝ≥0∞
hv : v < eVariationOn f s
n : ℕ
u : ℕ → α
um : Monotone u
us : ∀ (i : ℕ), u i ∈ s
hlt :
  v <
    ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i))
this :
  Tendsto (fun j => ∑ i in Finset.range n, edist (F j (u (i + 1))) (F j (u i))) p
    (𝓝 (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))))
⊢ ∀ᶠ (n : ι) in p, v < eVariationOn (F n) s
[PROOFSTEP]
exact (eventually_gt_of_tendsto_gt hlt this).mono fun i h => h.trans_le (sum_le (F i) n um us)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[singleton '' s] E
⊢ LowerSemicontinuousAt (fun f => eVariationOn f s) f
[PROOFSTEP]
apply @lowerSemicontinuous_aux _ _ _ _ (UniformOnFun α E (s.image singleton)) id (𝓝 f) f s _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[singleton '' s] E
⊢ ∀ (x : α), x ∈ s → Tendsto (fun i => id i x) (𝓝 f) (𝓝 (f x))
[PROOFSTEP]
simpa only [UniformOnFun.tendsto_iff_tendstoUniformlyOn, mem_image, forall_exists_index, and_imp,
  forall_apply_eq_imp_iff₂, tendstoUniformlyOn_singleton_iff_tendsto] using @tendsto_id _ (𝓝 f)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[{s}] E
⊢ LowerSemicontinuousAt (fun f => eVariationOn f s) f
[PROOFSTEP]
apply @lowerSemicontinuous_aux _ _ _ _ (UniformOnFun α E { s }) id (𝓝 f) f s _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[{s}] E
⊢ ∀ (x : α), x ∈ s → Tendsto (fun i => id i x) (𝓝 f) (𝓝 (f x))
[PROOFSTEP]
have := @tendsto_id _ (𝓝 f)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[{s}] E
this : Tendsto id (𝓝 f) (𝓝 f)
⊢ ∀ (x : α), x ∈ s → Tendsto (fun i => id i x) (𝓝 f) (𝓝 (f x))
[PROOFSTEP]
rw [UniformOnFun.tendsto_iff_tendstoUniformlyOn] at this 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[{s}] E
this : ∀ (s_1 : Set α), s_1 ∈ {s} → TendstoUniformlyOn id f (𝓝 f) s_1
⊢ ∀ (x : α), x ∈ s → Tendsto (fun i => id i x) (𝓝 f) (𝓝 (f x))
[PROOFSTEP]
simp_rw [← tendstoUniformlyOn_singleton_iff_tendsto]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
s : Set α
f : α →ᵤ[{s}] E
this : ∀ (s_1 : Set α), s_1 ∈ {s} → TendstoUniformlyOn id f (𝓝 f) s_1
⊢ ∀ (x : α), x ∈ s → TendstoUniformlyOn (fun n => id n) f (𝓝 f) {x}
[PROOFSTEP]
exact fun x xs => (this s rfl).mono (singleton_subset_iff.mpr xs)
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E✝ : Type u_2
inst✝¹ : PseudoEMetricSpace E✝
E : Type u_3
inst✝ : PseudoMetricSpace E
f : α → E
s : Set α
h : BoundedVariationOn f s
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ dist (f x) (f y) ≤ ENNReal.toReal (eVariationOn f s)
[PROOFSTEP]
rw [← ENNReal.ofReal_le_ofReal_iff ENNReal.toReal_nonneg, ENNReal.ofReal_toReal h, ← edist_dist]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E✝ : Type u_2
inst✝¹ : PseudoEMetricSpace E✝
E : Type u_3
inst✝ : PseudoMetricSpace E
f : α → E
s : Set α
h : BoundedVariationOn f s
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ edist (f x) (f y) ≤ eVariationOn f s
[PROOFSTEP]
exact edist_le f hx hy
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
h : BoundedVariationOn f s
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ f x - f y ≤ ENNReal.toReal (eVariationOn f s)
[PROOFSTEP]
apply (le_abs_self _).trans
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
h : BoundedVariationOn f s
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ |f x - f y| ≤ ENNReal.toReal (eVariationOn f s)
[PROOFSTEP]
rw [← Real.dist_eq]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
h : BoundedVariationOn f s
x y : α
hx : x ∈ s
hy : y ∈ s
⊢ dist (f x) (f y) ≤ ENNReal.toReal (eVariationOn f s)
[PROOFSTEP]
exact h.dist_le hx hy
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
rcases le_or_lt (u n) x with (h | h)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
let v i := if i ≤ n then u i else x
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have vs : ∀ i, v i ∈ s := fun i ↦ by
  simp only
  split_ifs
  · exact us i
  · exact hx
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
i : ℕ
⊢ v i ∈ s
[PROOFSTEP]
simp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
i : ℕ
⊢ (if i ≤ n then u i else x) ∈ s
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
i : ℕ
h✝ : i ≤ n
⊢ u i ∈ s
[PROOFSTEP]
exact us i
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
i : ℕ
h✝ : ¬i ≤ n
⊢ x ∈ s
[PROOFSTEP]
exact hx
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have hv : Monotone v := by
  refine monotone_nat_of_le_succ fun i => ?_
  simp only
  rcases lt_trichotomy i n with (hi | rfl | hi)
  · have : i + 1 ≤ n := Nat.succ_le_of_lt hi
    simp only [hi.le, this, if_true]
    exact hu (Nat.le_succ i)
  · simp only [le_refl, if_true, add_le_iff_nonpos_right, le_zero_iff, Nat.one_ne_zero, if_false, h]
  · have A : ¬i ≤ n := hi.not_le
    have B : ¬i + 1 ≤ n := fun h => A (i.le_succ.trans h)
    simp only [A, B, if_false, le_rfl]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
⊢ Monotone v
[PROOFSTEP]
refine monotone_nat_of_le_succ fun i => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
⊢ v i ≤ v (i + 1)
[PROOFSTEP]
simp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
rcases lt_trichotomy i n with (hi | rfl | hi)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : i < n
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
have : i + 1 ≤ n := Nat.succ_le_of_lt hi
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : i < n
this : i + 1 ≤ n
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
simp only [hi.le, this, if_true]
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : i < n
this : i + 1 ≤ n
⊢ u i ≤ u (i + 1)
[PROOFSTEP]
exact hu (Nat.le_succ i)
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
i : ℕ
h : u i ≤ x
v : ℕ → α := fun i_1 => if i_1 ≤ i then u i_1 else x
vs : ∀ (i : ℕ), v i ∈ s
⊢ (if i ≤ i then u i else x) ≤ if i + 1 ≤ i then u (i + 1) else x
[PROOFSTEP]
simp only [le_refl, if_true, add_le_iff_nonpos_right, le_zero_iff, Nat.one_ne_zero, if_false, h]
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : n < i
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
have A : ¬i ≤ n := hi.not_le
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : n < i
A : ¬i ≤ n
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
have B : ¬i + 1 ≤ n := fun h => A (i.le_succ.trans h)
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
i : ℕ
hi : n < i
A : ¬i ≤ n
B : ¬i + 1 ≤ n
⊢ (if i ≤ n then u i else x) ≤ if i + 1 ≤ n then u (i + 1) else x
[PROOFSTEP]
simp only [A, B, if_false, le_rfl]
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
refine' ⟨v, n + 2, hv, vs, (mem_image _ _ _).2 ⟨n + 1, _, _⟩, _⟩
[GOAL]
case inl.refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ n + 1 ∈ Iio (n + 2)
[PROOFSTEP]
rw [mem_Iio]
[GOAL]
case inl.refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ n + 1 < n + 2
[PROOFSTEP]
exact Nat.lt_succ_self (n + 1)
[GOAL]
case inl.refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ v (n + 1) = x
[PROOFSTEP]
have : ¬n + 1 ≤ n := Nat.not_succ_le_self n
[GOAL]
case inl.refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
this : ¬n + 1 ≤ n
⊢ v (n + 1) = x
[PROOFSTEP]
simp only [this, ite_eq_right_iff, IsEmpty.forall_iff]
[GOAL]
case inl.refine'_3
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range (n + 2), edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
calc
  (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) = ∑ i in Finset.range n, edist (f (v (i + 1))) (f (v i)) :=
    by
    apply Finset.sum_congr rfl fun i hi => ?_
    simp only [Finset.mem_range] at hi 
    have : i + 1 ≤ n := Nat.succ_le_of_lt hi
    simp only [hi.le, this, if_true]
  _ ≤ ∑ j in Finset.range (n + 2), edist (f (v (j + 1))) (f (v j)) :=
    Finset.sum_le_sum_of_subset (Finset.range_mono (Nat.le_add_right n 2))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) = ∑ i in Finset.range n, edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
apply Finset.sum_congr rfl fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
i : ℕ
hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
simp only [Finset.mem_range] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
i : ℕ
hi : i < n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
have : i + 1 ≤ n := Nat.succ_le_of_lt hi
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : u n ≤ x
v : ℕ → α := fun i => if i ≤ n then u i else x
vs : ∀ (i : ℕ), v i ∈ s
hv : Monotone v
i : ℕ
hi : i < n
this : i + 1 ≤ n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (v (i + 1))) (f (v i))
[PROOFSTEP]
simp only [hi.le, this, if_true]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have exists_N : ∃ N, N ≤ n ∧ x < u N := ⟨n, le_rfl, h⟩
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
let N := Nat.find exists_N
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have hN : N ≤ n ∧ x < u N := Nat.find_spec exists_N
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
let w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have ws : ∀ i, w i ∈ s := by
  dsimp only
  intro i
  split_ifs
  exacts [us _, hx, us _]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
⊢ ∀ (i : ℕ), w i ∈ s
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
⊢ ∀ (i : ℕ), (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ∈ s
[PROOFSTEP]
intro i
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
i : ℕ
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ∈ s
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
i : ℕ
h✝ : i < Nat.find exists_N
⊢ u i ∈ s
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
i : ℕ
h✝¹ : ¬i < Nat.find exists_N
h✝ : i = Nat.find exists_N
⊢ x ∈ s
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
i : ℕ
h✝¹ : ¬i < Nat.find exists_N
h✝ : ¬i = Nat.find exists_N
⊢ u (i - 1) ∈ s
[PROOFSTEP]
exacts [us _, hx, us _]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
have hw : Monotone w := by
  apply monotone_nat_of_le_succ fun i => ?_
  dsimp only
  rcases lt_trichotomy (i + 1) N with (hi | hi | hi)
  · have : i < N := Nat.lt_of_le_of_lt (Nat.le_succ i) hi
    simp only [hi, this, if_true]
    exact hu (Nat.le_succ _)
  · have A : i < N := hi ▸ i.lt_succ_self
    have B : ¬i + 1 < N := by rw [← hi]; exact fun h => h.ne rfl
    rw [if_pos A, if_neg B, if_pos hi]
    have T := Nat.find_min exists_N A
    push_neg at T 
    exact T (A.le.trans hN.1)
  · have A : ¬i < N := (Nat.lt_succ_iff.mp hi).not_lt
    have B : ¬i + 1 < N := hi.not_lt
    have C : ¬i + 1 = N := hi.ne.symm
    have D : i + 1 - 1 = i := Nat.pred_succ i
    rw [if_neg A, if_neg B, if_neg C, D]
    split_ifs
    · exact hN.2.le.trans (hu (le_of_not_lt A))
    · exact hu (Nat.pred_le _)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
⊢ Monotone w
[PROOFSTEP]
apply monotone_nat_of_le_succ fun i => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
⊢ w i ≤ w (i + 1)
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
rcases lt_trichotomy (i + 1) N with (hi | hi | hi)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have : i < N := Nat.lt_of_le_of_lt (Nat.le_succ i) hi
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 < N
this : i < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
simp only [hi, this, if_true]
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 < N
this : i < N
⊢ u i ≤ u (i + 1)
[PROOFSTEP]
exact hu (Nat.le_succ _)
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have A : i < N := hi ▸ i.lt_succ_self
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have B : ¬i + 1 < N := by rw [← hi]; exact fun h => h.ne rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
⊢ ¬i + 1 < N
[PROOFSTEP]
rw [← hi]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
⊢ ¬i + 1 < i + 1
[PROOFSTEP]
exact fun h => h.ne rfl
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
B : ¬i + 1 < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
rw [if_pos A, if_neg B, if_pos hi]
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
B : ¬i + 1 < N
⊢ u i ≤ x
[PROOFSTEP]
have T := Nat.find_min exists_N A
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
B : ¬i + 1 < N
T : ¬(i ≤ n ∧ x < u i)
⊢ u i ≤ x
[PROOFSTEP]
push_neg at T 
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : i + 1 = N
A : i < N
B : ¬i + 1 < N
T : i ≤ n → u i ≤ x
⊢ u i ≤ x
[PROOFSTEP]
exact T (A.le.trans hN.1)
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have A : ¬i < N := (Nat.lt_succ_iff.mp hi).not_lt
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have B : ¬i + 1 < N := hi.not_lt
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have C : ¬i + 1 = N := hi.ne.symm
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
C : ¬i + 1 = N
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
have D : i + 1 - 1 = i := Nat.pred_succ i
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
C : ¬i + 1 = N
D : i + 1 - 1 = i
⊢ (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)) ≤
    if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)
[PROOFSTEP]
rw [if_neg A, if_neg B, if_neg C, D]
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
C : ¬i + 1 = N
D : i + 1 - 1 = i
⊢ (if i = Nat.find exists_N then x else u (i - 1)) ≤ u i
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
C : ¬i + 1 = N
D : i + 1 - 1 = i
h✝ : i = Nat.find exists_N
⊢ x ≤ u i
[PROOFSTEP]
exact hN.2.le.trans (hu (le_of_not_lt A))
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
i : ℕ
hi : N < i + 1
A : ¬i < N
B : ¬i + 1 < N
C : ¬i + 1 = N
D : i + 1 - 1 = i
h✝ : ¬i = Nat.find exists_N
⊢ u (i - 1) ≤ u i
[PROOFSTEP]
exact hu (Nat.pred_le _)
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
refine' ⟨w, n + 1, hw, ws, (mem_image _ _ _).2 ⟨N, hN.1.trans_lt (Nat.lt_succ_self n), _⟩, _⟩
[GOAL]
case inr.refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
⊢ w N = x
[PROOFSTEP]
dsimp only
[GOAL]
case inr.refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
⊢ (if Nat.find exists_N < Nat.find exists_N then u (Nat.find exists_N)
    else if Nat.find exists_N = Nat.find exists_N then x else u (Nat.find exists_N - 1)) =
    x
[PROOFSTEP]
rw [if_neg (lt_irrefl N), if_pos rfl]
[GOAL]
case inr.refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j))
[PROOFSTEP]
rcases eq_or_lt_of_le (zero_le N) with (Npos | Npos)
[GOAL]
case inr.refine'_2.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j))
[PROOFSTEP]
calc
  (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) =
      ∑ i in Finset.range n, edist (f (w (1 + i + 1))) (f (w (1 + i))) :=
    by
    apply Finset.sum_congr rfl fun i _hi => ?_
    dsimp only
    simp only [← Npos, Nat.not_lt_zero, Nat.add_succ_sub_one, add_zero, if_false, add_eq_zero_iff, Nat.one_ne_zero,
      false_and_iff, Nat.succ_add_sub_one, zero_add]
    rw [add_comm 1 i]
  _ = ∑ i in Finset.Ico 1 (n + 1), edist (f (w (i + 1))) (f (w i)) :=
    by
    rw [Finset.range_eq_Ico]
    exact Finset.sum_Ico_add (fun i => edist (f (w (i + 1))) (f (w i))) 0 n 1
  _ ≤ ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j)) :=
    by
    apply Finset.sum_le_sum_of_subset _
    rw [Finset.range_eq_Ico]
    exact Finset.Ico_subset_Ico zero_le_one le_rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.range n, edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
apply Finset.sum_congr rfl fun i _hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
i : ℕ
_hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
i : ℕ
_hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
simp only [← Npos, Nat.not_lt_zero, Nat.add_succ_sub_one, add_zero, if_false, add_eq_zero_iff, Nat.one_ne_zero,
  false_and_iff, Nat.succ_add_sub_one, zero_add]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
i : ℕ
_hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (u (1 + i))) (f (u i))
[PROOFSTEP]
rw [add_comm 1 i]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ ∑ i in Finset.range n, edist (f (w (1 + i + 1))) (f (w (1 + i))) =
    ∑ i in Finset.Ico 1 (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
rw [Finset.range_eq_Ico]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ ∑ i in Finset.Ico 0 n, edist (f (w (1 + i + 1))) (f (w (1 + i))) =
    ∑ i in Finset.Ico 1 (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
exact Finset.sum_Ico_add (fun i => edist (f (w (i + 1))) (f (w i))) 0 n 1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ ∑ i in Finset.Ico 1 (n + 1), edist (f (w (i + 1))) (f (w i)) ≤
    ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j))
[PROOFSTEP]
apply Finset.sum_le_sum_of_subset _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ Finset.Ico 1 (n + 1) ⊆ Finset.range (n + 1)
[PROOFSTEP]
rw [Finset.range_eq_Ico]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 = N
⊢ Finset.Ico 1 (n + 1) ⊆ Finset.Ico 0 (n + 1)
[PROOFSTEP]
exact Finset.Ico_subset_Ico zero_le_one le_rfl
[GOAL]
case inr.refine'_2.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j))
[PROOFSTEP]
calc
  (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) =
      ((∑ i in Finset.Ico 0 (N - 1), edist (f (u (i + 1))) (f (u i))) +
          ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i))) +
        ∑ i in Finset.Ico N n, edist (f (u (i + 1))) (f (u i)) :=
    by
    rw [Finset.sum_Ico_consecutive, Finset.sum_Ico_consecutive, Finset.range_eq_Ico]
    · exact zero_le _
    · exact hN.1
    · exact zero_le _
    · exact Nat.pred_le _
  _ =
      (∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i))) + edist (f (u N)) (f (u (N - 1))) +
        ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i))) :=
    by
    congr 1; congr 1
    · apply Finset.sum_congr rfl fun i hi => ?_
      simp only [Finset.mem_Ico, zero_le', true_and_iff] at hi 
      dsimp only
      have A : i + 1 < N := Nat.lt_pred_iff.1 hi
      have B : i < N := Nat.lt_of_succ_lt A
      rw [if_pos A, if_pos B]
    · have A : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos Npos
      have : Finset.Ico (N - 1) N = {N - 1} := by rw [← Nat.Ico_succ_singleton, A]
      simp only [this, A, Finset.sum_singleton]
    · apply Finset.sum_congr rfl fun i hi => ?_
      rw [Finset.mem_Ico] at hi 
      dsimp only
      have A : ¬1 + i + 1 < N := fun h => by
        rw [add_assoc, add_comm] at h 
        exact hi.left.not_lt (i.lt_succ_self.trans (i.succ.lt_succ_self.trans h))
      have B : ¬1 + i + 1 = N := fun h => by
        rw [← h, add_assoc, add_comm] at hi 
        exact Nat.not_succ_le_self i (i.succ.le_succ.trans hi.left)
      have C : ¬1 + i < N := fun h => by
        rw [add_comm] at h 
        exact hi.left.not_lt (i.lt_succ_self.trans h)
      have D : ¬1 + i = N := fun h => by
        rw [← h, add_comm, Nat.succ_le_iff] at hi 
        exact hi.left.ne rfl
      rw [if_neg A, if_neg B, if_neg C, if_neg D]
      congr 3 <;> · rw [add_comm, Nat.sub_one]; apply Nat.pred_succ
  _ =
      (∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i))) + edist (f (w (N + 1))) (f (w (N - 1))) +
        ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i)) :=
    by
    congr 1; congr 1
    · dsimp only
      have A : ¬N + 1 < N := Nat.not_succ_lt_self
      have B : N - 1 < N := Nat.pred_lt Npos.ne'
      simp only [A, not_and, not_lt, Nat.succ_ne_self, Nat.add_succ_sub_one, add_zero, if_false, B, if_true]
    · exact Finset.sum_Ico_add (fun i => edist (f (w (i + 1))) (f (w i))) N n 1
  _ ≤
      ((∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i))) +
          ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i))) +
        ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i)) :=
    by
    refine' add_le_add (add_le_add le_rfl _) le_rfl
    have A : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos Npos
    have B : N - 1 + 1 < N + 1 := A.symm ▸ N.lt_succ_self
    have C : N - 1 < N + 1 := lt_of_le_of_lt N.pred_le N.lt_succ_self
    rw [Finset.sum_eq_sum_Ico_succ_bot C, Finset.sum_eq_sum_Ico_succ_bot B, A, Finset.Ico_self, Finset.sum_empty,
      add_zero, add_comm (edist _ _)]
    exact edist_triangle _ _ _
  _ = ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j)) :=
    by
    rw [Finset.sum_Ico_consecutive, Finset.sum_Ico_consecutive, Finset.range_eq_Ico]
    · exact zero_le _
    · exact Nat.succ_le_succ hN.left
    · exact zero_le _
    · exact N.pred_le.trans N.le_succ
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (u (i + 1))) (f (u i)) +
        ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) +
      ∑ i in Finset.Ico N n, edist (f (u (i + 1))) (f (u i))
[PROOFSTEP]
rw [Finset.sum_Ico_consecutive, Finset.sum_Ico_consecutive, Finset.range_eq_Ico]
[GOAL]
case hmn
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ 0 ≤ N
[PROOFSTEP]
exact zero_le _
[GOAL]
case hnk
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ N ≤ n
[PROOFSTEP]
exact hN.1
[GOAL]
case hmn
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ 0 ≤ N - 1
[PROOFSTEP]
exact zero_le _
[GOAL]
case hnk
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ N - 1 ≤ N
[PROOFSTEP]
exact Nat.pred_le _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (u (i + 1))) (f (u i)) +
        ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) +
      ∑ i in Finset.Ico N n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (u N)) (f (u (N - 1))) +
      ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
congr 1
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (u (i + 1))) (f (u i)) +
      ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (u N)) (f (u (N - 1)))
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico N n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
congr 1
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
apply Finset.sum_congr rfl fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i ∈ Finset.Ico 0 (N - 1)
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
simp only [Finset.mem_Ico, zero_le', true_and_iff] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i < Nat.find exists_N - 1
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i < Nat.find exists_N - 1
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)))
      (f (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)))
[PROOFSTEP]
have A : i + 1 < N := Nat.lt_pred_iff.1 hi
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i < Nat.find exists_N - 1
A : i + 1 < N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)))
      (f (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)))
[PROOFSTEP]
have B : i < N := Nat.lt_of_succ_lt A
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i < Nat.find exists_N - 1
A : i + 1 < N
B : i < N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 < Nat.find exists_N then u (i + 1) else if i + 1 = Nat.find exists_N then x else u (i + 1 - 1)))
      (f (if i < Nat.find exists_N then u i else if i = Nat.find exists_N then x else u (i - 1)))
[PROOFSTEP]
rw [if_pos A, if_pos B]
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) = edist (f (u N)) (f (u (N - 1)))
[PROOFSTEP]
have A : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos Npos
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
⊢ ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) = edist (f (u N)) (f (u (N - 1)))
[PROOFSTEP]
have : Finset.Ico (N - 1) N = {N - 1} := by rw [← Nat.Ico_succ_singleton, A]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
⊢ Finset.Ico (N - 1) N = {N - 1}
[PROOFSTEP]
rw [← Nat.Ico_succ_singleton, A]
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
this : Finset.Ico (N - 1) N = {N - 1}
⊢ ∑ i in Finset.Ico (N - 1) N, edist (f (u (i + 1))) (f (u i)) = edist (f (u N)) (f (u (N - 1)))
[PROOFSTEP]
simp only [this, A, Finset.sum_singleton]
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico N n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
apply Finset.sum_congr rfl fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i ∈ Finset.Ico N n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
rw [Finset.mem_Ico] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (w (1 + i + 1))) (f (w (1 + i)))
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
have A : ¬1 + i + 1 < N := fun h => by
  rw [add_assoc, add_comm] at h 
  exact hi.left.not_lt (i.lt_succ_self.trans (i.succ.lt_succ_self.trans h))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
h : 1 + i + 1 < N
⊢ False
[PROOFSTEP]
rw [add_assoc, add_comm] at h 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
h : i + 1 + 1 < N
⊢ False
[PROOFSTEP]
exact hi.left.not_lt (i.lt_succ_self.trans (i.succ.lt_succ_self.trans h))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
have B : ¬1 + i + 1 = N := fun h => by
  rw [← h, add_assoc, add_comm] at hi 
  exact Nat.not_succ_le_self i (i.succ.le_succ.trans hi.left)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
h : 1 + i + 1 = N
⊢ False
[PROOFSTEP]
rw [← h, add_assoc, add_comm] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i + 1 + 1 ≤ i ∧ i < n
A : ¬1 + i + 1 < N
h : 1 + i + 1 = N
⊢ False
[PROOFSTEP]
exact Nat.not_succ_le_self i (i.succ.le_succ.trans hi.left)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
have C : ¬1 + i < N := fun h => by
  rw [add_comm] at h 
  exact hi.left.not_lt (i.lt_succ_self.trans h)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
h : 1 + i < N
⊢ False
[PROOFSTEP]
rw [add_comm] at h 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
h : i + 1 < N
⊢ False
[PROOFSTEP]
exact hi.left.not_lt (i.lt_succ_self.trans h)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
have D : ¬1 + i = N := fun h => by
  rw [← h, add_comm, Nat.succ_le_iff] at hi 
  exact hi.left.ne rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
h : 1 + i = N
⊢ False
[PROOFSTEP]
rw [← h, add_comm, Nat.succ_le_iff] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h✝ : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : i < i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
h : 1 + i = N
⊢ False
[PROOFSTEP]
exact hi.left.ne rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist
      (f
        (if 1 + i + 1 < Nat.find exists_N then u (1 + i + 1)
        else if 1 + i + 1 = Nat.find exists_N then x else u (1 + i + 1 - 1)))
      (f (if 1 + i < Nat.find exists_N then u (1 + i) else if 1 + i = Nat.find exists_N then x else u (1 + i - 1)))
[PROOFSTEP]
rw [if_neg A, if_neg B, if_neg C, if_neg D]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ edist (f (u (i + 1))) (f (u i)) = edist (f (u (1 + i + 1 - 1))) (f (u (1 + i - 1)))
[PROOFSTEP]
congr 3
[GOAL]
case e_a.e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ i + 1 = 1 + i + 1 - 1
[PROOFSTEP]
rw [add_comm, Nat.sub_one]
[GOAL]
case e_a.e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ 1 + i = Nat.pred (1 + i + 1)
[PROOFSTEP]
apply Nat.pred_succ
[GOAL]
case e_a.e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ i = 1 + i - 1
[PROOFSTEP]
rw [add_comm, Nat.sub_one]
[GOAL]
case e_a.e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
i : ℕ
hi : N ≤ i ∧ i < n
A : ¬1 + i + 1 < N
B : ¬1 + i + 1 = N
C : ¬1 + i < N
D : ¬1 + i = N
⊢ i = Nat.pred (i + 1)
[PROOFSTEP]
apply Nat.pred_succ
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (u N)) (f (u (N - 1))) +
      ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i))) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (w (N + 1))) (f (w (N - 1))) +
      ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
congr 1
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (u N)) (f (u (N - 1))) =
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (w (N + 1))) (f (w (N - 1)))
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i))) =
    ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
congr 1
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ edist (f (u N)) (f (u (N - 1))) = edist (f (w (N + 1))) (f (w (N - 1)))
[PROOFSTEP]
dsimp only
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ edist (f (u (Nat.find exists_N))) (f (u (Nat.find exists_N - 1))) =
    edist
      (f
        (if Nat.find exists_N + 1 < Nat.find exists_N then u (Nat.find exists_N + 1)
        else if Nat.find exists_N + 1 = Nat.find exists_N then x else u (Nat.find exists_N + 1 - 1)))
      (f
        (if Nat.find exists_N - 1 < Nat.find exists_N then u (Nat.find exists_N - 1)
        else if Nat.find exists_N - 1 = Nat.find exists_N then x else u (Nat.find exists_N - 1 - 1)))
[PROOFSTEP]
have A : ¬N + 1 < N := Nat.not_succ_lt_self
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : ¬N + 1 < N
⊢ edist (f (u (Nat.find exists_N))) (f (u (Nat.find exists_N - 1))) =
    edist
      (f
        (if Nat.find exists_N + 1 < Nat.find exists_N then u (Nat.find exists_N + 1)
        else if Nat.find exists_N + 1 = Nat.find exists_N then x else u (Nat.find exists_N + 1 - 1)))
      (f
        (if Nat.find exists_N - 1 < Nat.find exists_N then u (Nat.find exists_N - 1)
        else if Nat.find exists_N - 1 = Nat.find exists_N then x else u (Nat.find exists_N - 1 - 1)))
[PROOFSTEP]
have B : N - 1 < N := Nat.pred_lt Npos.ne'
[GOAL]
case e_a.e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : ¬N + 1 < N
B : N - 1 < N
⊢ edist (f (u (Nat.find exists_N))) (f (u (Nat.find exists_N - 1))) =
    edist
      (f
        (if Nat.find exists_N + 1 < Nat.find exists_N then u (Nat.find exists_N + 1)
        else if Nat.find exists_N + 1 = Nat.find exists_N then x else u (Nat.find exists_N + 1 - 1)))
      (f
        (if Nat.find exists_N - 1 < Nat.find exists_N then u (Nat.find exists_N - 1)
        else if Nat.find exists_N - 1 = Nat.find exists_N then x else u (Nat.find exists_N - 1 - 1)))
[PROOFSTEP]
simp only [A, not_and, not_lt, Nat.succ_ne_self, Nat.add_succ_sub_one, add_zero, if_false, B, if_true]
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico N n, edist (f (w (1 + i + 1))) (f (w (1 + i))) =
    ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
exact Finset.sum_Ico_add (fun i => edist (f (w (i + 1))) (f (w i))) N n 1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) + edist (f (w (N + 1))) (f (w (N - 1))) +
      ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i)) ≤
    ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) +
        ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
refine' add_le_add (add_le_add le_rfl _) le_rfl
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ edist (f (w (N + 1))) (f (w (N - 1))) ≤ ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
have A : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos Npos
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
⊢ edist (f (w (N + 1))) (f (w (N - 1))) ≤ ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
have B : N - 1 + 1 < N + 1 := A.symm ▸ N.lt_succ_self
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
B : N - 1 + 1 < N + 1
⊢ edist (f (w (N + 1))) (f (w (N - 1))) ≤ ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
have C : N - 1 < N + 1 := lt_of_le_of_lt N.pred_le N.lt_succ_self
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
B : N - 1 + 1 < N + 1
C : N - 1 < N + 1
⊢ edist (f (w (N + 1))) (f (w (N - 1))) ≤ ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
rw [Finset.sum_eq_sum_Ico_succ_bot C, Finset.sum_eq_sum_Ico_succ_bot B, A, Finset.Ico_self, Finset.sum_empty, add_zero,
  add_comm (edist _ _)]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
A : N - 1 + 1 = N
B : N - 1 + 1 < N + 1
C : N - 1 < N + 1
⊢ edist (f (w (N + 1))) (f (w (N - 1))) ≤ edist (f (w (N + 1))) (f (w N)) + edist (f (w N)) (f (w (N - 1)))
[PROOFSTEP]
exact edist_triangle _ _ _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ ∑ i in Finset.Ico 0 (N - 1), edist (f (w (i + 1))) (f (w i)) +
        ∑ i in Finset.Ico (N - 1) (N + 1), edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.Ico (N + 1) (n + 1), edist (f (w (i + 1))) (f (w i)) =
    ∑ j in Finset.range (n + 1), edist (f (w (j + 1))) (f (w j))
[PROOFSTEP]
rw [Finset.sum_Ico_consecutive, Finset.sum_Ico_consecutive, Finset.range_eq_Ico]
[GOAL]
case hmn
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ 0 ≤ N + 1
[PROOFSTEP]
exact zero_le _
[GOAL]
case hnk
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ N + 1 ≤ n + 1
[PROOFSTEP]
exact Nat.succ_le_succ hN.left
[GOAL]
case hmn
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ 0 ≤ N - 1
[PROOFSTEP]
exact zero_le _
[GOAL]
case hnk
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
x : α
hx : x ∈ s
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
n : ℕ
h : x < u n
exists_N : ∃ N, N ≤ n ∧ x < u N
N : ℕ := Nat.find exists_N
hN : N ≤ n ∧ x < u N
w : ℕ → α := fun i => if i < N then u i else if i = N then x else u (i - 1)
ws : ∀ (i : ℕ), w i ∈ s
hw : Monotone w
Npos : 0 < N
⊢ N - 1 ≤ N + 1
[PROOFSTEP]
exact N.pred_le.trans N.le_succ
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
by_cases hs : s = ∅
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : s = ∅
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
simp [hs]
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
have : Nonempty { u // Monotone u ∧ ∀ i : ℕ, u i ∈ s } := nonempty_monotone_mem (nonempty_iff_ne_empty.2 hs)
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
by_cases ht : t = ∅
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : t = ∅
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
simp [ht]
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
have : Nonempty { u // Monotone u ∧ ∀ i : ℕ, u i ∈ t } := nonempty_monotone_mem (nonempty_iff_ne_empty.2 ht)
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
⊢ eVariationOn f s + eVariationOn f t ≤ eVariationOn f (s ∪ t)
[PROOFSTEP]
refine'
  ENNReal.iSup_add_iSup_le
    _
      /- We start from two sequences `u` and `v` along `s` and `t` respectively, and we build a new
          sequence `w` along `s ∪ t` by juxtaposing them. Its variation is larger than the sum of the
          variations. -/
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }) (j : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }),
    ∑ i_1 in Finset.range i.fst, edist (f (↑i.snd (i_1 + 1))) (f (↑i.snd i_1)) +
        ∑ i in Finset.range j.fst, edist (f (↑j.snd (i + 1))) (f (↑j.snd i)) ≤
      eVariationOn f (s ∪ t)
[PROOFSTEP]
rintro ⟨n, ⟨u, hu, us⟩⟩ ⟨m, ⟨v, hv, vt⟩⟩
[GOAL]
case neg.mk.mk.intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
        edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
          (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) +
      ∑ i in Finset.range (m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).fst,
        edist (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd (i + 1)))
          (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd i)) ≤
    eVariationOn f (s ∪ t)
[PROOFSTEP]
let w i := if i ≤ n then u i else v (i - (n + 1))
[GOAL]
case neg.mk.mk.intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
        edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
          (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) +
      ∑ i in Finset.range (m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).fst,
        edist (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd (i + 1)))
          (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd i)) ≤
    eVariationOn f (s ∪ t)
[PROOFSTEP]
have wst : ∀ i, w i ∈ s ∪ t := by
  intro i
  by_cases hi : i ≤ n
  · simp [hi, us]
  · simp [hi, vt]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
⊢ ∀ (i : ℕ), w i ∈ s ∪ t
[PROOFSTEP]
intro i
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
i : ℕ
⊢ w i ∈ s ∪ t
[PROOFSTEP]
by_cases hi : i ≤ n
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
i : ℕ
hi : i ≤ n
⊢ w i ∈ s ∪ t
[PROOFSTEP]
simp [hi, us]
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
i : ℕ
hi : ¬i ≤ n
⊢ w i ∈ s ∪ t
[PROOFSTEP]
simp [hi, vt]
[GOAL]
case neg.mk.mk.intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
        edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
          (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) +
      ∑ i in Finset.range (m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).fst,
        edist (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd (i + 1)))
          (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd i)) ≤
    eVariationOn f (s ∪ t)
[PROOFSTEP]
have hw : Monotone w := by
  intro i j hij
  dsimp only
  split_ifs with h_1 h_2 h_2
  · exact hu hij
  · apply h _ (us _) _ (vt _)
  · exfalso; exact h_1 (hij.trans h_2)
  · apply hv (tsub_le_tsub hij le_rfl)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
⊢ Monotone w
[PROOFSTEP]
intro i j hij
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
⊢ w i ≤ w j
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
⊢ (if i ≤ n then u i else v (i - (n + 1))) ≤ if j ≤ n then u j else v (j - (n + 1))
[PROOFSTEP]
split_ifs with h_1 h_2 h_2
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
h_1 : i ≤ n
h_2 : j ≤ n
⊢ u i ≤ u j
[PROOFSTEP]
exact hu hij
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
h_1 : i ≤ n
h_2 : ¬j ≤ n
⊢ u i ≤ v (j - (n + 1))
[PROOFSTEP]
apply h _ (us _) _ (vt _)
[GOAL]
case pos
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
h_1 : ¬i ≤ n
h_2 : j ≤ n
⊢ v (i - (n + 1)) ≤ u j
[PROOFSTEP]
exfalso
[GOAL]
case pos.h
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
h_1 : ¬i ≤ n
h_2 : j ≤ n
⊢ False
[PROOFSTEP]
exact h_1 (hij.trans h_2)
[GOAL]
case neg
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
i j : ℕ
hij : i ≤ j
h_1 : ¬i ≤ n
h_2 : ¬j ≤ n
⊢ v (i - (n + 1)) ≤ v (j - (n + 1))
[PROOFSTEP]
apply hv (tsub_le_tsub hij le_rfl)
[GOAL]
case neg.mk.mk.intro.mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
        edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
          (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) +
      ∑ i in Finset.range (m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).fst,
        edist (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd (i + 1)))
          (f (↑(m, { val := v, property := (_ : Monotone v ∧ ∀ (i : ℕ), v i ∈ t) }).snd i)) ≤
    eVariationOn f (s ∪ t)
[PROOFSTEP]
calc
  ((∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) +
        ∑ i : ℕ in Finset.range m, edist (f (v (i + 1))) (f (v i))) =
      (∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i))) +
        ∑ i : ℕ in Finset.range m, edist (f (w (n + 1 + i + 1))) (f (w (n + 1 + i))) :=
    by
    dsimp only
    congr 1
    · refine Finset.sum_congr rfl fun i hi => ?_
      simp only [Finset.mem_range] at hi 
      have : i + 1 ≤ n := Nat.succ_le_of_lt hi
      simp [hi.le, this]
    · refine Finset.sum_congr rfl fun i hi => ?_
      simp only [Finset.mem_range] at hi 
      have B : ¬n + 1 + i ≤ n := by linarith
      have A : ¬n + 1 + i + 1 ≤ n := fun h => B ((n + 1 + i).le_succ.trans h)
      have C : n + 1 + i - n = i + 1 := by
        rw [tsub_eq_iff_eq_add_of_le]
        · abel
        · exact n.le_succ.trans (n.succ.le_add_right i)
      simp only [A, B, C, Nat.succ_sub_succ_eq_sub, if_false, add_tsub_cancel_left]
  _ =
      (∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i))) +
        ∑ i : ℕ in Finset.Ico (n + 1) (n + 1 + m), edist (f (w (i + 1))) (f (w i)) :=
    by
    congr 1
    rw [Finset.range_eq_Ico]
    convert Finset.sum_Ico_add (fun i : ℕ => edist (f (w (i + 1))) (f (w i))) 0 m (n + 1) using 3 <;> abel
  _ ≤ ∑ i in Finset.range (n + 1 + m), edist (f (w (i + 1))) (f (w i)) :=
    by
    rw [← Finset.sum_union]
    · apply Finset.sum_le_sum_of_subset _
      rintro i hi
      simp only [Finset.mem_union, Finset.mem_range, Finset.mem_Ico] at hi ⊢
      cases' hi with hi hi
      · exact lt_of_lt_of_le hi (n.le_succ.trans (n.succ.le_add_right m))
      · exact hi.2
    · refine Finset.disjoint_left.2 fun i hi h'i => ?_
      simp only [Finset.mem_Ico, Finset.mem_range] at hi h'i 
      exact hi.not_lt (Nat.lt_of_succ_le h'i.left)
  _ ≤ eVariationOn f (s ∪ t) := sum_le f _ hw wst
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) + ∑ i in Finset.range m, edist (f (v (i + 1))) (f (v i)) =
    ∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.range m, edist (f (w (n + 1 + i + 1))) (f (w (n + 1 + i)))
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) + ∑ i in Finset.range m, edist (f (v (i + 1))) (f (v i)) =
    ∑ i in Finset.range n,
        edist (f (if i + 1 ≤ n then u (i + 1) else v (i + 1 - (n + 1)))) (f (if i ≤ n then u i else v (i - (n + 1)))) +
      ∑ i in Finset.range m,
        edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
          (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
congr 1
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.range n,
      edist (f (if i + 1 ≤ n then u (i + 1) else v (i + 1 - (n + 1)))) (f (if i ≤ n then u i else v (i - (n + 1))))
[PROOFSTEP]
refine Finset.sum_congr rfl fun i hi => ?_
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 ≤ n then u (i + 1) else v (i + 1 - (n + 1)))) (f (if i ≤ n then u i else v (i - (n + 1))))
[PROOFSTEP]
simp only [Finset.mem_range] at hi 
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < n
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 ≤ n then u (i + 1) else v (i + 1 - (n + 1)))) (f (if i ≤ n then u i else v (i - (n + 1))))
[PROOFSTEP]
have : i + 1 ≤ n := Nat.succ_le_of_lt hi
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝¹ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < n
this : i + 1 ≤ n
⊢ edist (f (u (i + 1))) (f (u i)) =
    edist (f (if i + 1 ≤ n then u (i + 1) else v (i + 1 - (n + 1)))) (f (if i ≤ n then u i else v (i - (n + 1))))
[PROOFSTEP]
simp [hi.le, this]
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range m, edist (f (v (i + 1))) (f (v i)) =
    ∑ i in Finset.range m,
      edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
        (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
refine Finset.sum_congr rfl fun i hi => ?_
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i ∈ Finset.range m
⊢ edist (f (v (i + 1))) (f (v i)) =
    edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
      (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
simp only [Finset.mem_range] at hi 
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
⊢ edist (f (v (i + 1))) (f (v i)) =
    edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
      (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
have B : ¬n + 1 + i ≤ n := by linarith
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
⊢ ¬n + 1 + i ≤ n
[PROOFSTEP]
linarith
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
⊢ edist (f (v (i + 1))) (f (v i)) =
    edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
      (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
have A : ¬n + 1 + i + 1 ≤ n := fun h => B ((n + 1 + i).le_succ.trans h)
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
⊢ edist (f (v (i + 1))) (f (v i)) =
    edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
      (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
have C : n + 1 + i - n = i + 1 := by
  rw [tsub_eq_iff_eq_add_of_le]
  · abel
  · exact n.le_succ.trans (n.succ.le_add_right i)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
⊢ n + 1 + i - n = i + 1
[PROOFSTEP]
rw [tsub_eq_iff_eq_add_of_le]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
⊢ n + 1 + i = i + 1 + n
[PROOFSTEP]
abel
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
⊢ n + 1 + i = i + 1 + n
[PROOFSTEP]
abel
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
⊢ n ≤ n + 1 + i
[PROOFSTEP]
exact n.le_succ.trans (n.succ.le_add_right i)
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < m
B : ¬n + 1 + i ≤ n
A : ¬n + 1 + i + 1 ≤ n
C : n + 1 + i - n = i + 1
⊢ edist (f (v (i + 1))) (f (v i)) =
    edist (f (if n + 1 + i + 1 ≤ n then u (n + 1 + i + 1) else v (n + 1 + i + 1 - (n + 1))))
      (f (if n + 1 + i ≤ n then u (n + 1 + i) else v (n + 1 + i - (n + 1))))
[PROOFSTEP]
simp only [A, B, C, Nat.succ_sub_succ_eq_sub, if_false, add_tsub_cancel_left]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.range m, edist (f (w (n + 1 + i + 1))) (f (w (n + 1 + i))) =
    ∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.Ico (n + 1) (n + 1 + m), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
congr 1
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range m, edist (f (w (n + 1 + i + 1))) (f (w (n + 1 + i))) =
    ∑ i in Finset.Ico (n + 1) (n + 1 + m), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
rw [Finset.range_eq_Ico]
[GOAL]
case e_a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.Ico 0 m, edist (f (w (n + 1 + i + 1))) (f (w (n + 1 + i))) =
    ∑ i in Finset.Ico (n + 1) (n + 1 + m), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
convert Finset.sum_Ico_add (fun i : ℕ => edist (f (w (i + 1))) (f (w i))) 0 m (n + 1) using 3
[GOAL]
case h.e'_3.h.h.e'_4
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ n + 1 = 0 + (n + 1)
[PROOFSTEP]
abel
[GOAL]
case h.e'_3.h.h.e'_4
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ n + 1 = 0 + (n + 1)
[PROOFSTEP]
abel
[GOAL]
case h.e'_3.h.h.e'_5
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ n + 1 + m = m + (n + 1)
[PROOFSTEP]
abel
[GOAL]
case h.e'_3.h.h.e'_5
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ n + 1 + m = m + (n + 1)
[PROOFSTEP]
abel
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ i in Finset.range n, edist (f (w (i + 1))) (f (w i)) +
      ∑ i in Finset.Ico (n + 1) (n + 1 + m), edist (f (w (i + 1))) (f (w i)) ≤
    ∑ i in Finset.range (n + 1 + m), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
rw [← Finset.sum_union]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ ∑ x in Finset.range n ∪ Finset.Ico (n + 1) (n + 1 + m), edist (f (w (x + 1))) (f (w x)) ≤
    ∑ i in Finset.range (n + 1 + m), edist (f (w (i + 1))) (f (w i))
[PROOFSTEP]
apply Finset.sum_le_sum_of_subset _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ Finset.range n ∪ Finset.Ico (n + 1) (n + 1 + m) ⊆ Finset.range (n + 1 + m)
[PROOFSTEP]
rintro i hi
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i ∈ Finset.range n ∪ Finset.Ico (n + 1) (n + 1 + m)
⊢ i ∈ Finset.range (n + 1 + m)
[PROOFSTEP]
simp only [Finset.mem_union, Finset.mem_range, Finset.mem_Ico] at hi ⊢
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < n ∨ n + 1 ≤ i ∧ i < n + 1 + m
⊢ i < n + 1 + m
[PROOFSTEP]
cases' hi with hi hi
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < n
⊢ i < n + 1 + m
[PROOFSTEP]
exact lt_of_lt_of_le hi (n.le_succ.trans (n.succ.le_add_right m))
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : n + 1 ≤ i ∧ i < n + 1 + m
⊢ i < n + 1 + m
[PROOFSTEP]
exact hi.2
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
⊢ Disjoint (Finset.range n) (Finset.Ico (n + 1) (n + 1 + m))
[PROOFSTEP]
refine Finset.disjoint_left.2 fun i hi h'i => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i ∈ Finset.range n
h'i : i ∈ Finset.Ico (n + 1) (n + 1 + m)
⊢ False
[PROOFSTEP]
simp only [Finset.mem_Ico, Finset.mem_range] at hi h'i 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
h : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ t → x ≤ y
hs : ¬s = ∅
this✝ : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }
ht : ¬t = ∅
this : Nonempty { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
m : ℕ
v : ℕ → α
hv : Monotone v
vt : ∀ (i : ℕ), v i ∈ t
w : ℕ → α := fun i => if i ≤ n then u i else v (i - (n + 1))
wst : ∀ (i : ℕ), w i ∈ s ∪ t
hw : Monotone w
i : ℕ
hi : i < n
h'i : n + 1 ≤ i ∧ i < n + 1 + m
⊢ False
[PROOFSTEP]
exact hi.not_lt (Nat.lt_of_succ_le h'i.left)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
⊢ eVariationOn f (s ∪ t) = eVariationOn f s + eVariationOn f t
[PROOFSTEP]
classical
apply le_antisymm _ (eVariationOn.add_le_union f fun a ha b hb => le_trans (hs.2 ha) (ht.2 hb))
apply iSup_le _
rintro ⟨n, ⟨u, hu, ust⟩⟩
obtain ⟨v, m, hv, vst, xv, huv⟩ :
  ∃ (v : ℕ → α) (m : ℕ),
    Monotone v ∧
      (∀ i, v i ∈ s ∪ t) ∧
        x ∈ v '' Iio m ∧
          (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
exact eVariationOn.add_point f (mem_union_left t hs.1) u hu ust n
obtain ⟨N, hN, Nx⟩ : ∃ N, N < m ∧ v N = x
exact xv
calc
  (∑ j in Finset.range n, edist (f (u (j + 1))) (f (u j))) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j)) :=
    huv
  _ =
      (∑ j in Finset.Ico 0 N, edist (f (v (j + 1))) (f (v j))) +
        ∑ j in Finset.Ico N m, edist (f (v (j + 1))) (f (v j)) :=
    by rw [Finset.range_eq_Ico, Finset.sum_Ico_consecutive _ (zero_le _) hN.le]
  _ ≤ eVariationOn f s + eVariationOn f t := by
    refine' add_le_add _ _
    · apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
      rcases vst i with (h | h); · exact h
      have : v i = x := by
        apply le_antisymm
        · rw [← Nx]; exact hv hi.2
        · exact ht.2 h
      rw [this]
      exact hs.1
    · apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
      rcases vst i with (h | h); swap; · exact h
      have : v i = x := by
        apply le_antisymm
        · exact hs.2 h
        · rw [← Nx]; exact hv hi.1
      rw [this]
      exact ht.1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
⊢ eVariationOn f (s ∪ t) = eVariationOn f s + eVariationOn f t
[PROOFSTEP]
apply le_antisymm _ (eVariationOn.add_le_union f fun a ha b hb => le_trans (hs.2 ha) (ht.2 hb))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
⊢ eVariationOn f (s ∪ t) ≤ eVariationOn f s + eVariationOn f t
[PROOFSTEP]
apply iSup_le _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t }),
    ∑ i_1 in Finset.range i.fst, edist (f (↑i.snd (i_1 + 1))) (f (↑i.snd i_1)) ≤ eVariationOn f s + eVariationOn f t
[PROOFSTEP]
rintro ⟨n, ⟨u, hu, ust⟩⟩
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd i)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
obtain ⟨v, m, hv, vst, xv, huv⟩ :
  ∃ (v : ℕ → α) (m : ℕ),
    Monotone v ∧
      (∀ i, v i ∈ s ∪ t) ∧
        x ∈ v '' Iio m ∧
          (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
⊢ ∃ v m,
    Monotone v ∧
      (∀ (i : ℕ), v i ∈ s ∪ t) ∧
        x ∈ v '' Iio m ∧
          ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤
            ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
case mk.mk.intro.intro.intro.intro.intro.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd i)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
exact eVariationOn.add_point f (mem_union_left t hs.1) u hu ust n
[GOAL]
case mk.mk.intro.intro.intro.intro.intro.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd i)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
obtain ⟨N, hN, Nx⟩ : ∃ N, N < m ∧ v N = x
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
⊢ ∃ N, N < m ∧ v N = x
case mk.mk.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd i)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
exact xv
[GOAL]
case mk.mk.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∪ t) }).snd i)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
calc
  (∑ j in Finset.range n, edist (f (u (j + 1))) (f (u j))) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j)) :=
    huv
  _ =
      (∑ j in Finset.Ico 0 N, edist (f (v (j + 1))) (f (v j))) +
        ∑ j in Finset.Ico N m, edist (f (v (j + 1))) (f (v j)) :=
    by rw [Finset.range_eq_Ico, Finset.sum_Ico_consecutive _ (zero_le _) hN.le]
  _ ≤ eVariationOn f s + eVariationOn f t := by
    refine' add_le_add _ _
    · apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
      rcases vst i with (h | h); · exact h
      have : v i = x := by
        apply le_antisymm
        · rw [← Nx]; exact hv hi.2
        · exact ht.2 h
      rw [this]
      exact hs.1
    · apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
      rcases vst i with (h | h); swap; · exact h
      have : v i = x := by
        apply le_antisymm
        · exact hs.2 h
        · rw [← Nx]; exact hv hi.1
      rw [this]
      exact ht.1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j)) =
    ∑ j in Finset.Ico 0 N, edist (f (v (j + 1))) (f (v j)) + ∑ j in Finset.Ico N m, edist (f (v (j + 1))) (f (v j))
[PROOFSTEP]
rw [Finset.range_eq_Ico, Finset.sum_Ico_consecutive _ (zero_le _) hN.le]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ j in Finset.Ico 0 N, edist (f (v (j + 1))) (f (v j)) + ∑ j in Finset.Ico N m, edist (f (v (j + 1))) (f (v j)) ≤
    eVariationOn f s + eVariationOn f t
[PROOFSTEP]
refine' add_le_add _ _
[GOAL]
case refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ j in Finset.Ico 0 N, edist (f (v (j + 1))) (f (v j)) ≤ eVariationOn f s
[PROOFSTEP]
apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
⊢ v i ∈ s
[PROOFSTEP]
rcases vst i with (h | h)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ s
⊢ v i ∈ s
[PROOFSTEP]
exact h
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
⊢ v i ∈ s
[PROOFSTEP]
have : v i = x := by
  apply le_antisymm
  · rw [← Nx]; exact hv hi.2
  · exact ht.2 h
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
⊢ v i = x
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
⊢ v i ≤ x
[PROOFSTEP]
rw [← Nx]
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
⊢ v i ≤ v N
[PROOFSTEP]
exact hv hi.2
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
⊢ x ≤ v i
[PROOFSTEP]
exact ht.2 h
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
this : v i = x
⊢ v i ∈ s
[PROOFSTEP]
rw [this]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc 0 N
h : v i ∈ t
this : v i = x
⊢ x ∈ s
[PROOFSTEP]
exact hs.1
[GOAL]
case refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
⊢ ∑ j in Finset.Ico N m, edist (f (v (j + 1))) (f (v j)) ≤ eVariationOn f t
[PROOFSTEP]
apply sum_le_of_monotoneOn_Icc _ (hv.monotoneOn _) fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
⊢ v i ∈ t
[PROOFSTEP]
rcases vst i with (h | h)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ v i ∈ t
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ t
⊢ v i ∈ t
[PROOFSTEP]
swap
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ t
⊢ v i ∈ t
[PROOFSTEP]
exact h
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ v i ∈ t
[PROOFSTEP]
have : v i = x := by
  apply le_antisymm
  · exact hs.2 h
  · rw [← Nx]; exact hv hi.1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ v i = x
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ v i ≤ x
[PROOFSTEP]
exact hs.2 h
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ x ≤ v i
[PROOFSTEP]
rw [← Nx]
[GOAL]
case a
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
⊢ v N ≤ v i
[PROOFSTEP]
exact hv hi.1
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
this : v i = x
⊢ v i ∈ t
[PROOFSTEP]
rw [this]
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s t : Set α
x : α
hs : IsGreatest s x
ht : IsLeast t x
n : ℕ
u : ℕ → α
hu : Monotone u
ust : ∀ (i : ℕ), u i ∈ s ∪ t
v : ℕ → α
m : ℕ
hv : Monotone v
vst : ∀ (i : ℕ), v i ∈ s ∪ t
xv : x ∈ v '' Iio m
huv : ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) ≤ ∑ j in Finset.range m, edist (f (v (j + 1))) (f (v j))
N : ℕ
hN : N < m
Nx : v N = x
i : ℕ
hi : i ∈ Icc N m
h : v i ∈ s
this : v i = x
⊢ x ∈ t
[PROOFSTEP]
exact ht.1
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b c : α
hab : a ≤ b
hbc : b ≤ c
hb : b ∈ s
⊢ eVariationOn f (s ∩ Icc a b) + eVariationOn f (s ∩ Icc b c) = eVariationOn f (s ∩ Icc a c)
[PROOFSTEP]
have A : IsGreatest (s ∩ Icc a b) b := ⟨⟨hb, hab, le_rfl⟩, (inter_subset_right _ _).trans Icc_subset_Iic_self⟩
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b c : α
hab : a ≤ b
hbc : b ≤ c
hb : b ∈ s
A : IsGreatest (s ∩ Icc a b) b
⊢ eVariationOn f (s ∩ Icc a b) + eVariationOn f (s ∩ Icc b c) = eVariationOn f (s ∩ Icc a c)
[PROOFSTEP]
have B : IsLeast (s ∩ Icc b c) b := ⟨⟨hb, le_rfl, hbc⟩, (inter_subset_right _ _).trans Icc_subset_Ici_self⟩
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b c : α
hab : a ≤ b
hbc : b ≤ c
hb : b ∈ s
A : IsGreatest (s ∩ Icc a b) b
B : IsLeast (s ∩ Icc b c) b
⊢ eVariationOn f (s ∩ Icc a b) + eVariationOn f (s ∩ Icc b c) = eVariationOn f (s ∩ Icc a c)
[PROOFSTEP]
rw [← eVariationOn.union f A B, ← inter_union_distrib_left, Icc_union_Icc_eq_Icc hab hbc]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
⊢ eVariationOn (f ∘ φ) t ≤ eVariationOn f s
[PROOFSTEP]
refine' iSup_le _
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ t }),
    ∑ i_1 in Finset.range i.fst, edist ((f ∘ φ) (↑i.snd (i_1 + 1))) ((f ∘ φ) (↑i.snd i_1)) ≤ eVariationOn f s
[PROOFSTEP]
rintro ⟨n, u, hu, ut⟩
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst,
      edist ((f ∘ φ) (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd (i + 1)))
        ((f ∘ φ) (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd i)) ≤
    eVariationOn f s
[PROOFSTEP]
rw [← Finset.sum_range_reflect]
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
⊢ ∑ j in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst,
      edist
        ((f ∘ φ)
          (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd
            ((n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst - 1 - j + 1)))
        ((f ∘ φ)
          (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd
            ((n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst - 1 - j))) ≤
    eVariationOn f s
[PROOFSTEP]
refine'
  (Finset.sum_congr rfl fun x hx => _).trans_le <|
    le_iSup_of_le
      ⟨n, fun i => φ (u <| n - i), fun x y xy => hφ (ut _) (ut _) (hu <| Nat.sub_le_sub_left n xy), fun i => φst (ut _)⟩
      le_rfl
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
x : ℕ
hx : x ∈ Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst
⊢ edist
      ((f ∘ φ)
        (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd
          ((n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst - 1 - x + 1)))
      ((f ∘ φ)
        (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).snd
          ((n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst - 1 - x))) =
    edist
      (f
        (↑(n,
                { val := fun i => φ (u (n - i)),
                  property := (_ : (Monotone fun i => φ (u (n - i))) ∧ ∀ (i : ℕ), (fun i => φ (u (n - i))) i ∈ s) }).snd
          (x + 1)))
      (f
        (↑(n,
                { val := fun i => φ (u (n - i)),
                  property := (_ : (Monotone fun i => φ (u (n - i))) ∧ ∀ (i : ℕ), (fun i => φ (u (n - i))) i ∈ s) }).snd
          x))
[PROOFSTEP]
dsimp only [Subtype.coe_mk]
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
x : ℕ
hx : x ∈ Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst
⊢ edist ((f ∘ φ) (u (n - 1 - x + 1))) ((f ∘ φ) (u (n - 1 - x))) = edist (f (φ (u (n - (x + 1))))) (f (φ (u (n - x))))
[PROOFSTEP]
rw [edist_comm, Nat.sub_sub, add_comm, Nat.sub_succ, Nat.add_one, Nat.succ_pred_eq_of_pos]
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
x : ℕ
hx : x ∈ Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst
⊢ edist ((f ∘ φ) (u (Nat.pred (n - x)))) ((f ∘ φ) (u (n - x))) =
    edist (f (φ (u (Nat.pred (n - x))))) (f (φ (u (n - x))))
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
x : ℕ
hx : x ∈ Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst
⊢ 0 < n - x
[PROOFSTEP]
simp only [Function.comp_apply]
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
t : Set β
φ : β → α
hφ : AntitoneOn φ t
φst : MapsTo φ t s
n : ℕ
u : ℕ → β
hu : Monotone u
ut : ∀ (i : ℕ), u i ∈ t
x : ℕ
hx : x ∈ Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ t) }).fst
⊢ 0 < n - x
[PROOFSTEP]
simpa only [tsub_pos_iff_lt, Finset.mem_range] using hx
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
⊢ eVariationOn (f ∘ φ) t = eVariationOn f (φ '' t)
[PROOFSTEP]
apply le_antisymm (comp_le_of_monotoneOn f φ hφ (mapsTo_image φ t))
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
cases isEmpty_or_nonempty β
[GOAL]
case inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : IsEmpty β
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
convert zero_le (_ : ℝ≥0∞)
[GOAL]
case h.e'_3
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : IsEmpty β
⊢ eVariationOn f (φ '' t) = 0
[PROOFSTEP]
exact eVariationOn.subsingleton f <| (subsingleton_of_subsingleton.image _).anti (surjOn_image φ t)
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
let ψ := φ.invFunOn t
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have ψφs : EqOn (φ ∘ ψ) id (φ '' t) := (surjOn_image φ t).rightInvOn_invFunOn
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have ψts : MapsTo ψ (φ '' t) t := (surjOn_image φ t).mapsTo_invFunOn
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo ψ (φ '' t) t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have hψ : MonotoneOn ψ (φ '' t) := Function.monotoneOn_of_rightInvOn_of_mapsTo hφ ψφs ψts
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo ψ (φ '' t) t
hψ : MonotoneOn ψ (φ '' t)
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
change eVariationOn (f ∘ id) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo ψ (φ '' t) t
hψ : MonotoneOn ψ (φ '' t)
⊢ eVariationOn (f ∘ id) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
rw [← eq_of_eqOn (ψφs.comp_left : EqOn (f ∘ φ ∘ ψ) (f ∘ id) (φ '' t))]
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo ψ (φ '' t) t
hψ : MonotoneOn ψ (φ '' t)
⊢ eVariationOn (f ∘ φ ∘ ψ) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
exact comp_le_of_monotoneOn _ ψ hψ ψts
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
⊢ eVariationOn (f ∘ φ) (t ∩ Icc x y) = eVariationOn f (φ '' t ∩ Icc (φ x) (φ y))
[PROOFSTEP]
rcases le_total x y with (h | h)
[GOAL]
case inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
⊢ eVariationOn (f ∘ φ) (t ∩ Icc x y) = eVariationOn f (φ '' t ∩ Icc (φ x) (φ y))
[PROOFSTEP]
convert comp_eq_of_monotoneOn f φ (hφ.mono (Set.inter_subset_left t (Icc x y)))
[GOAL]
case h.e'_3.h.e'_6
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
⊢ φ '' t ∩ Icc (φ x) (φ y) = φ '' (t ∩ Icc x y)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case h.e'_3.h.e'_6.a
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
⊢ φ '' t ∩ Icc (φ x) (φ y) ≤ φ '' (t ∩ Icc x y)
[PROOFSTEP]
rintro _ ⟨⟨u, us, rfl⟩, vφx, vφy⟩
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
⊢ φ u ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
rcases le_total x u with (xu | ux)
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
xu : x ≤ u
⊢ φ u ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
rcases le_total u y with (uy | yu)
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inl.inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
xu : x ≤ u
uy : u ≤ y
⊢ φ u ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
exact ⟨u, ⟨us, ⟨xu, uy⟩⟩, rfl⟩
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inl.inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
xu : x ≤ u
yu : y ≤ u
⊢ φ u ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
rw [le_antisymm vφy (hφ hy us yu)]
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inl.inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
xu : x ≤ u
yu : y ≤ u
⊢ φ y ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
exact ⟨y, ⟨hy, ⟨h, le_rfl⟩⟩, rfl⟩
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
ux : u ≤ x
⊢ φ u ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
rw [← le_antisymm vφx (hφ us hx ux)]
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro.inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
us : u ∈ t
vφx : φ x ≤ φ u
vφy : φ u ≤ φ y
ux : u ≤ x
⊢ φ x ∈ φ '' (t ∩ Icc x y)
[PROOFSTEP]
exact ⟨x, ⟨hx, ⟨le_rfl, h⟩⟩, rfl⟩
[GOAL]
case h.e'_3.h.e'_6.a
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
⊢ φ '' (t ∩ Icc x y) ≤ φ '' t ∩ Icc (φ x) (φ y)
[PROOFSTEP]
rintro _ ⟨u, ⟨⟨hu, xu, uy⟩, rfl⟩⟩
[GOAL]
case h.e'_3.h.e'_6.a.intro.intro.intro.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
u : β
hu : u ∈ t
xu : x ≤ u
uy : u ≤ y
⊢ φ u ∈ φ '' t ∩ Icc (φ x) (φ y)
[PROOFSTEP]
refine' ⟨⟨u, hu, rfl⟩, ⟨hφ hx hu xu, hφ hu hy uy⟩⟩
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : y ≤ x
⊢ eVariationOn (f ∘ φ) (t ∩ Icc x y) = eVariationOn f (φ '' t ∩ Icc (φ x) (φ y))
[PROOFSTEP]
rw [eVariationOn.subsingleton, eVariationOn.subsingleton]
[GOAL]
case inr.hs
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : y ≤ x
⊢ Set.Subsingleton (φ '' t ∩ Icc (φ x) (φ y))
case inr.hs
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : y ≤ x
⊢ Set.Subsingleton (t ∩ Icc x y)
[PROOFSTEP]
exacts [(Set.subsingleton_Icc_of_ge (hφ hy hx h)).anti (Set.inter_subset_right _ _),
  (Set.subsingleton_Icc_of_ge h).anti (Set.inter_subset_right _ _)]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
⊢ eVariationOn (f ∘ φ) t = eVariationOn f (φ '' t)
[PROOFSTEP]
apply le_antisymm (comp_le_of_antitoneOn f φ hφ (mapsTo_image φ t))
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
cases isEmpty_or_nonempty β
[GOAL]
case inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : IsEmpty β
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
convert zero_le (_ : ℝ≥0∞)
[GOAL]
case h.e'_3
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : IsEmpty β
⊢ eVariationOn f (φ '' t) = 0
[PROOFSTEP]
exact eVariationOn.subsingleton f <| (subsingleton_of_subsingleton.image _).anti (surjOn_image φ t)
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
let ψ := φ.invFunOn t
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have ψφs : EqOn (φ ∘ ψ) id (φ '' t) := (surjOn_image φ t).rightInvOn_invFunOn
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have ψts := (surjOn_image φ t).mapsTo_invFunOn
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo (Function.invFunOn φ t) (φ '' t) t
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
have hψ : AntitoneOn ψ (φ '' t) := Function.antitoneOn_of_rightInvOn_of_mapsTo hφ ψφs ψts
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo (Function.invFunOn φ t) (φ '' t) t
hψ : AntitoneOn ψ (φ '' t)
⊢ eVariationOn f (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
change eVariationOn (f ∘ id) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo (Function.invFunOn φ t) (φ '' t) t
hψ : AntitoneOn ψ (φ '' t)
⊢ eVariationOn (f ∘ id) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
rw [← eq_of_eqOn (ψφs.comp_left : EqOn (f ∘ φ ∘ ψ) (f ∘ id) (φ '' t))]
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : AntitoneOn φ t
h✝ : Nonempty β
ψ : α → β := Function.invFunOn φ t
ψφs : EqOn (φ ∘ ψ) id (φ '' t)
ψts : MapsTo (Function.invFunOn φ t) (φ '' t) t
hψ : AntitoneOn ψ (φ '' t)
⊢ eVariationOn (f ∘ φ ∘ ψ) (φ '' t) ≤ eVariationOn (f ∘ φ) t
[PROOFSTEP]
exact comp_le_of_antitoneOn _ ψ hψ ψts
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
⊢ eVariationOn (f ∘ ↑ofDual) (↑ofDual ⁻¹' s) = eVariationOn f s
[PROOFSTEP]
convert comp_eq_of_antitoneOn f ofDual fun _ _ _ _ => id
[GOAL]
case h.e'_3.h.e'_6
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
β : Type u_3
inst✝ : LinearOrder β
f : α → E
s : Set α
⊢ s = ↑ofDual '' (↑ofDual ⁻¹' s)
[PROOFSTEP]
simp only [Equiv.image_preimage]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
⊢ eVariationOn f (s ∩ Icc a b) ≤ ENNReal.ofReal (f b - f a)
[PROOFSTEP]
apply iSup_le _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∩ Icc a b }),
    ∑ i_1 in Finset.range i.fst, edist (f (↑i.snd (i_1 + 1))) (f (↑i.snd i_1)) ≤ ENNReal.ofReal (f b - f a)
[PROOFSTEP]
rintro ⟨n, ⟨u, hu, us⟩⟩
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∩ Icc a b) }).fst,
      edist (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∩ Icc a b) }).snd (i + 1)))
        (f (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s ∩ Icc a b) }).snd i)) ≤
    ENNReal.ofReal (f b - f a)
[PROOFSTEP]
calc
  (∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i))) =
      ∑ i in Finset.range n, ENNReal.ofReal (f (u (i + 1)) - f (u i)) :=
    by
    refine Finset.sum_congr rfl fun i hi => ?_
    simp only [Finset.mem_range] at hi 
    rw [edist_dist, Real.dist_eq, abs_of_nonneg]
    exact sub_nonneg_of_le (hf (us i).1 (us (i + 1)).1 (hu (Nat.le_succ _)))
  _ = ENNReal.ofReal (∑ i in Finset.range n, (f (u (i + 1)) - f (u i))) :=
    by
    rw [ENNReal.ofReal_sum_of_nonneg]
    intro i _
    exact sub_nonneg_of_le (hf (us i).1 (us (i + 1)).1 (hu (Nat.le_succ _)))
  _ = ENNReal.ofReal (f (u n) - f (u 0)) := by rw [Finset.sum_range_sub fun i => f (u i)]
  _ ≤ ENNReal.ofReal (f b - f a) := by
    apply ENNReal.ofReal_le_ofReal
    exact sub_le_sub (hf (us n).1 bs (us n).2.2) (hf as (us 0).1 (us 0).2.1)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ∑ i in Finset.range n, edist (f (u (i + 1))) (f (u i)) =
    ∑ i in Finset.range n, ENNReal.ofReal (f (u (i + 1)) - f (u i))
[PROOFSTEP]
refine Finset.sum_congr rfl fun i hi => ?_
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
i : ℕ
hi : i ∈ Finset.range n
⊢ edist (f (u (i + 1))) (f (u i)) = ENNReal.ofReal (f (u (i + 1)) - f (u i))
[PROOFSTEP]
simp only [Finset.mem_range] at hi 
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
i : ℕ
hi : i < n
⊢ edist (f (u (i + 1))) (f (u i)) = ENNReal.ofReal (f (u (i + 1)) - f (u i))
[PROOFSTEP]
rw [edist_dist, Real.dist_eq, abs_of_nonneg]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
i : ℕ
hi : i < n
⊢ 0 ≤ f (u (i + 1)) - f (u i)
[PROOFSTEP]
exact sub_nonneg_of_le (hf (us i).1 (us (i + 1)).1 (hu (Nat.le_succ _)))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ∑ i in Finset.range n, ENNReal.ofReal (f (u (i + 1)) - f (u i)) =
    ENNReal.ofReal (∑ i in Finset.range n, (f (u (i + 1)) - f (u i)))
[PROOFSTEP]
rw [ENNReal.ofReal_sum_of_nonneg]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ∀ (i : ℕ), i ∈ Finset.range n → 0 ≤ f (u (i + 1)) - f (u i)
[PROOFSTEP]
intro i _
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
i : ℕ
a✝ : i ∈ Finset.range n
⊢ 0 ≤ f (u (i + 1)) - f (u i)
[PROOFSTEP]
exact sub_nonneg_of_le (hf (us i).1 (us (i + 1)).1 (hu (Nat.le_succ _)))
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ENNReal.ofReal (∑ i in Finset.range n, (f (u (i + 1)) - f (u i))) = ENNReal.ofReal (f (u n) - f (u 0))
[PROOFSTEP]
rw [Finset.sum_range_sub fun i => f (u i)]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ ENNReal.ofReal (f (u n) - f (u 0)) ≤ ENNReal.ofReal (f b - f a)
[PROOFSTEP]
apply ENNReal.ofReal_le_ofReal
[GOAL]
case h
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
hf : MonotoneOn f s
a b : α
as : a ∈ s
bs : b ∈ s
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s ∩ Icc a b
⊢ f (u n) - f (u 0) ≤ f b - f a
[PROOFSTEP]
exact sub_le_sub (hf (us n).1 bs (us n).2.2) (hf as (us 0).1 (us 0).2.1)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a : α
⊢ variationOnFromTo f s a a = 0
[PROOFSTEP]
dsimp only [variationOnFromTo]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a : α
⊢ (if a ≤ a then ENNReal.toReal (eVariationOn f (s ∩ Icc a a)) else -ENNReal.toReal (eVariationOn f (s ∩ Icc a a))) = 0
[PROOFSTEP]
rw [if_pos le_rfl, Icc_self, eVariationOn.subsingleton, ENNReal.zero_toReal]
[GOAL]
case hs
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a : α
⊢ Set.Subsingleton (s ∩ {a})
[PROOFSTEP]
exact fun x hx y hy => hx.2.trans hy.2.symm
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
h : a ≤ b
⊢ 0 ≤ variationOnFromTo f s a b
[PROOFSTEP]
simp only [variationOnFromTo, if_pos h, ENNReal.toReal_nonneg]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
⊢ variationOnFromTo f s a b = -variationOnFromTo f s b a
[PROOFSTEP]
rcases lt_trichotomy a b with (ab | rfl | ba)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
ab : a < b
⊢ variationOnFromTo f s a b = -variationOnFromTo f s b a
[PROOFSTEP]
simp only [variationOnFromTo, if_pos ab.le, if_neg ab.not_le, neg_neg]
[GOAL]
case inr.inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a : α
⊢ variationOnFromTo f s a a = -variationOnFromTo f s a a
[PROOFSTEP]
simp only [variationOnFromTo.self, neg_zero]
[GOAL]
case inr.inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
ba : b < a
⊢ variationOnFromTo f s a b = -variationOnFromTo f s b a
[PROOFSTEP]
simp only [variationOnFromTo, if_pos ba.le, if_neg ba.not_le, neg_neg]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
h : b ≤ a
⊢ variationOnFromTo f s a b ≤ 0
[PROOFSTEP]
rw [variationOnFromTo.eq_neg_swap]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
h : b ≤ a
⊢ -variationOnFromTo f s b a ≤ 0
[PROOFSTEP]
exact neg_nonpos_of_nonneg (variationOnFromTo.nonneg_of_le f s h)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
a b : α
h : b ≤ a
⊢ variationOnFromTo f s a b = -ENNReal.toReal (eVariationOn f (s ∩ Icc b a))
[PROOFSTEP]
rw [variationOnFromTo.eq_neg_swap, neg_inj, variationOnFromTo.eq_of_le f s h]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
⊢ variationOnFromTo f s a b + variationOnFromTo f s b c = variationOnFromTo f s a c
[PROOFSTEP]
symm
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
⊢ variationOnFromTo f s a c = variationOnFromTo f s a b + variationOnFromTo f s b c
[PROOFSTEP]
refine' additive_of_isTotal ((· : α) ≤ ·) (variationOnFromTo f s) (· ∈ s) _ _ ha hb hc
[GOAL]
case refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
⊢ ∀ {a b : α}, (fun x => x ∈ s) a → (fun x => x ∈ s) b → variationOnFromTo f s a b + variationOnFromTo f s b a = 0
[PROOFSTEP]
rintro x y _xs _ys
[GOAL]
case refine'_1
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
x y : α
_xs : x ∈ s
_ys : y ∈ s
⊢ variationOnFromTo f s x y + variationOnFromTo f s y x = 0
[PROOFSTEP]
simp only [variationOnFromTo.eq_neg_swap f s y x, Subtype.coe_mk, add_right_neg, forall_true_left]
[GOAL]
case refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
⊢ ∀ {a b c : α},
    (fun x x_1 => x ≤ x_1) a b →
      (fun x x_1 => x ≤ x_1) b c →
        (fun x => x ∈ s) a →
          (fun x => x ∈ s) b →
            (fun x => x ∈ s) c → variationOnFromTo f s a c = variationOnFromTo f s a b + variationOnFromTo f s b c
[PROOFSTEP]
rintro x y z xy yz xs ys zs
[GOAL]
case refine'_2
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
x y z : α
xy : x ≤ y
yz : y ≤ z
xs : x ∈ s
ys : y ∈ s
zs : z ∈ s
⊢ variationOnFromTo f s x z = variationOnFromTo f s x y + variationOnFromTo f s y z
[PROOFSTEP]
rw [variationOnFromTo.eq_of_le f s xy, variationOnFromTo.eq_of_le f s yz, variationOnFromTo.eq_of_le f s (xy.trans yz),
  ← ENNReal.toReal_add (hf x y xs ys) (hf y z ys zs), eVariationOn.Icc_add_Icc f xy yz ys]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
⊢ edist (f a) (f b) = 0
[PROOFSTEP]
wlog h' : a ≤ b
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
this :
  ∀ {α : Type u_1} [inst : LinearOrder α] {E : Type u_2} [inst_1 : PseudoEMetricSpace E],
    (α → E) →
      Set α →
        ∀ {f : α → E} {s : Set α},
          LocallyBoundedVariationOn f s →
            ∀ {a b : α}, a ∈ s → b ∈ s → variationOnFromTo f s a b = 0 → a ≤ b → edist (f a) (f b) = 0
h' : ¬a ≤ b
⊢ edist (f a) (f b) = 0
[PROOFSTEP]
rw [edist_comm]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
this :
  ∀ {α : Type u_1} [inst : LinearOrder α] {E : Type u_2} [inst_1 : PseudoEMetricSpace E],
    (α → E) →
      Set α →
        ∀ {f : α → E} {s : Set α},
          LocallyBoundedVariationOn f s →
            ∀ {a b : α}, a ∈ s → b ∈ s → variationOnFromTo f s a b = 0 → a ≤ b → edist (f a) (f b) = 0
h' : ¬a ≤ b
⊢ edist (f b) (f a) = 0
[PROOFSTEP]
apply this f s hf hb ha _ (le_of_not_le h')
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
this :
  ∀ {α : Type u_1} [inst : LinearOrder α] {E : Type u_2} [inst_1 : PseudoEMetricSpace E],
    (α → E) →
      Set α →
        ∀ {f : α → E} {s : Set α},
          LocallyBoundedVariationOn f s →
            ∀ {a b : α}, a ∈ s → b ∈ s → variationOnFromTo f s a b = 0 → a ≤ b → edist (f a) (f b) = 0
h' : ¬a ≤ b
⊢ variationOnFromTo f s b a = 0
[PROOFSTEP]
rw [variationOnFromTo.eq_neg_swap, h, neg_zero]
[GOAL]
α✝ : Type u_1
inst✝³ : LinearOrder α✝
E✝ : Type u_2
inst✝² : PseudoEMetricSpace E✝
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
h' : a ≤ b
⊢ edist (f a) (f b) = 0
[PROOFSTEP]
apply le_antisymm _ (zero_le _)
[GOAL]
α✝ : Type u_1
inst✝³ : LinearOrder α✝
E✝ : Type u_2
inst✝² : PseudoEMetricSpace E✝
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
h' : a ≤ b
⊢ edist (f a) (f b) ≤ 0
[PROOFSTEP]
rw [← ENNReal.ofReal_zero, ← h, variationOnFromTo.eq_of_le f s h', ENNReal.ofReal_toReal (hf a b ha hb)]
[GOAL]
α✝ : Type u_1
inst✝³ : LinearOrder α✝
E✝ : Type u_2
inst✝² : PseudoEMetricSpace E✝
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
h' : a ≤ b
⊢ edist (f a) (f b) ≤ eVariationOn f (s ∩ Icc a b)
[PROOFSTEP]
apply eVariationOn.edist_le
[GOAL]
case hx
α✝ : Type u_1
inst✝³ : LinearOrder α✝
E✝ : Type u_2
inst✝² : PseudoEMetricSpace E✝
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
h' : a ≤ b
⊢ a ∈ s ∩ Icc a b
case hy
α✝ : Type u_1
inst✝³ : LinearOrder α✝
E✝ : Type u_2
inst✝² : PseudoEMetricSpace E✝
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
h : variationOnFromTo f s a b = 0
h' : a ≤ b
⊢ b ∈ s ∩ Icc a b
[PROOFSTEP]
exacts [⟨ha, ⟨le_rfl, h'⟩⟩, ⟨hb, ⟨h', le_rfl⟩⟩]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b c : α
ha : a ∈ s
hb : b ∈ s
hc : c ∈ s
⊢ variationOnFromTo f s a b = variationOnFromTo f s a c ↔ variationOnFromTo f s b c = 0
[PROOFSTEP]
simp only [← variationOnFromTo.add hf ha hb hc, self_eq_add_right]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ab : a ≤ b
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ Icc a b → ∀ ⦃y : α⦄, y ∈ s ∩ Icc a b → edist (f x) (f y) = 0
[PROOFSTEP]
rw [variationOnFromTo.eq_of_le _ _ ab, ENNReal.toReal_eq_zero_iff, or_iff_left (hf a b ha hb), eVariationOn.eq_zero_iff]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ba : b ≤ a
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ Icc b a → ∀ ⦃y : α⦄, y ∈ s ∩ Icc b a → edist (f x) (f y) = 0
[PROOFSTEP]
rw [variationOnFromTo.eq_of_ge _ _ ba, neg_eq_zero, ENNReal.toReal_eq_zero_iff, or_iff_left (hf b a hb ha),
  eVariationOn.eq_zero_iff]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ uIcc a b → ∀ ⦃y : α⦄, y ∈ s ∩ uIcc a b → edist (f x) (f y) = 0
[PROOFSTEP]
rcases le_total a b with (ab | ba)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ab : a ≤ b
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ uIcc a b → ∀ ⦃y : α⦄, y ∈ s ∩ uIcc a b → edist (f x) (f y) = 0
[PROOFSTEP]
rw [uIcc_of_le ab]
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ab : a ≤ b
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ Icc a b → ∀ ⦃y : α⦄, y ∈ s ∩ Icc a b → edist (f x) (f y) = 0
[PROOFSTEP]
exact variationOnFromTo.eq_zero_iff_of_le hf ha hb ab
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ba : b ≤ a
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ uIcc a b → ∀ ⦃y : α⦄, y ∈ s ∩ uIcc a b → edist (f x) (f y) = 0
[PROOFSTEP]
rw [uIcc_of_ge ba]
[GOAL]
case inr
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
ba : b ≤ a
⊢ variationOnFromTo f s a b = 0 ↔ ∀ ⦃x : α⦄, x ∈ s ∩ Icc b a → ∀ ⦃y : α⦄, y ∈ s ∩ Icc b a → edist (f x) (f y) = 0
[PROOFSTEP]
exact variationOnFromTo.eq_zero_iff_of_ge hf ha hb ba
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
⊢ MonotoneOn (variationOnFromTo f s a) s
[PROOFSTEP]
rintro b bs c cs bc
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ variationOnFromTo f s a b ≤ variationOnFromTo f s a c
[PROOFSTEP]
rw [← variationOnFromTo.add hf as bs cs]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ variationOnFromTo f s a b ≤ variationOnFromTo f s a b + variationOnFromTo f s b c
[PROOFSTEP]
exact le_add_of_nonneg_right (variationOnFromTo.nonneg_of_le f s bc)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
b : α
bs : b ∈ s
⊢ AntitoneOn (fun a => variationOnFromTo f s a b) s
[PROOFSTEP]
rintro a as c cs ac
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
b : α
bs : b ∈ s
a : α
as : a ∈ s
c : α
cs : c ∈ s
ac : a ≤ c
⊢ (fun a => variationOnFromTo f s a b) c ≤ (fun a => variationOnFromTo f s a b) a
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
b : α
bs : b ∈ s
a : α
as : a ∈ s
c : α
cs : c ∈ s
ac : a ≤ c
⊢ variationOnFromTo f s c b ≤ variationOnFromTo f s a b
[PROOFSTEP]
rw [← variationOnFromTo.add hf as cs bs]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → E
s : Set α
hf : LocallyBoundedVariationOn f s
b : α
bs : b ∈ s
a : α
as : a ∈ s
c : α
cs : c ∈ s
ac : a ≤ c
⊢ variationOnFromTo f s c b ≤ variationOnFromTo f s a c + variationOnFromTo f s c b
[PROOFSTEP]
exact le_add_of_nonneg_left (variationOnFromTo.nonneg_of_le f s ac)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
⊢ MonotoneOn (variationOnFromTo f s a - f) s
[PROOFSTEP]
rintro b bs c cs bc
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ (variationOnFromTo f s a - f) b ≤ (variationOnFromTo f s a - f) c
[PROOFSTEP]
rw [Pi.sub_apply, Pi.sub_apply, le_sub_iff_add_le, add_comm_sub, ← le_sub_iff_add_le']
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ f c - f b ≤ variationOnFromTo f s a c - variationOnFromTo f s a b
[PROOFSTEP]
calc
  f c - f b ≤ |f c - f b| := le_abs_self _
  _ = dist (f b) (f c) := by rw [dist_comm, Real.dist_eq]
  _ ≤ variationOnFromTo f s b c := by
    rw [variationOnFromTo.eq_of_le f s bc, dist_edist]
    apply ENNReal.toReal_mono (hf b c bs cs)
    apply eVariationOn.edist_le f
    exacts [⟨bs, le_rfl, bc⟩, ⟨cs, bc, le_rfl⟩]
  _ = variationOnFromTo f s a c - variationOnFromTo f s a b := by
    rw [← variationOnFromTo.add hf as bs cs, add_sub_cancel']
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ |f c - f b| = dist (f b) (f c)
[PROOFSTEP]
rw [dist_comm, Real.dist_eq]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ dist (f b) (f c) ≤ variationOnFromTo f s b c
[PROOFSTEP]
rw [variationOnFromTo.eq_of_le f s bc, dist_edist]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ ENNReal.toReal (edist (f b) (f c)) ≤ ENNReal.toReal (eVariationOn f (s ∩ Icc b c))
[PROOFSTEP]
apply ENNReal.toReal_mono (hf b c bs cs)
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ edist (f b) (f c) ≤ eVariationOn f (s ∩ Icc b c)
[PROOFSTEP]
apply eVariationOn.edist_le f
[GOAL]
case hx
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ b ∈ s ∩ Icc b c
case hy
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ c ∈ s ∩ Icc b c
[PROOFSTEP]
exacts [⟨bs, le_rfl, bc⟩, ⟨cs, bc, le_rfl⟩]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f✝ : α → E
s✝ : Set α
f : α → ℝ
s : Set α
hf : LocallyBoundedVariationOn f s
a : α
as : a ∈ s
b : α
bs : b ∈ s
c : α
cs : c ∈ s
bc : b ≤ c
⊢ variationOnFromTo f s b c = variationOnFromTo f s a c - variationOnFromTo f s a b
[PROOFSTEP]
rw [← variationOnFromTo.add hf as bs cs, add_sub_cancel']
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
f✝ : α → E
s : Set α
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
⊢ variationOnFromTo (f ∘ φ) t x y = variationOnFromTo f (φ '' t) (φ x) (φ y)
[PROOFSTEP]
rcases le_total x y with (h | h)
[GOAL]
case inl
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
f✝ : α → E
s : Set α
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : x ≤ y
⊢ variationOnFromTo (f ∘ φ) t x y = variationOnFromTo f (φ '' t) (φ x) (φ y)
[PROOFSTEP]
rw [variationOnFromTo.eq_of_le _ _ h, variationOnFromTo.eq_of_le _ _ (hφ hx hy h),
  eVariationOn.comp_inter_Icc_eq_of_monotoneOn f φ hφ hx hy]
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
f✝ : α → E
s : Set α
β : Type u_3
inst✝ : LinearOrder β
f : α → E
t : Set β
φ : β → α
hφ : MonotoneOn φ t
x y : β
hx : x ∈ t
hy : y ∈ t
h : y ≤ x
⊢ variationOnFromTo (f ∘ φ) t x y = variationOnFromTo f (φ '' t) (φ x) (φ y)
[PROOFSTEP]
rw [variationOnFromTo.eq_of_ge _ _ h, variationOnFromTo.eq_of_ge _ _ (hφ hy hx h),
  eVariationOn.comp_inter_Icc_eq_of_monotoneOn f φ hφ hy hx]
[GOAL]
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
h : LocallyBoundedVariationOn f s
⊢ ∃ p q, MonotoneOn p s ∧ MonotoneOn q s ∧ f = p - q
[PROOFSTEP]
rcases eq_empty_or_nonempty s with (rfl | ⟨c, cs⟩)
[GOAL]
case inl
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
h : LocallyBoundedVariationOn f ∅
⊢ ∃ p q, MonotoneOn p ∅ ∧ MonotoneOn q ∅ ∧ f = p - q
[PROOFSTEP]
exact ⟨f, 0, subsingleton_empty.monotoneOn _, subsingleton_empty.monotoneOn _, (sub_zero f).symm⟩
[GOAL]
case inr.intro
α : Type u_1
inst✝¹ : LinearOrder α
E : Type u_2
inst✝ : PseudoEMetricSpace E
f : α → ℝ
s : Set α
h : LocallyBoundedVariationOn f s
c : α
cs : c ∈ s
⊢ ∃ p q, MonotoneOn p s ∧ MonotoneOn q s ∧ f = p - q
[PROOFSTEP]
exact ⟨_, _, variationOnFromTo.monotoneOn h cs, variationOnFromTo.sub_self_monotoneOn h cs, (sub_sub_cancel _ _).symm⟩
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
F : Type u_3
inst✝ : PseudoEMetricSpace F
f : E → F
C : ℝ≥0
t : Set E
h : LipschitzOnWith C f t
g : α → E
s : Set α
hg : MapsTo g s t
⊢ eVariationOn (f ∘ g) s ≤ ↑C * eVariationOn g s
[PROOFSTEP]
apply iSup_le _
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
F : Type u_3
inst✝ : PseudoEMetricSpace F
f : E → F
C : ℝ≥0
t : Set E
h : LipschitzOnWith C f t
g : α → E
s : Set α
hg : MapsTo g s t
⊢ ∀ (i : ℕ × { u // Monotone u ∧ ∀ (i : ℕ), u i ∈ s }),
    ∑ i_1 in Finset.range i.fst, edist ((f ∘ g) (↑i.snd (i_1 + 1))) ((f ∘ g) (↑i.snd i_1)) ≤ ↑C * eVariationOn g s
[PROOFSTEP]
rintro ⟨n, ⟨u, hu, us⟩⟩
[GOAL]
case mk.mk.intro
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
F : Type u_3
inst✝ : PseudoEMetricSpace F
f : E → F
C : ℝ≥0
t : Set E
h : LipschitzOnWith C f t
g : α → E
s : Set α
hg : MapsTo g s t
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
⊢ ∑ i in Finset.range (n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).fst,
      edist ((f ∘ g) (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd (i + 1)))
        ((f ∘ g) (↑(n, { val := u, property := (_ : Monotone u ∧ ∀ (i : ℕ), u i ∈ s) }).snd i)) ≤
    ↑C * eVariationOn g s
[PROOFSTEP]
calc
  (∑ i in Finset.range n, edist (f (g (u (i + 1)))) (f (g (u i)))) ≤
      ∑ i in Finset.range n, C * edist (g (u (i + 1))) (g (u i)) :=
    Finset.sum_le_sum fun i _ => h (hg (us _)) (hg (us _))
  _ = C * ∑ i in Finset.range n, edist (g (u (i + 1))) (g (u i)) := by rw [Finset.mul_sum]
  _ ≤ C * eVariationOn g s := mul_le_mul_left' (eVariationOn.sum_le _ _ hu us) _
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
E : Type u_2
inst✝¹ : PseudoEMetricSpace E
F : Type u_3
inst✝ : PseudoEMetricSpace F
f : E → F
C : ℝ≥0
t : Set E
h : LipschitzOnWith C f t
g : α → E
s : Set α
hg : MapsTo g s t
n : ℕ
u : ℕ → α
hu : Monotone u
us : ∀ (i : ℕ), u i ∈ s
⊢ ∑ i in Finset.range n, ↑C * edist (g (u (i + 1))) (g (u i)) =
    ↑C * ∑ i in Finset.range n, edist (g (u (i + 1))) (g (u i))
[PROOFSTEP]
rw [Finset.mul_sum]
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
obtain ⟨p, q, hp, hq, fpq⟩ : ∃ p q, MonotoneOn p s ∧ MonotoneOn q s ∧ f = p - q := h.exists_monotoneOn_sub_monotoneOn
[GOAL]
case intro.intro.intro.intro
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
p q : ℝ → ℝ
hp : MonotoneOn p s
hq : MonotoneOn q s
fpq : f = p - q
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
subst f
[GOAL]
case intro.intro.intro.intro
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
s : Set ℝ
p q : ℝ → ℝ
hp : MonotoneOn p s
hq : MonotoneOn q s
h : LocallyBoundedVariationOn (p - q) s
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (p - q) s x
[PROOFSTEP]
filter_upwards [hp.ae_differentiableWithinAt_of_mem, hq.ae_differentiableWithinAt_of_mem] with x hxp hxq xs
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
s : Set ℝ
p q : ℝ → ℝ
hp : MonotoneOn p s
hq : MonotoneOn q s
h : LocallyBoundedVariationOn (p - q) s
x : ℝ
hxp : x ∈ s → DifferentiableWithinAt ℝ p s x
hxq : x ∈ s → DifferentiableWithinAt ℝ q s x
xs : x ∈ s
⊢ DifferentiableWithinAt ℝ (p - q) s x
[PROOFSTEP]
exact (hxp xs).sub (hxq xs)
[GOAL]
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
have A : ∀ i : ι, LipschitzWith 1 fun x : ι → ℝ => x i := fun i => LipschitzWith.eval i
[GOAL]
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : ∀ (i : ι), LipschitzWith 1 fun x => x i
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
have : ∀ i : ι, ∀ᵐ x, x ∈ s → DifferentiableWithinAt ℝ (fun x : ℝ => f x i) s x := fun i ↦
  by
  apply ae_differentiableWithinAt_of_mem_real
  exact LipschitzWith.comp_locallyBoundedVariationOn (A i) h
[GOAL]
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : ∀ (i : ι), LipschitzWith 1 fun x => x i
i : ι
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (fun x => f x i) s x
[PROOFSTEP]
apply ae_differentiableWithinAt_of_mem_real
[GOAL]
case h
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : ∀ (i : ι), LipschitzWith 1 fun x => x i
i : ι
⊢ LocallyBoundedVariationOn (fun x => f x i) s
[PROOFSTEP]
exact LipschitzWith.comp_locallyBoundedVariationOn (A i) h
[GOAL]
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : ∀ (i : ι), LipschitzWith 1 fun x => x i
this : ∀ (i : ι), ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (fun x => f x i) s x
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
filter_upwards [ae_all_iff.2 this] with x hx xs
[GOAL]
case h
α : Type u_1
inst✝⁵ : LinearOrder α
E : Type u_2
inst✝⁴ : PseudoEMetricSpace E
V : Type u_3
inst✝³ : NormedAddCommGroup V
inst✝² : NormedSpace ℝ V
inst✝¹ : FiniteDimensional ℝ V
ι : Type u_4
inst✝ : Fintype ι
f : ℝ → ι → ℝ
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : ∀ (i : ι), LipschitzWith 1 fun x => x i
this : ∀ (i : ι), ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (fun x => f x i) s x
x : ℝ
hx : ∀ (i : ι), x ∈ s → DifferentiableWithinAt ℝ (fun x => f x i) s x
xs : x ∈ s
⊢ DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
exact differentiableWithinAt_pi.2 fun i => hx i xs
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
let A := (Basis.ofVectorSpace ℝ V).equivFun.toContinuousLinearEquiv
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
suffices H : ∀ᵐ x, x ∈ s → DifferentiableWithinAt ℝ (A ∘ f) s x
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
H : ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
filter_upwards [H] with x hx xs
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
H : ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
x : ℝ
hx :
  x ∈ s →
    DifferentiableWithinAt ℝ (↑(LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))) ∘ f) s x
xs : x ∈ s
⊢ DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
have : f = (A.symm ∘ A) ∘ f := by simp only [ContinuousLinearEquiv.symm_comp_self, Function.comp.left_id]
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
H : ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
x : ℝ
hx :
  x ∈ s →
    DifferentiableWithinAt ℝ (↑(LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))) ∘ f) s x
xs : x ∈ s
⊢ f = (↑(ContinuousLinearEquiv.symm A) ∘ ↑A) ∘ f
[PROOFSTEP]
simp only [ContinuousLinearEquiv.symm_comp_self, Function.comp.left_id]
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
H : ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
x : ℝ
hx :
  x ∈ s →
    DifferentiableWithinAt ℝ (↑(LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))) ∘ f) s x
xs : x ∈ s
this : f = (↑(ContinuousLinearEquiv.symm A) ∘ ↑A) ∘ f
⊢ DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
rw [this]
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
H : ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
x : ℝ
hx :
  x ∈ s →
    DifferentiableWithinAt ℝ (↑(LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))) ∘ f) s x
xs : x ∈ s
this : f = (↑(ContinuousLinearEquiv.symm A) ∘ ↑A) ∘ f
⊢ DifferentiableWithinAt ℝ ((↑(ContinuousLinearEquiv.symm A) ∘ ↑A) ∘ f) s x
[PROOFSTEP]
exact A.symm.differentiableAt.comp_differentiableWithinAt x (hx xs)
[GOAL]
case H
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ (↑A ∘ f) s x
[PROOFSTEP]
apply ae_differentiableWithinAt_of_mem_pi
[GOAL]
case H.h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
A : V ≃L[ℝ] ↑(Basis.ofVectorSpaceIndex ℝ V) → ℝ :=
  LinearEquiv.toContinuousLinearEquiv (Basis.equivFun (Basis.ofVectorSpace ℝ V))
⊢ LocallyBoundedVariationOn (↑A ∘ f) s
[PROOFSTEP]
exact A.lipschitz.comp_locallyBoundedVariationOn h
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
hs : MeasurableSet s
⊢ ∀ᵐ (x : ℝ) ∂Measure.restrict volume s, DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
rw [ae_restrict_iff' hs]
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
s : Set ℝ
h : LocallyBoundedVariationOn f s
hs : MeasurableSet s
⊢ ∀ᵐ (x : ℝ), x ∈ s → DifferentiableWithinAt ℝ f s x
[PROOFSTEP]
exact h.ae_differentiableWithinAt_of_mem
[GOAL]
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
h : LocallyBoundedVariationOn f univ
⊢ ∀ᵐ (x : ℝ), DifferentiableAt ℝ f x
[PROOFSTEP]
filter_upwards [h.ae_differentiableWithinAt_of_mem] with x hx
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
h : LocallyBoundedVariationOn f univ
x : ℝ
hx : x ∈ univ → DifferentiableWithinAt ℝ f univ x
⊢ DifferentiableAt ℝ f x
[PROOFSTEP]
rw [differentiableWithinAt_univ] at hx 
[GOAL]
case h
α : Type u_1
inst✝⁴ : LinearOrder α
E : Type u_2
inst✝³ : PseudoEMetricSpace E
V : Type u_3
inst✝² : NormedAddCommGroup V
inst✝¹ : NormedSpace ℝ V
inst✝ : FiniteDimensional ℝ V
f : ℝ → V
h : LocallyBoundedVariationOn f univ
x : ℝ
hx : x ∈ univ → DifferentiableAt ℝ f x
⊢ DifferentiableAt ℝ f x
[PROOFSTEP]
exact hx (mem_univ _)
