Theorem: GromovHausdorff.HD_lipschitz_aux2
File: Mathlib/Topology/MetricSpace/GromovHausdorffRealized.lean

tactic: rcases (Real.bounded_iff_bddBelow_bddAbove.1 g.bounded_range).1 with ⟨cg, hcg⟩
state_before: X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: have Hcg : ∀ x, cg ≤ g x := fun x => hcg (mem_range_self x)
state_before: case intro
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: rcases (Real.bounded_iff_bddBelow_bddAbove.1 f.bounded_range).1 with ⟨cf, hcf⟩
state_before: case intro
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: have Hcf : ∀ x, cf ≤ f x := fun x => hcf (mem_range_self x)
state_before: case intro.intro
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: have Z : (⨆ y, ⨅ x, f (inl x, inr y)) ≤ ⨆ y, ⨅ x, g (inl x, inr y) + dist f g :=
  ciSup_mono (HD_bound_aux2 _ (dist f g)) fun y =>
    ciInf_mono ⟨cf, forall_range_iff.2 fun i => Hcf _⟩ fun y => coe_le_coe_add_dist
state_before: case intro.intro
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: simpa [E2, E1]
state_before: case intro.intro
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E1 : ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E2 : (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨆ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g
⊢ (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: intro y
state_before: X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
⊢ ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g

tactic: refine' Monotone.map_ciInf_of_continuousAt (continuousAt_id.add continuousAt_const) _ _
state_before: X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y✝ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
y : Y
⊢ (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g

tactic: intro x y hx
state_before: case refine'_1
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y✝ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
y : Y
⊢ Monotone fun x => id x + dist f g

tactic: simpa
state_before: case refine'_1
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x✝ y✝¹ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
y✝ : Y
x y : ℝ
hx : x ≤ y
⊢ (fun x => id x + dist f g) x ≤ (fun x => id x + dist f g) y

tactic: show BddBelow (range fun x : X => g (inl x, inr y))
state_before: case refine'_2
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y✝ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
y : Y
⊢ BddBelow (range fun x => ↑g (inl x, inr y))

tactic: exact ⟨cg, forall_range_iff.2 fun i => Hcg _⟩
state_before: case refine'_2
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y✝ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
y : Y
⊢ BddBelow (range fun x => ↑g (inl x, inr y))

tactic: refine' Monotone.map_ciSup_of_continuousAt (continuousAt_id.add continuousAt_const) _ _
state_before: X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E1 : ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g
⊢ (⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨆ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g

tactic: intro x y hx
state_before: case refine'_1
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E1 : ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g
⊢ Monotone fun x => id x + dist f g

tactic: simpa
state_before: case refine'_1
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x✝ y✝ z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E1 : ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g
x y : ℝ
hx : x ≤ y
⊢ (fun x => id x + dist f g) x ≤ (fun x => id x + dist f g) y

tactic: simpa using HD_bound_aux2 _ 0
state_before: case refine'_2
X : Type u
Y : Type v
inst✝⁵ : MetricSpace X
inst✝⁴ : CompactSpace X
inst✝³ : Nonempty X
inst✝² : MetricSpace Y
inst✝¹ : CompactSpace Y
inst✝ : Nonempty Y
f✝ : GromovHausdorff.ProdSpaceFun X Y
x y z t : X ⊕ Y
f g : GromovHausdorff.Cb X Y
cg : ℝ
hcg : cg ∈ lowerBounds (range ↑g)
Hcg : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cg ≤ ↑g x
cf : ℝ
hcf : cf ∈ lowerBounds (range ↑f)
Hcf : ∀ (x : (X ⊕ Y) × (X ⊕ Y)), cf ≤ ↑f x
Z : (⨆ (y : Y), ⨅ (x : X), ↑f (inl x, inr y)) ≤ ⨆ (y : Y), ⨅ (x : X), ↑g (inl x, inr y) + dist f g
E1 : ∀ (y : Y), (⨅ (x : X), ↑g (inl x, inr y)) + dist f g = ⨅ (x : X), ↑g (inl x, inr y) + dist f g
⊢ BddAbove (range fun y => ⨅ (x : X), ↑g (inl x, inr y))