-- Mathlib/Topology/MetricSpace/Gluing.lean
theorem toInductiveLimit_commute (I : ∀ n, Isometry (f n)) (n : ℕ) :
    toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n

Proof state:
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
⊢ toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n

Tactic:
let h := inductivePremetric I

Result:
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
⊢ toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n

Proof state:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ dist ⟨n.succ, f n x⟩ ⟨n, x⟩ = 0

Tactic:
show inductiveLimitDist f ⟨n.succ, f n x⟩ ⟨n, x⟩ = 0

Result:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ inductiveLimitDist f ⟨n.succ, f n x⟩ ⟨n, x⟩ = 0

Proof state:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ Quotient.mk'' ⟨n.succ, f n x⟩ = Quotient.mk'' ⟨n, x⟩

Tactic:
refine SeparationQuotient.mk_eq_mk.2 (Metric.inseparable_iff.2 ?_)

Result:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ dist ⟨n.succ, f n x⟩ ⟨n, x⟩ = 0

Proof state:
case h.h2
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ ⟨n, x⟩.fst ≤ n + 1

Tactic:
exact le_succ _

Result:
no goals

Proof state:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ (toInductiveLimit I n.succ ∘ f n) x = toInductiveLimit I n x

Tactic:
simp only [comp, toInductiveLimit]

Result:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ Quotient.mk'' ⟨n.succ, f n x⟩ = Quotient.mk'' ⟨n, x⟩

Proof state:
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
⊢ toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n

Tactic:
funext x

Result:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ (toInductiveLimit I n.succ ∘ f n) x = toInductiveLimit I n x

Proof state:
case h
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ inductiveLimitDist f ⟨n.succ, f n x⟩ ⟨n, x⟩ = 0

Tactic:
rw [inductiveLimitDist_eq_dist I ⟨n.succ, f n x⟩ ⟨n, x⟩ n.succ, leRecOn_self,
  leRecOn_succ, leRecOn_self, dist_self]

Result:
case h.h2
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
x : X n
⊢ ⟨n, x⟩.fst ≤ n + 1

Proof state:
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
⊢ toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n

Tactic:
let _ := h.toUniformSpace.toTopologicalSpace

Result:
X : ℕ → Type u
inst✝ : (n : ℕ) → MetricSpace (X n)
f : (n : ℕ) → X n → X (n + 1)
I : ∀ (n : ℕ), Isometry (f n)
n : ℕ
h : PseudoMetricSpace ((n : ℕ) × X n) := inductivePremetric I
x✝ : TopologicalSpace ((n : ℕ) × X n) := UniformSpace.toTopologicalSpace
⊢ toInductiveLimit I n.succ ∘ f n = toInductiveLimit I n