Theorem: Metric.totallyBounded_of_finite_discretization
File: Mathlib/Topology/MetricSpace/Basic.lean

tactic: cases' s.eq_empty_or_nonempty with hs hs
state_before: α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
⊢ TotallyBounded s

tactic: rcases hs with ⟨x0, hx0⟩
state_before: case inr
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
hs : Set.Nonempty s
⊢ TotallyBounded s

tactic: haveI : Inhabited s := ⟨⟨x0, hx0⟩⟩
state_before: case inr.intro
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
⊢ TotallyBounded s

tactic: refine' totallyBounded_iff.2 fun ε ε0 => _
state_before: case inr.intro
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
⊢ TotallyBounded s

tactic: rcases H ε ε0 with ⟨β, fβ, F, hF⟩
state_before: case inr.intro
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
⊢ ∃ t, Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε

tactic: let Finv := Function.invFun F
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
⊢ ∃ t, Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε

tactic: refine' ⟨range (Subtype.val ∘ Finv), finite_range _, fun x xs => _⟩
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
Finv : β → ↑s := Function.invFun F
⊢ ∃ t, Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε

tactic: let x' := Finv (F ⟨x, xs⟩)
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
Finv : β → ↑s := Function.invFun F
x : α
xs : x ∈ s
⊢ x ∈ ⋃ (y : α) (_ : y ∈ range (Subtype.val ∘ Finv)), ball y ε

tactic: have : F x' = F ⟨x, xs⟩ := Function.invFun_eq ⟨⟨x, xs⟩, rfl⟩
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
Finv : β → ↑s := Function.invFun F
x : α
xs : x ∈ s
x' : ↑s := Finv (F { val := x, property := xs })
⊢ x ∈ ⋃ (y : α) (_ : y ∈ range (Subtype.val ∘ Finv)), ball y ε

tactic: simp only [Set.mem_iUnion, Set.mem_range]
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this✝ : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
Finv : β → ↑s := Function.invFun F
x : α
xs : x ∈ s
x' : ↑s := Finv (F { val := x, property := xs })
this : F x' = F { val := x, property := xs }
⊢ x ∈ ⋃ (y : α) (_ : y ∈ range (Subtype.val ∘ Finv)), ball y ε

tactic: exact ⟨_, ⟨F ⟨x, xs⟩, rfl⟩, hF _ _ this.symm⟩
state_before: case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
x0 : α
hx0 : x0 ∈ s
this✝ : Inhabited ↑s
ε : ℝ
ε0 : ε > 0
β : Type u
fβ : Fintype β
F : ↑s → β
hF : ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
Finv : β → ↑s := Function.invFun F
x : α
xs : x ∈ s
x' : ↑s := Finv (F { val := x, property := xs })
this : F x' = F { val := x, property := xs }
⊢ ∃ i i_1, x ∈ ball i ε

tactic: rw [hs]
state_before: case inl
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
hs : s = ∅
⊢ TotallyBounded s

tactic: exact totallyBounded_empty
state_before: case inl
α : Type u
β : Type v
X : Type ?u.63903
ι : Type ?u.63906
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
hs : s = ∅
⊢ TotallyBounded ∅