Theorem: GromovHausdorff.eq_toGHSpace_iff
File: Mathlib/Topology/MetricSpace/GromovHausdorff.lean

tactic: simp only [toGHSpace, Quotient.eq]
state_before: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
⊢ ⟦p⟧ = toGHSpace X ↔ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p
state_after: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X ↔ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p

tactic: refine ⟨fun h => ?_, ?_⟩
state_before: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X ↔ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p
state_after: case refine_1
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p

case refine_2
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
⊢ (∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p) → p ≈ NonemptyCompacts.kuratowskiEmbedding X

tactic: rcases Setoid.symm h with ⟨e⟩
state_before: case refine_1
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p
state_after: case refine_1.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p

tactic: have f := (kuratowskiEmbedding.isometry X).isometryEquivOnRange.trans e
state_before: case refine_1.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p
state_after: case refine_1.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
f : X ≃ᵢ ↥p
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p

tactic: use fun x => f x, isometry_subtype_coe.comp f.isometry
state_before: case refine_1.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
f : X ≃ᵢ ↥p
⊢ ∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p
state_after: case right
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
f : X ≃ᵢ ↥p
⊢ (range fun x => ↑(f x)) = ↑p

tactic: erw [range_comp, f.range_eq_univ, Set.image_univ, Subtype.range_coe]
state_before: case right
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
h : p ≈ NonemptyCompacts.kuratowskiEmbedding X
e : ↥(NonemptyCompacts.kuratowskiEmbedding X) ≃ᵢ ↥p
f : X ≃ᵢ ↥p
⊢ (range fun x => ↑(f x)) = ↑p
state_after: no goals

tactic: rintro ⟨Ψ, ⟨isomΨ, rangeΨ⟩⟩
state_before: case refine_2
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
⊢ (∃ Ψ, Isometry Ψ ∧ range Ψ = ↑p) → p ≈ NonemptyCompacts.kuratowskiEmbedding X
state_after: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X

tactic: have f :=
  ((kuratowskiEmbedding.isometry X).isometryEquivOnRange.symm.trans
      isomΨ.isometryEquivOnRange).symm
state_before: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X
state_after: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X

tactic: have E : (range Ψ ≃ᵢ NonemptyCompacts.kuratowskiEmbedding X)
    = (p ≃ᵢ range (kuratowskiEmbedding X)) := by
  dsimp only [NonemptyCompacts.kuratowskiEmbedding]; rw [rangeΨ]; rfl
state_before: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X
state_after: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
E : (↑(range Ψ) ≃ᵢ ↥(NonemptyCompacts.kuratowskiEmbedding X)) = (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X

tactic: exact ⟨cast E f⟩
state_before: case refine_2.intro.intro
X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
E : (↑(range Ψ) ≃ᵢ ↥(NonemptyCompacts.kuratowskiEmbedding X)) = (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))
⊢ p ≈ NonemptyCompacts.kuratowskiEmbedding X
state_after: no goals

tactic: dsimp only [NonemptyCompacts.kuratowskiEmbedding]
state_before: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ (↑(range Ψ) ≃ᵢ ↥(NonemptyCompacts.kuratowskiEmbedding X)) = (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))
state_after: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ (↑(range Ψ) ≃ᵢ ↥{ carrier := range (kuratowskiEmbedding X), isCompact' := ⋯, nonempty' := ⋯ }) =
    (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))

tactic: rw [rangeΨ]
state_before: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ (↑(range Ψ) ≃ᵢ ↥{ carrier := range (kuratowskiEmbedding X), isCompact' := ⋯, nonempty' := ⋯ }) =
    (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))
state_after: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ (↑↑p ≃ᵢ ↥{ carrier := range (kuratowskiEmbedding X), isCompact' := ⋯, nonempty' := ⋯ }) =
    (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))

tactic: rfl
state_before: X : Type u
inst✝² : MetricSpace X
inst✝¹ : CompactSpace X
inst✝ : Nonempty X
p : NonemptyCompacts ↥(lp (fun n => ℝ) ⊤)
Ψ : X → ↥(lp (fun n => ℝ) ⊤)
isomΨ : Isometry Ψ
rangeΨ : range Ψ = ↑p
f : ↑(range Ψ) ≃ᵢ ↑(range (kuratowskiEmbedding X))
⊢ (↑↑p ≃ᵢ ↥{ carrier := range (kuratowskiEmbedding X), isCompact' := ⋯, nonempty' := ⋯ }) =
    (↥p ≃ᵢ ↑(range (kuratowskiEmbedding X)))
state_after: no goals