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

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

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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
⊢ hausdorffDist (range (optimalGHInjl X Y)) (range (optimalGHInjr 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x 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, 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 : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
⊢ ∃ 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 : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) ≤
    ⨆ (x : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y, 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 : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) ≤
    ⨆ (x : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : (⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) < r
⊢ ∃ y, 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 : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl z, inr y)) ≤
    ⨆ (x : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : (⨅ (y : 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, y ∈ range (optimalGHInjr X Y) ∧ dist (optimalGHInjl X Y z) y ≤ r

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 : X), ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
⊢ BddAbove (range fun x => ⨅ (y : Y), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y))

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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
⊢ 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
inhabited_h : Inhabited X
⊢ 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ 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: 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
⊢ ∀ (x : OptimalGHCoupling X Y), x ∈ range (optimalGHInjr X Y) → ∃ y, y ∈ range (optimalGHInjl X Y) ∧ dist x 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
⊢ ∃ y, 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
⊢ ∃ 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) ≤
    ⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
⊢ ∃ y, 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) ≤
    ⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : (⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) < r
⊢ ∃ y, 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) ≤
    ⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : (⨅ (x : 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, y ∈ range (optimalGHInjl X Y) ∧ dist (optimalGHInjr X Y z) y ≤ 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
I2 :
  (⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr z)) ≤
    ⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)
I : (⨅ (x : 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: 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 : OptimalGHCoupling X Y), x ∈ range (optimalGHInjl X Y) → ∃ y, y ∈ range (optimalGHInjr X Y) ∧ dist x y ≤ r
z : Y
I1 : (⨆ (y : Y), ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y)) < r
⊢ BddAbove (range fun y => ⨅ (x : X), ↑(GromovHausdorff.optimalGHDist X Y) (inl x, inr y))