-- Mathlib/Topology/EMetricSpace/BoundedVariation.lean
theorem comp_le_of_antitoneOn (f : α → E) {s : Set α} {t : Set β} (φ : β → α) (hφ : AntitoneOn φ t)
    (φst : MapsTo φ t s) : eVariationOn (f ∘ φ) t ≤ eVariationOn f s

Proof state:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x))) =
    edist (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 (x + 1))) (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 x))

Tactic:
dsimp only [Subtype.coe_mk, Function.comp_apply]

Result:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist (f (φ (u (n - 1 - x + 1)))) (f (φ (u (n - 1 - x)))) = edist (f (φ (u (n - (x + 1))))) (f (φ (u (n - x))))

Proof state:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist (f (φ (u (n - 1 - x)))) (f (φ (u (n - 1 - x + 1)))) = edist (f (φ (u (n - (x + 1))))) (f (φ (u (n - x))))

Tactic:
congr 4 <;> omega

Result:
no goals

Proof state:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist (f (φ (u (n - 1 - x + 1)))) (f (φ (u (n - 1 - x)))) = edist (f (φ (u (n - (x + 1))))) (f (φ (u (n - x))))

Tactic:
rw [edist_comm]

Result:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist (f (φ (u (n - 1 - x)))) (f (φ (u (n - 1 - x + 1)))) = edist (f (φ (u (n - (x + 1))))) (f (φ (u (n - x))))

Proof state:
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 ∈ Finset.range (n, ⟨u, ⋯⟩).1, edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 (i + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 i)) ≤
    eVariationOn f s

Tactic:
rw [← Finset.sum_range_reflect]

Result:
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 ∈ Finset.range (n, ⟨u, ⋯⟩).1,
      edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - j + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - j))) ≤
    eVariationOn f s

Proof state:
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 ∈ Finset.range (n, ⟨u, ⋯⟩).1,
      edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - j + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - j))) ≤
    eVariationOn f s

Tactic:
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 xy n),
    fun i => φst (ut _)⟩
  le_rfl

Result:
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, ⟨u, ⋯⟩).1
⊢ edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x))) =
    edist (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 (x + 1))) (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 x))

Proof state:
α : 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

Tactic:
refine iSup_le ?_

Result:
α : 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 ∈ Finset.range i.1, edist ((f ∘ φ) (↑i.2 (i_1 + 1))) ((f ∘ φ) (↑i.2 i_1)) ≤ eVariationOn f s

Proof state:
α : 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 ∈ Finset.range i.1, edist ((f ∘ φ) (↑i.2 (i_1 + 1))) ((f ∘ φ) (↑i.2 i_1)) ≤ eVariationOn f s

Tactic:
rintro ⟨n, u, hu, ut⟩

Result:
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 ∈ Finset.range (n, ⟨u, ⋯⟩).1, edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 (i + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 i)) ≤
    eVariationOn f s

Proof state:
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, ⟨u, ⋯⟩).1
⊢ edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x))) =
    edist (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 (x + 1))) (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 x))

Tactic:
rw [Finset.mem_range] at hx

Result:
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 < (n, ⟨u, ⋯⟩).1
⊢ edist ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x + 1))) ((f ∘ φ) (↑(n, ⟨u, ⋯⟩).2 ((n, ⟨u, ⋯⟩).1 - 1 - x))) =
    edist (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 (x + 1))) (f (↑(n, ⟨fun i => φ (u (n - i)), ⋯⟩).2 x))