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

tactic: refine le_trans (le_of_forall_le_of_dense fun r hr => ?_) (HD_optimalGHDist_le X Y f h)
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr X Y)) ≤ HD f
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr X Y)) ≤ r

tactic: have A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r := by
  rintro _ ⟨z, rfl⟩
  have I1 : (⨆ x, ⨅ y, optimalGHDist X Y (inl x, inr y)) < r :=
    lt_of_le_of_lt (le_max_left _ _) hr
  have I2 :
      ⨅ y, optimalGHDist X Y (inl z, inr y) ≤ ⨆ x, ⨅ y, optimalGHDist X Y (inl x, inr y) :=
    le_csSup (by simpa using HD_bound_aux1 _ 0) (mem_range_self _)
  have I : ⨅ y, optimalGHDist X Y (inl z, inr y) < r := lt_of_le_of_lt I2 I1
  rcases exists_lt_of_csInf_lt (range_nonempty _) I with ⟨r', ⟨z', rfl⟩, hr'⟩
  exact ⟨optimalGHInjr X Y z', mem_range_self _, le_of_lt hr'⟩
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr X Y)) ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr X Y)) ≤ r

tactic: refine hausdorffDist_le_of_mem_dist ?_ A ?_
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr X Y)) ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ 0 ≤ r

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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ ∀ x ∈ range (optimalGHInjr X Y), ∃ y ∈ range (optimalGHInjl X Y), dist x y ≤ r

tactic: rintro _ ⟨z, rfl⟩
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
⊢ ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r

tactic: have I1 : (⨆ x, ⨅ y, optimalGHDist X Y (inl x, inr y)) < r :=
  lt_of_le_of_lt (le_max_left _ _) hr
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r

tactic: have I2 :
    ⨅ y, optimalGHDist X Y (inl z, inr y) ≤ ⨆ x, ⨅ y, optimalGHDist X Y (inl x, inr y) :=
  le_csSup (by simpa using HD_bound_aux1 _ 0) (mem_range_self _)
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r

tactic: have I : ⨅ y, optimalGHDist X Y (inl z, inr y) < r := lt_of_le_of_lt I2 I1
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r

tactic: rcases exists_lt_of_csInf_lt (range_nonempty _) I with ⟨r', ⟨z', rfl⟩, hr'⟩
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r
state_after: case intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) < r
z' : Y
hr' : (fun y => (GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) z' < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r

tactic: exact ⟨optimalGHInjr X Y z', mem_range_self _, le_of_lt hr'⟩
state_before: case intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) ≤ ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl z, inr y) < r
z' : Y
hr' : (fun y => (GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) z' < r
⊢ ∃ y ∈ range (optimalGHInjr X Y), dist (optimalGHInjl X Y z) y ≤ r
state_after: no goals

tactic: simpa using HD_bound_aux1 _ 0
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
z : X
I1 : ⨆ x, ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ BddAbove (range fun x => ⨅ y, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y))
state_after: no goals

tactic: inhabit X
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ 0 ≤ r
state_after: 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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
inhabited_h : Inhabited X
⊢ 0 ≤ r

tactic: rcases A _ (mem_range_self default) with ⟨y, -, hy⟩
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
inhabited_h : Inhabited X
⊢ 0 ≤ r
state_after: case refine_1.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
inhabited_h : Inhabited X
y : OptimalGHCoupling X Y
hy : dist (optimalGHInjl X Y default) y ≤ r
⊢ 0 ≤ r

tactic: exact le_trans dist_nonneg hy
state_before: case refine_1.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
inhabited_h : Inhabited X
y : OptimalGHCoupling X Y
hy : dist (optimalGHInjl X Y default) y ≤ r
⊢ 0 ≤ r
state_after: no goals

tactic: rintro _ ⟨z, rfl⟩
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
⊢ ∀ x ∈ range (optimalGHInjr X Y), ∃ y ∈ range (optimalGHInjl X Y), dist x y ≤ r
state_after: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r

tactic: have I1 : (⨆ y, ⨅ x, optimalGHDist X Y (inl x, inr y)) < r :=
  lt_of_le_of_lt (le_max_right _ _) hr
state_before: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r
state_after: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r

tactic: have I2 :
    ⨅ x, optimalGHDist X Y (inl x, inr z) ≤ ⨆ y, ⨅ x, optimalGHDist X Y (inl x, inr y) :=
  le_csSup (by simpa using HD_bound_aux2 _ 0) (mem_range_self _)
state_before: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r
state_after: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r

tactic: have I : ⨅ x, optimalGHDist X Y (inl x, inr z) < r := lt_of_le_of_lt I2 I1
state_before: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r
state_after: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r

tactic: rcases exists_lt_of_csInf_lt (range_nonempty _) I with ⟨r', ⟨z', rfl⟩, hr'⟩
state_before: case refine_2.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r
state_after: case refine_2.intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
z' : X
hr' : (fun x => (GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) z' < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r

tactic: refine ⟨optimalGHInjl X Y z', mem_range_self _, le_of_lt ?_⟩
state_before: case refine_2.intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
z' : X
hr' : (fun x => (GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) z' < r
⊢ ∃ y ∈ range (optimalGHInjl X Y), dist (optimalGHInjr X Y z) y ≤ r
state_after: case refine_2.intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
z' : X
hr' : (fun x => (GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) z' < r
⊢ dist (optimalGHInjr X Y z) (optimalGHInjl X Y z') < r

tactic: rwa [dist_comm]
state_before: case refine_2.intro.intro.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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
I2 :
  ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) ≤ ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr z) < r
z' : X
hr' : (fun x => (GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) z' < r
⊢ dist (optimalGHInjr X Y z) (optimalGHInjl X Y z') < r
state_after: no goals

tactic: simpa using HD_bound_aux2 _ 0
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.Cb X Y
h : f ∈ GromovHausdorff.candidatesB X Y
r : ℝ
hr : HD (GromovHausdorff.optimalGHDist X Y) < r
A : ∀ x ∈ range (optimalGHInjl X Y), ∃ y ∈ range (optimalGHInjr X Y), dist x y ≤ r
z : Y
I1 : ⨆ y, ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y) < r
⊢ BddAbove (range fun y => ⨅ x, (GromovHausdorff.optimalGHDist X Y) (inl x, inr y))
state_after: no goals