Theorem: Metric.cthickening_eq_biUnion_closedBall
File: Mathlib/Topology/MetricSpace/Thickening.lean

tactic: rcases eq_empty_or_nonempty E with (rfl | hne)
state_before: ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
⊢ cthickening δ E = ⋃ x ∈ closure E, closedBall x δ
state_after: case inl
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
hδ : 0 ≤ δ
⊢ cthickening δ ∅ = ⋃ x ∈ closure ∅, closedBall x δ

case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
⊢ cthickening δ E = ⋃ x ∈ closure E, closedBall x δ

tactic: rw [← cthickening_closure]
state_before: case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
⊢ cthickening δ E = ⋃ x ∈ closure E, closedBall x δ
state_after: case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
⊢ cthickening δ (closure E) = ⋃ x ∈ closure E, closedBall x δ

tactic: refine Subset.antisymm (fun x hx ↦ ?_)
  (iUnion₂_subset fun x hx ↦ closedBall_subset_cthickening hx _)
state_before: case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
⊢ cthickening δ (closure E) = ⋃ x ∈ closure E, closedBall x δ
state_after: case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ

tactic: obtain ⟨y, yE, hy⟩ : ∃ y ∈ closure E, infDist x (closure E) = dist x y :=
  isClosed_closure.exists_infDist_eq_dist (closure_nonempty_iff.mpr hne) x
state_before: case inr
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ
state_after: case inr.intro.intro
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
y : α
yE : y ∈ closure E
hy : infDist x (closure E) = dist x y
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ

tactic: replace hy : dist x y ≤ δ :=
  (ENNReal.ofReal_le_ofReal_iff hδ).mp
    (((congr_arg ENNReal.ofReal hy.symm).le.trans ENNReal.ofReal_toReal_le).trans hx)
state_before: case inr.intro.intro
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
y : α
yE : y ∈ closure E
hy : infDist x (closure E) = dist x y
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ
state_after: case inr.intro.intro
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
y : α
yE : y ∈ closure E
hy : dist x y ≤ δ
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ

tactic: exact mem_biUnion yE hy
state_before: case inr.intro.intro
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x✝ : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
E : Set α
hδ : 0 ≤ δ
hne : E.Nonempty
x : α
hx : x ∈ cthickening δ (closure E)
y : α
yE : y ∈ closure E
hy : dist x y ≤ δ
⊢ x ∈ ⋃ x ∈ closure E, closedBall x δ
state_after: no goals

tactic: simp only [cthickening_empty, biUnion_empty, closure_empty]
state_before: case inl
ι : Sort u_1
α✝ : Type u
β : Type v
inst✝² : PseudoEMetricSpace α✝
δ ε : ℝ
s t : Set α✝
x : α✝
α : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
hδ : 0 ≤ δ
⊢ cthickening δ ∅ = ⋃ x ∈ closure ∅, closedBall x δ
state_after: no goals