[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
⊢ s ∪ t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
rcases s.eq_empty_or_nonempty with rfl | ⟨x, hx⟩
[GOAL]
case inl
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
hs : ∅ ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
⊢ ∅ ∪ t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
rwa [empty_union]
[GOAL]
case inr.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
⊢ s ∪ t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
rcases t.eq_empty_or_nonempty with rfl | ⟨y, hy⟩
[GOAL]
case inr.intro.inl
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
ht : ∅ ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
⊢ s ∪ ∅ ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
rwa [union_empty]
[GOAL]
case inr.intro.inr.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
y : α
hy : y ∈ t
⊢ s ∪ t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
rsuffices ⟨C, hC⟩ : ∃ C, ∀ z ∈ s ∪ t, dist x z ≤ C
[GOAL]
case inr.intro.inr.intro.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
y : α
hy : y ∈ t
C : ℝ
hC : ∀ (z : α), z ∈ s ∪ t → dist x z ≤ C
⊢ s ∪ t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
[PROOFSTEP]
refine ⟨C + C, fun a ha b hb => (dist_triangle a x b).trans ?_⟩
[GOAL]
case inr.intro.inr.intro.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
y : α
hy : y ∈ t
C : ℝ
hC : ∀ (z : α), z ∈ s ∪ t → dist x z ≤ C
a : α
ha : a ∈ s ∪ t
b : α
hb : b ∈ s ∪ t
⊢ dist a x + dist x b ≤ C + C
[PROOFSTEP]
simpa only [dist_comm] using add_le_add (hC _ ha) (hC _ hb)
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s : Set α
hs : s ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
y : α
hy : y ∈ t
⊢ ∃ C, ∀ (z : α), z ∈ s ∪ t → dist x z ≤ C
[PROOFSTEP]
rcases hs with ⟨Cs, hs⟩
[GOAL]
case intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s t : Set α
ht : t ∈ {s | ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C}
x : α
hx : x ∈ s
y : α
hy : y ∈ t
Cs : ℝ
hs : ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ Cs
⊢ ∃ C, ∀ (z : α), z ∈ s ∪ t → dist x z ≤ C
[PROOFSTEP]
rcases ht with ⟨Ct, ht⟩
[GOAL]
case intro.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
dist : α → α → ℝ
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
s t : Set α
x : α
hx : x ∈ s
y : α
hy : y ∈ t
Cs : ℝ
hs : ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ Cs
Ct : ℝ
ht : ∀ ⦃x : α⦄, x ∈ t → ∀ ⦃y : α⦄, y ∈ t → dist x y ≤ Ct
⊢ ∃ C, ∀ (z : α), z ∈ s ∪ t → dist x z ≤ C
[PROOFSTEP]
refine
  ⟨max Cs (dist x y + Ct), fun z hz =>
    hz.elim (fun hz => (hs hx hz).trans (le_max_left _ _))
      (fun hz => (dist_triangle x y z).trans <| (add_le_add le_rfl (ht hy hz)).trans (le_max_right _ _))⟩
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Sort u_3
x y : α
dist : α → α → ℝ
dist_self : ∀ (x : α), dist x x = 0
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
⊢ dist x y + dist y x = 2 * dist x y
[PROOFSTEP]
rw [two_mul, dist_comm]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
m m' : PseudoMetricSpace α
h : toDist = toDist
⊢ m = m'
[PROOFSTEP]
cases' m with d _ _ _ ed hed U hU B hB
[GOAL]
case mk
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
m' : PseudoMetricSpace α
d : Dist α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
h : toDist = toDist
⊢ mk dist_self✝ dist_comm✝ dist_triangle✝ ed hed U B = m'
[PROOFSTEP]
cases' m' with d' _ _ _ ed' hed' U' hU' B' hB'
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
d' : Dist α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed' : α → α → ℝ≥0∞
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
U' : UniformSpace α
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B' : Bornology α
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
h : toDist = toDist
⊢ mk dist_self✝¹ dist_comm✝¹ dist_triangle✝¹ ed hed U B = mk dist_self✝ dist_comm✝ dist_triangle✝ ed' hed' U' B'
[PROOFSTEP]
obtain rfl : d = d' := h
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
⊢ mk dist_self✝¹ dist_comm✝¹ dist_triangle✝¹ ed hed U B = mk dist_self✝ dist_comm✝ dist_triangle✝ ed' hed' U' B'
[PROOFSTEP]
congr
[GOAL]
case mk.mk.e_edist
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
⊢ ed = ed'
[PROOFSTEP]
ext x y : 2
[GOAL]
case mk.mk.e_edist.h.h
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
x y : α
⊢ ed x y = ed' x y
[PROOFSTEP]
rw [hed, hed']
[GOAL]
case mk.mk.e_toUniformSpace
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
⊢ U = U'
[PROOFSTEP]
exact uniformSpace_eq (hU.trans hU'.symm)
[GOAL]
case mk.mk.e_toBornology
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
⊢ B = B'
[PROOFSTEP]
ext : 2
[GOAL]
case mk.mk.e_toBornology.h_cobounded.a
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
α : Type u_3
d : Dist α
dist_self✝¹ : ∀ (x : α), dist x x = 0
dist_comm✝¹ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝¹ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
ed : α → α → ℝ≥0∞
hed : ∀ (x y : α), ed x y = ENNReal.ofReal (dist x y)
U : UniformSpace α
hU : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
B : Bornology α
hB : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
ed' : α → α → ℝ≥0∞
U' : UniformSpace α
B' : Bornology α
dist_self✝ : ∀ (x : α), dist x x = 0
dist_comm✝ : ∀ (x y : α), dist x y = dist y x
dist_triangle✝ : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
hed' : ∀ (x y : α), ed' x y = ENNReal.ofReal (dist x y)
hU' : 𝓤 α = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
hB' : (cobounded α).sets = {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
s✝ : Set α
⊢ s✝ ∈ cobounded α ↔ s✝ ∈ cobounded α
[PROOFSTEP]
rw [← Filter.mem_sets, ← Filter.mem_sets, hB, hB']
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α✝
α : Type u
inst✝ : TopologicalSpace α
dist : α → α → ℝ
dist_self : ∀ (x : α), dist x x = 0
dist_comm : ∀ (x y : α), dist x y = dist y x
dist_triangle : ∀ (x y z : α), dist x z ≤ dist x y + dist y z
H : ∀ (s : Set α), IsOpen s ↔ ∀ (x : α), x ∈ s → ∃ ε, ε > 0 ∧ ∀ (y : α), dist x y < ε → y ∈ s
x y : α
⊢ (fun x y => ↑{ val := dist x y, property := (_ : 0 ≤ dist x y) }) x y = ENNReal.ofReal (Dist.dist x y)
[PROOFSTEP]
exact ENNReal.coe_nnreal_eq _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
⊢ dist x y ≤ dist z x + dist z y
[PROOFSTEP]
rw [dist_comm z]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
⊢ dist x y ≤ dist x z + dist z y
[PROOFSTEP]
apply dist_triangle
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
⊢ dist x y ≤ dist x z + dist y z
[PROOFSTEP]
rw [dist_comm y]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
⊢ dist x y ≤ dist x z + dist z y
[PROOFSTEP]
apply dist_triangle
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x₁ y₁ x₂ y₂ : α
⊢ dist x₂ y₂ ≤ dist x₁ y₁ + (dist x₁ x₂ + dist y₁ y₂)
[PROOFSTEP]
rw [add_left_comm, dist_comm x₁, ← add_assoc]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x₁ y₁ x₂ y₂ : α
⊢ dist x₂ y₂ ≤ dist x₂ x₁ + dist x₁ y₁ + dist y₁ y₂
[PROOFSTEP]
apply dist_triangle4
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x₁ y₁ x₂ y₂ : α
⊢ dist x₁ y₁ ≤ dist x₁ x₂ + dist y₁ y₂ + dist x₂ y₂
[PROOFSTEP]
rw [add_right_comm, dist_comm y₁]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x₁ y₁ x₂ y₂ : α
⊢ dist x₁ y₁ ≤ dist x₁ x₂ + dist x₂ y₂ + dist y₂ y₁
[PROOFSTEP]
apply dist_triangle4
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n : ℕ
h : m ≤ n
⊢ dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
[PROOFSTEP]
induction n, h using Nat.le_induction with
| base => rw [Finset.Ico_self, Finset.sum_empty, dist_self]
| succ n hle ihn =>
  calc
    dist (f m) (f (n + 1)) ≤ dist (f m) (f n) + dist (f n) (f (n + 1)) := dist_triangle _ _ _
    _ ≤ (∑ i in Finset.Ico m n, _) + _ := (add_le_add ihn le_rfl)
    _ = ∑ i in Finset.Ico m (n + 1), _ := by {rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm];
      simp
    }
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n : ℕ
h : m ≤ n
⊢ dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
[PROOFSTEP]
induction n, h using Nat.le_induction with
| base => rw [Finset.Ico_self, Finset.sum_empty, dist_self]
| succ n hle ihn =>
  calc
    dist (f m) (f (n + 1)) ≤ dist (f m) (f n) + dist (f n) (f (n + 1)) := dist_triangle _ _ _
    _ ≤ (∑ i in Finset.Ico m n, _) + _ := (add_le_add ihn le_rfl)
    _ = ∑ i in Finset.Ico m (n + 1), _ := by {rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm];
      simp
    }
[GOAL]
case base
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n : ℕ
⊢ dist (f m) (f m) ≤ ∑ i in Finset.Ico m m, dist (f i) (f (i + 1))
[PROOFSTEP]

| base => rw [Finset.Ico_self, Finset.sum_empty, dist_self]
[GOAL]
case base
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n : ℕ
⊢ dist (f m) (f m) ≤ ∑ i in Finset.Ico m m, dist (f i) (f (i + 1))
[PROOFSTEP]
rw [Finset.Ico_self, Finset.sum_empty, dist_self]
[GOAL]
case succ
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n✝ n : ℕ
hle : m ≤ n
ihn : dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
⊢ dist (f m) (f (n + 1)) ≤ ∑ i in Finset.Ico m (n + 1), dist (f i) (f (i + 1))
[PROOFSTEP]

| succ n hle ihn =>
  calc
    dist (f m) (f (n + 1)) ≤ dist (f m) (f n) + dist (f n) (f (n + 1)) := dist_triangle _ _ _
    _ ≤ (∑ i in Finset.Ico m n, _) + _ := (add_le_add ihn le_rfl)
    _ = ∑ i in Finset.Ico m (n + 1), _ := by {rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm];
      simp
    }
[GOAL]
case succ
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n✝ n : ℕ
hle : m ≤ n
ihn : dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
⊢ dist (f m) (f (n + 1)) ≤ ∑ i in Finset.Ico m (n + 1), dist (f i) (f (i + 1))
[PROOFSTEP]
calc
  dist (f m) (f (n + 1)) ≤ dist (f m) (f n) + dist (f n) (f (n + 1)) := dist_triangle _ _ _
  _ ≤ (∑ i in Finset.Ico m n, _) + _ := (add_le_add ihn le_rfl)
  _ = ∑ i in Finset.Ico m (n + 1), _ := by {rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm]; simp
  }
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n✝ n : ℕ
hle : m ≤ n
ihn : dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
⊢ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1)) + dist (f n) (f (n + 1)) =
    ∑ i in Finset.Ico m (n + 1), dist (f i) (f (i + 1))
[PROOFSTEP]
{rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm]; simp
}
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n✝ n : ℕ
hle : m ≤ n
ihn : dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
⊢ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1)) + dist (f n) (f (n + 1)) =
    ∑ i in Finset.Ico m (n + 1), dist (f i) (f (i + 1))
[PROOFSTEP]
rw [Nat.Ico_succ_right_eq_insert_Ico hle, Finset.sum_insert, add_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : ℕ → α
m n✝ n : ℕ
hle : m ≤ n
ihn : dist (f m) (f n) ≤ ∑ i in Finset.Ico m n, dist (f i) (f (i + 1))
⊢ ¬n ∈ Finset.Ico m n
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
⊢ Function.swap dist = dist
[PROOFSTEP]
funext x y
[GOAL]
case h.h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ Function.swap dist x y = dist x y
[PROOFSTEP]
exact dist_comm _ _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ 0 ≤ dist x y
[PROOFSTEP]
positivity
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ edist x y = ↑(nndist x y)
[PROOFSTEP]
rw [edist_dist, dist_nndist, ENNReal.ofReal_coe_nnreal]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ nndist x y = ENNReal.toNNReal (edist x y)
[PROOFSTEP]
simp [edist_nndist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
c : ℝ≥0
⊢ edist x y < ↑c ↔ nndist x y < c
[PROOFSTEP]
rw [edist_nndist, ENNReal.coe_lt_coe]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
c : ℝ≥0
⊢ edist x y ≤ ↑c ↔ nndist x y ≤ c
[PROOFSTEP]
rw [edist_nndist, ENNReal.coe_le_coe]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
r : ℝ
⊢ edist x y < ENNReal.ofReal r ↔ dist x y < r
[PROOFSTEP]
rw [edist_dist, ENNReal.ofReal_lt_ofReal_iff_of_nonneg dist_nonneg]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
r : ℝ
hr : 0 ≤ r
⊢ edist x y ≤ ENNReal.ofReal r ↔ dist x y ≤ r
[PROOFSTEP]
rw [edist_dist, ENNReal.ofReal_le_ofReal_iff hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ nndist x y = Real.toNNReal (dist x y)
[PROOFSTEP]
rw [dist_nndist, Real.toNNReal_coe]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ dist x y = ENNReal.toReal (edist x y)
[PROOFSTEP]
rw [edist_dist, ENNReal.toReal_ofReal dist_nonneg]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ y ∈ ball x ε ↔ dist x y < ε
[PROOFSTEP]
rw [dist_comm, mem_ball]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : 0 < ε
⊢ x ∈ ball x ε
[PROOFSTEP]
rwa [mem_ball, dist_self]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ ball x ε = ∅ ↔ ε ≤ 0
[PROOFSTEP]
rw [← not_nonempty_iff_eq_empty, nonempty_ball, not_lt]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ ball x 0 = ∅
[PROOFSTEP]
rw [ball_eq_empty]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : x ∈ ball y ε
⊢ ∃ ε', ε' < ε ∧ x ∈ ball y ε'
[PROOFSTEP]
simp only [mem_ball] at h ⊢
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : dist x y < ε
⊢ ∃ ε', ε' < ε ∧ dist x y < ε'
[PROOFSTEP]
exact ⟨(dist x y + ε) / 2, by linarith, by linarith⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : dist x y < ε
⊢ (dist x y + ε) / 2 < ε
[PROOFSTEP]
linarith
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : dist x y < ε
⊢ dist x y < (dist x y + ε) / 2
[PROOFSTEP]
linarith
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s : Set α
ε : ℝ
x : α
⊢ UniformSpace.ball x {p | dist p.fst p.snd < ε} = ball x ε
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝¹ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s : Set α
ε : ℝ
x x✝ : α
⊢ x✝ ∈ UniformSpace.ball x {p | dist p.fst p.snd < ε} ↔ x✝ ∈ ball x ε
[PROOFSTEP]
simp [dist_comm, UniformSpace.ball]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ y ∈ closedBall x ε ↔ dist x y ≤ ε
[PROOFSTEP]
rw [dist_comm, mem_closedBall]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ y ∈ sphere x ε ↔ dist x y = ε
[PROOFSTEP]
rw [dist_comm, mem_sphere]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : y ∈ sphere x ε
hε : ε ≠ 0
⊢ ¬x ∈ sphere x ε
[PROOFSTEP]
simpa using hε.symm
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : Subsingleton α
hε : ε ≠ 0
⊢ IsEmpty ↑(sphere x ε)
[PROOFSTEP]
rw [sphere_eq_empty_of_subsingleton hε]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : Subsingleton α
hε : ε ≠ 0
⊢ IsEmpty ↑∅
[PROOFSTEP]
infer_instance
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : 0 ≤ ε
⊢ x ∈ closedBall x ε
[PROOFSTEP]
rwa [mem_closedBall, dist_self]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ closedBall x ε = ∅ ↔ ε < 0
[PROOFSTEP]
rw [← not_nonempty_iff_eq_empty, nonempty_closedBall, not_le]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : δ + ε ≤ dist x y
⊢ ε + δ ≤ dist y x
[PROOFSTEP]
rwa [add_comm, dist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ sphere x ε ∪ ball x ε = closedBall x ε
[PROOFSTEP]
rw [union_comm, ball_union_sphere]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ closedBall x ε \ sphere x ε = ball x ε
[PROOFSTEP]
rw [← ball_union_sphere, Set.union_diff_cancel_right sphere_disjoint_ball.symm.le_bot]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ closedBall x ε \ ball x ε = sphere x ε
[PROOFSTEP]
rw [← ball_union_sphere, Set.union_diff_cancel_left sphere_disjoint_ball.symm.le_bot]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ x ∈ ball y ε ↔ y ∈ ball x ε
[PROOFSTEP]
rw [mem_ball', mem_ball]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ x ∈ closedBall y ε ↔ y ∈ closedBall x ε
[PROOFSTEP]
rw [mem_closedBall', mem_closedBall]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ x ∈ sphere y ε ↔ y ∈ sphere x ε
[PROOFSTEP]
rw [mem_sphere', mem_sphere]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ closedBall x ε = ⋂ (δ : ℝ) (_ : δ > ε), ball x δ
[PROOFSTEP]
ext y
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
y : α
⊢ y ∈ closedBall x ε ↔ y ∈ ⋂ (δ : ℝ) (_ : δ > ε), ball x δ
[PROOFSTEP]
rw [mem_closedBall, ← forall_lt_iff_le', mem_iInter₂]
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
y : α
⊢ (∀ ⦃c : ℝ⦄, ε < c → dist y x < c) ↔ ∀ (i : ℝ), i > ε → y ∈ ball x i
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : Set.Nonempty (ball x ε₁ ∩ closedBall y ε₂)
⊢ dist x y < ε₁ + ε₂
[PROOFSTEP]
rw [inter_comm] at h 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : Set.Nonempty (closedBall y ε₂ ∩ ball x ε₁)
⊢ dist x y < ε₁ + ε₂
[PROOFSTEP]
rw [add_comm, dist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : Set.Nonempty (closedBall y ε₂ ∩ ball x ε₁)
⊢ dist y x < ε₂ + ε₁
[PROOFSTEP]
exact dist_lt_add_of_nonempty_closedBall_inter_ball h
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
x : α
⊢ ⋃ (n : ℕ), s ∩ closedBall x ↑n = s
[PROOFSTEP]
rw [← inter_iUnion, iUnion_closedBall_nat, inter_univ]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z✝ : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : dist x y ≤ ε₂ - ε₁
z : α
zx : z ∈ ball x ε₁
⊢ z ∈ ball y ε₂
[PROOFSTEP]
rw [← add_sub_cancel'_right ε₁ ε₂]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z✝ : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : dist x y ≤ ε₂ - ε₁
z : α
zx : z ∈ ball x ε₁
⊢ z ∈ ball y (ε₁ + (ε₂ - ε₁))
[PROOFSTEP]
exact lt_of_le_of_lt (dist_triangle z x y) (add_lt_add_of_lt_of_le zx h)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
y : α
h : y ∈ ball x (ε / 2)
⊢ dist y x ≤ ε - ε / 2
[PROOFSTEP]
rw [sub_self_div_two]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
y : α
h : y ∈ ball x (ε / 2)
⊢ dist y x ≤ ε / 2
[PROOFSTEP]
exact le_of_lt h
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
h : y ∈ ball x ε
⊢ dist y x ≤ ε - (ε - dist y x)
[PROOFSTEP]
rw [sub_sub_self]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
p : α → Prop
x : α
H : ∃ᶠ (R : ℝ) in atTop, ∀ (y : α), y ∈ closedBall x R → p y
y : α
⊢ p y
[PROOFSTEP]
obtain ⟨R, hR, h⟩ : ∃ R ≥ dist y x, ∀ z : α, z ∈ closedBall x R → p z := frequently_iff.1 H (Ici_mem_atTop (dist y x))
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
p : α → Prop
x : α
H : ∃ᶠ (R : ℝ) in atTop, ∀ (y : α), y ∈ closedBall x R → p y
y : α
R : ℝ
hR : R ≥ dist y x
h : ∀ (z : α), z ∈ closedBall x R → p z
⊢ p y
[PROOFSTEP]
exact h _ hR
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
p : α → Prop
x : α
H : ∃ᶠ (R : ℝ) in atTop, ∀ (y : α), y ∈ ball x R → p y
y : α
⊢ p y
[PROOFSTEP]
obtain ⟨R, hR, h⟩ : ∃ R > dist y x, ∀ z : α, z ∈ ball x R → p z := frequently_iff.1 H (Ioi_mem_atTop (dist y x))
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y✝ z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
p : α → Prop
x : α
H : ∃ᶠ (R : ℝ) in atTop, ∀ (y : α), y ∈ ball x R → p y
y : α
R : ℝ
hR : R > dist y x
h : ∀ (z : α), z ∈ ball x R → p z
⊢ p y
[PROOFSTEP]
exact h _ hR
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
⊢ IsBounded s ↔ ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → dist x y ≤ C
[PROOFSTEP]
rw [isBounded_def, ← Filter.mem_sets, @PseudoMetricSpace.cobounded_sets α, mem_setOf_eq, compl_compl]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
⊢ IsBounded s ↔ ∃ C, ∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → nndist x y ≤ C
[PROOFSTEP]
simp only [isBounded_iff_exists_ge 0, NNReal.exists, ← NNReal.coe_le_coe, ← dist_nndist, NNReal.coe_mk, exists_prop]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ HasBasis (𝓤 α) (fun ε => 0 < ε) fun ε => {p | dist p.fst p.snd < ε}
[PROOFSTEP]
rw [toUniformSpace_eq]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ HasBasis (𝓤 α) (fun ε => 0 < ε) fun ε => {p | dist p.fst p.snd < ε}
[PROOFSTEP]
exact UniformSpace.hasBasis_ofFun (exists_gt _) _ _ _ _ _
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
⊢ HasBasis (𝓤 α) p fun i => {p | dist p.fst p.snd < f i}
[PROOFSTEP]
refine' ⟨fun s => uniformity_basis_dist.mem_iff.trans _⟩
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
s : Set (α × α)
⊢ (∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s) ↔ ∃ i, p i ∧ {p | dist p.fst p.snd < f i} ⊆ s
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
s : Set (α × α)
⊢ (∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s) → ∃ i, p i ∧ {p | dist p.fst p.snd < f i} ⊆ s
[PROOFSTEP]
rintro ⟨ε, ε₀, hε⟩
[GOAL]
case mp.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
s : Set (α × α)
ε : ℝ
ε₀ : 0 < ε
hε : {p | dist p.fst p.snd < ε} ⊆ s
⊢ ∃ i, p i ∧ {p | dist p.fst p.snd < f i} ⊆ s
[PROOFSTEP]
rcases hf ε₀ with ⟨i, hi, H⟩
[GOAL]
case mp.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
s : Set (α × α)
ε : ℝ
ε₀ : 0 < ε
hε : {p | dist p.fst p.snd < ε} ⊆ s
i : β
hi : p i
H : f i ≤ ε
⊢ ∃ i, p i ∧ {p | dist p.fst p.snd < f i} ⊆ s
[PROOFSTEP]
exact ⟨i, hi, fun x (hx : _ < _) => hε <| lt_of_lt_of_le hx H⟩
[GOAL]
case mpr
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (i : β), p i → 0 < f i
hf : ∀ ⦃ε : ℝ⦄, 0 < ε → ∃ i, p i ∧ f i ≤ ε
s : Set (α × α)
⊢ (∃ i, p i ∧ {p | dist p.fst p.snd < f i} ⊆ s) → ∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s
[PROOFSTEP]
exact fun ⟨i, hi, H⟩ => ⟨f i, hf₀ i hi, H⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s : Set α
ε : ℝ
ε0 : 0 < ε
n : ℕ
hn : 1 / (↑n + 1) < ε
⊢ 1 / ↑(n + 1) ≤ ε
[PROOFSTEP]
exact_mod_cast hn.le
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
⊢ HasBasis (𝓤 α) p fun x => {p | dist p.fst p.snd ≤ f x}
[PROOFSTEP]
refine' ⟨fun s => uniformity_basis_dist.mem_iff.trans _⟩
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
⊢ (∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s) ↔ ∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
⊢ (∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s) → ∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s
[PROOFSTEP]
rintro ⟨ε, ε₀, hε⟩
[GOAL]
case mp.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
ε : ℝ
ε₀ : 0 < ε
hε : {p | dist p.fst p.snd < ε} ⊆ s
⊢ ∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s
[PROOFSTEP]
rcases exists_between ε₀ with ⟨ε', hε'⟩
[GOAL]
case mp.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
ε : ℝ
ε₀ : 0 < ε
hε : {p | dist p.fst p.snd < ε} ⊆ s
ε' : ℝ
hε' : 0 < ε' ∧ ε' < ε
⊢ ∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s
[PROOFSTEP]
rcases hf ε' hε'.1 with ⟨i, hi, H⟩
[GOAL]
case mp.intro.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
ε : ℝ
ε₀ : 0 < ε
hε : {p | dist p.fst p.snd < ε} ⊆ s
ε' : ℝ
hε' : 0 < ε' ∧ ε' < ε
i : β
hi : p i
H : f i ≤ ε'
⊢ ∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s
[PROOFSTEP]
exact ⟨i, hi, fun x (hx : _ ≤ _) => hε <| lt_of_le_of_lt (le_trans hx H) hε'.2⟩
[GOAL]
case mpr
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
β : Type u_3
p : β → Prop
f : β → ℝ
hf₀ : ∀ (x : β), p x → 0 < f x
hf : ∀ (ε : ℝ), 0 < ε → ∃ x, p x ∧ f x ≤ ε
s : Set (α × α)
⊢ (∃ i, p i ∧ {p | dist p.fst p.snd ≤ f i} ⊆ s) → ∃ i, 0 < i ∧ {p | dist p.fst p.snd < i} ⊆ s
[PROOFSTEP]
exact fun ⟨i, hi, H⟩ => ⟨f i, hf₀ i hi, fun x (hx : _ < _) => H (mem_setOf.2 hx.le)⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
f : α → β
⊢ (∀ (i' : ℝ), 0 < i' → ∃ i, 0 < i ∧ Prod.map f f ⁻¹' {p | dist p.fst p.snd < i} ⊆ {p | dist p.fst p.snd < i'}) ↔
    ∀ (δ : ℝ), δ > 0 → ∃ ε, ε > 0 ∧ ∀ {a b : α}, dist (f a) (f b) < ε → dist a b < δ
[PROOFSTEP]
simp only [subset_def, Prod.forall, gt_iff_lt, preimage_setOf_eq, Prod_map, mem_setOf]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
f : α → β
⊢ UniformEmbedding f ↔
    Function.Injective f ∧
      UniformContinuous f ∧ ∀ (δ : ℝ), δ > 0 → ∃ ε, ε > 0 ∧ ∀ {a b : α}, dist (f a) (f b) < ε → dist a b < δ
[PROOFSTEP]
rw [uniformEmbedding_iff, and_comm, uniformInducing_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : ↑s), F x = F y → dist ↑x ↑y < ε
⊢ TotallyBounded s
[PROOFSTEP]
cases' s.eq_empty_or_nonempty with hs hs
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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
[PROOFSTEP]
rw [hs]
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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 ∅
[PROOFSTEP]
exact totallyBounded_empty
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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
[PROOFSTEP]
rcases hs with ⟨x0, hx0⟩
[GOAL]
case inr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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
[PROOFSTEP]
haveI : Inhabited s := ⟨⟨x0, hx0⟩⟩
[GOAL]
case inr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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
[PROOFSTEP]
refine' totallyBounded_iff.2 fun ε ε0 => _
[GOAL]
case inr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
rcases H ε ε0 with ⟨β, fβ, F, hF⟩
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
let Finv := Function.invFun F
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
refine' ⟨range (Subtype.val ∘ Finv), finite_range _, fun x xs => _⟩
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
let x' := Finv (F ⟨x, xs⟩)
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
have : F x' = F ⟨x, xs⟩ := Function.invFun_eq ⟨⟨x, xs⟩, rfl⟩
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
simp only [Set.mem_iUnion, Set.mem_range]
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
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 ε
[PROOFSTEP]
exact ⟨_, ⟨F ⟨x, xs⟩, rfl⟩, hF _ _ this.symm⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ s : Set α
hs : TotallyBounded s
⊢ ∀ (ε : ℝ), ε > 0 → ∃ t, t ⊆ s ∧ Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε
[PROOFSTEP]
intro ε ε_pos
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
hs : TotallyBounded s
ε : ℝ
ε_pos : ε > 0
⊢ ∃ t, t ⊆ s ∧ Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε
[PROOFSTEP]
rw [totallyBounded_iff_subset] at hs 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
hs : ∀ (d : Set (α × α)), d ∈ 𝓤 α → ∃ t, t ⊆ s ∧ Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), {x | (x, y) ∈ d}
ε : ℝ
ε_pos : ε > 0
⊢ ∃ t, t ⊆ s ∧ Set.Finite t ∧ s ⊆ ⋃ (y : α) (_ : y ∈ t), ball y ε
[PROOFSTEP]
exact hs _ (dist_mem_uniformity ε_pos)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
p' : Filter β
⊢ TendstoUniformlyOnFilter F f p p' ↔ ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι × β) in p ×ˢ p', dist (f n.snd) (F n.fst n.snd) < ε
[PROOFSTEP]
refine' ⟨fun H ε hε => H _ (dist_mem_uniformity hε), fun H u hu => _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
p' : Filter β
H : ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι × β) in p ×ˢ p', dist (f n.snd) (F n.fst n.snd) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (n : ι × β) in p ×ˢ p', (f n.snd, F n.fst n.snd) ∈ u
[PROOFSTEP]
rcases mem_uniformity_dist.1 hu with ⟨ε, εpos, hε⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
p' : Filter β
H : ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι × β) in p ×ˢ p', dist (f n.snd) (F n.fst n.snd) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
εpos : ε > 0
hε : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
⊢ ∀ᶠ (n : ι × β) in p ×ˢ p', (f n.snd, F n.fst n.snd) ∈ u
[PROOFSTEP]
refine' (H ε εpos).mono fun n hn => hε hn
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
inst✝ : TopologicalSpace β
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
⊢ TendstoLocallyUniformlyOn F f p s ↔
    ∀ (ε : ℝ), ε > 0 → ∀ (x : β), x ∈ s → ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
[PROOFSTEP]
refine' ⟨fun H ε hε => H _ (dist_mem_uniformity hε), fun H u hu x hx => _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
inst✝ : TopologicalSpace β
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
H : ∀ (ε : ℝ), ε > 0 → ∀ (x : β), x ∈ s → ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
x : β
hx : x ∈ s
⊢ ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → (f y, F n y) ∈ u
[PROOFSTEP]
rcases mem_uniformity_dist.1 hu with ⟨ε, εpos, hε⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
inst✝ : TopologicalSpace β
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
H : ∀ (ε : ℝ), ε > 0 → ∀ (x : β), x ∈ s → ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
x : β
hx : x ∈ s
ε : ℝ
εpos : ε > 0
hε : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
⊢ ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → (f y, F n y) ∈ u
[PROOFSTEP]
rcases H ε εpos x hx with ⟨t, ht, Ht⟩
[GOAL]
case intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
inst✝ : TopologicalSpace β
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
H : ∀ (ε : ℝ), ε > 0 → ∀ (x : β), x ∈ s → ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
x : β
hx : x ∈ s
ε : ℝ
εpos : ε > 0
hε : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
t : Set β
ht : t ∈ 𝓝[s] x
Ht : ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
⊢ ∃ t, t ∈ 𝓝[s] x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → (f y, F n y) ∈ u
[PROOFSTEP]
exact ⟨t, ht, Ht.mono fun n hs x hx => hε (hs x hx)⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
⊢ TendstoUniformlyOn F f p s ↔ ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ s → dist (f x) (F n x) < ε
[PROOFSTEP]
refine' ⟨fun H ε hε => H _ (dist_mem_uniformity hε), fun H u hu => _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
H : ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ s → dist (f x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ s → (f x, F n x) ∈ u
[PROOFSTEP]
rcases mem_uniformity_dist.1 hu with ⟨ε, εpos, hε⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
s : Set β
H : ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ s → dist (f x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
εpos : ε > 0
hε : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
⊢ ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ s → (f x, F n x) ∈ u
[PROOFSTEP]
exact (H ε εpos).mono fun n hs x hx => hε (hs x hx)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
inst✝ : TopologicalSpace β
F : ι → β → α
f : β → α
p : Filter ι
⊢ TendstoLocallyUniformly F f p ↔
    ∀ (ε : ℝ), ε > 0 → ∀ (x : β), ∃ t, t ∈ 𝓝 x ∧ ∀ᶠ (n : ι) in p, ∀ (y : β), y ∈ t → dist (f y) (F n y) < ε
[PROOFSTEP]
simp only [← tendstoLocallyUniformlyOn_univ, tendstoLocallyUniformlyOn_iff, nhdsWithin_univ, mem_univ, forall_const,
  exists_prop]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
⊢ TendstoUniformly F f p ↔ ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), dist (f x) (F n x) < ε
[PROOFSTEP]
rw [← tendstoUniformlyOn_univ, tendstoUniformlyOn_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
ι : Type u_3
F : ι → β → α
f : β → α
p : Filter ι
⊢ (∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), x ∈ univ → dist (f x) (F n x) < ε) ↔
    ∀ (ε : ℝ), ε > 0 → ∀ᶠ (n : ι) in p, ∀ (x : β), dist (f x) (F n x) < ε
[PROOFSTEP]
simp
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α✝
x y z : α✝
δ ε ε₁ ε₂ : ℝ
s : Set α✝
ι : Type u_3
α : Type u_4
inst✝ : PseudoMetricSpace α
f : Filter ι
x₀ : α
p : α × ι → Prop
⊢ (∀ᶠ (x : α × ι) in 𝓝 x₀ ×ˢ f, p x) ↔
    ∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (x, i)
[PROOFSTEP]
refine (nhds_basis_ball.prod f.basis_sets).eventually_iff.trans ?_
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α✝
x y z : α✝
δ ε ε₁ ε₂ : ℝ
s : Set α✝
ι : Type u_3
α : Type u_4
inst✝ : PseudoMetricSpace α
f : Filter ι
x₀ : α
p : α × ι → Prop
⊢ (∃ i, (0 < i.fst ∧ i.snd ∈ f) ∧ ∀ ⦃x : α × ι⦄, x ∈ ball x₀ i.fst ×ˢ id i.snd → p x) ↔
    ∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (x, i)
[PROOFSTEP]
simp only [Prod.exists, forall_prod_set, id, mem_ball, and_assoc, exists_and_left, and_imp]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝¹ : PseudoMetricSpace α✝
x y z : α✝
δ ε ε₁ ε₂ : ℝ
s : Set α✝
ι : Type u_3
α : Type u_4
inst✝ : PseudoMetricSpace α
f : Filter ι
x₀ : α
p : α × ι → Prop
⊢ (∃ a, 0 < a ∧ ∃ x, x ∈ f ∧ ∀ (x_1 : α), dist x_1 x₀ < a → ∀ (y : ι), y ∈ x → p (x_1, y)) ↔
    ∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (x, i)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
⊢ (∀ᶠ (x : ι × α) in f ×ˢ 𝓝 x₀, p x) ↔
    ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∃ ε, ε > 0 ∧ ∀ {i : ι}, pa i → ∀ {x : α}, dist x x₀ < ε → p (i, x)
[PROOFSTEP]
rw [eventually_swap_iff, Metric.eventually_nhds_prod_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
⊢ (∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (Prod.swap (x, i))) ↔
    ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∃ ε, ε > 0 ∧ ∀ {i : ι}, pa i → ∀ {x : α}, dist x x₀ < ε → p (i, x)
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
⊢ (∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (Prod.swap (x, i))) →
    ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∃ ε, ε > 0 ∧ ∀ {i : ι}, pa i → ∀ {x : α}, dist x x₀ < ε → p (i, x)
[PROOFSTEP]
rintro ⟨a1, a2, a3, a4, a5⟩
[GOAL]
case mp.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
a1 : ℝ
a2 : a1 > 0
a3 : ι → Prop
a4 : ∀ᶠ (i : ι) in f, a3 i
a5 : ∀ {x : α}, dist x x₀ < a1 → ∀ {i : ι}, a3 i → p (Prod.swap (x, i))
⊢ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∃ ε, ε > 0 ∧ ∀ {i : ι}, pa i → ∀ {x : α}, dist x x₀ < ε → p (i, x)
[PROOFSTEP]
exact ⟨a3, a4, a1, a2, fun b1 b2 b3 => a5 b3 b1⟩
[GOAL]
case mpr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
⊢ (∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∃ ε, ε > 0 ∧ ∀ {i : ι}, pa i → ∀ {x : α}, dist x x₀ < ε → p (i, x)) →
    ∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (Prod.swap (x, i))
[PROOFSTEP]
rintro ⟨a1, a2, a3, a4, a5⟩
[GOAL]
case mpr.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
f : Filter ι
x₀ : α
p : ι × α → Prop
a1 : ι → Prop
a2 : ∀ᶠ (i : ι) in f, a1 i
a3 : ℝ
a4 : a3 > 0
a5 : ∀ {i : ι}, a1 i → ∀ {x : α}, dist x x₀ < a3 → p (i, x)
⊢ ∃ ε, ε > 0 ∧ ∃ pa, (∀ᶠ (i : ι) in f, pa i) ∧ ∀ {x : α}, dist x x₀ < ε → ∀ {i : ι}, pa i → p (Prod.swap (x, i))
[PROOFSTEP]
exact ⟨a3, a4, a1, a2, fun b1 b2 b3 => a5 b3 b1⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
⊢ IsOpen s ↔ ∀ (x : α), x ∈ s → ∃ ε, ε > 0 ∧ ball x ε ⊆ s
[PROOFSTEP]
simp only [isOpen_iff_mem_nhds, mem_nhds_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
t : Set β
f : α → β
a : α
b : β
⊢ (∀ (ib : ℝ), 0 < ib → ∃ ia, 0 < ia ∧ ∀ (x : α), x ∈ ball a ia ∩ s → f x ∈ ball b ib ∩ t) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → f x ∈ t ∧ dist (f x) b < ε
[PROOFSTEP]
simp only [inter_comm _ s, inter_comm _ t, mem_inter_iff, and_imp]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
t : Set β
f : α → β
a : α
b : β
⊢ (∀ (ib : ℝ), 0 < ib → ∃ ia, 0 < ia ∧ ∀ (x : α), x ∈ s → x ∈ ball a ia → f x ∈ t ∧ f x ∈ ball b ib) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → f x ∈ t ∧ dist (f x) b < ε
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
f : α → β
a : α
b : β
⊢ Tendsto f (𝓝[s] a) (𝓝 b) ↔ ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → dist (f x) b < ε
[PROOFSTEP]
rw [← nhdsWithin_univ b, tendsto_nhdsWithin_nhdsWithin]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
f : α → β
a : α
b : β
⊢ (∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → f x ∈ univ ∧ dist (f x) b < ε) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → dist (f x) b < ε
[PROOFSTEP]
simp only [mem_univ, true_and_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : PseudoMetricSpace β
f : α → β
a : α
⊢ ContinuousAt f a ↔ ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, dist x a < δ → dist (f x) (f a) < ε
[PROOFSTEP]
rw [ContinuousAt, tendsto_nhds_nhds]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : PseudoMetricSpace β
f : α → β
a : α
s : Set α
⊢ ContinuousWithinAt f s a ↔ ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {x : α}, x ∈ s → dist x a < δ → dist (f x) (f a) < ε
[PROOFSTEP]
rw [ContinuousWithinAt, tendsto_nhdsWithin_nhds]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : PseudoMetricSpace β
f : α → β
s : Set α
⊢ ContinuousOn f s ↔
    ∀ (b : α), b ∈ s → ∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ (a : α), a ∈ s → dist a b < δ → dist (f a) (f b) < ε
[PROOFSTEP]
simp [ContinuousOn, continuousWithinAt_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝ : TopologicalSpace β
f : β → α
b : β
⊢ ContinuousAt f b ↔ ∀ (ε : ℝ), ε > 0 → ∀ᶠ (x : β) in 𝓝 b, dist (f x) (f b) < ε
[PROOFSTEP]
rw [ContinuousAt, tendsto_nhds]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : TopologicalSpace β
f : β → α
b : β
s : Set β
⊢ ContinuousWithinAt f s b ↔ ∀ (ε : ℝ), ε > 0 → ∀ᶠ (x : β) in 𝓝[s] b, dist (f x) (f b) < ε
[PROOFSTEP]
rw [ContinuousWithinAt, tendsto_nhds]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : TopologicalSpace β
f : β → α
s : Set β
⊢ ContinuousOn f s ↔ ∀ (b : β), b ∈ s → ∀ (ε : ℝ), ε > 0 → ∀ᶠ (x : β) in 𝓝[s] b, dist (f x) (f b) < ε
[PROOFSTEP]
simp [ContinuousOn, continuousWithinAt_iff']
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
a : α
⊢ (∀ (ib : ℝ), 0 < ib → ∃ ia, True ∧ ∀ (x : β), x ∈ Ici ia → u x ∈ ball a ib) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (n : β), n ≥ N → dist (u n) a < ε
[PROOFSTEP]
simp only [true_and]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
a : α
⊢ (∀ (ib : ℝ), 0 < ib → ∃ ia, ∀ (x : β), x ∈ Ici ia → u x ∈ ball a ib) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (n : β), n ≥ N → dist (u n) a < ε
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
x y z : α
δ ε ε₁ ε₂ : ℝ
s : Set α
inst✝² : Nonempty β
inst✝¹ : SemilatticeSup β
inst✝ : NoMaxOrder β
u : β → α
a : α
⊢ (∀ (ib : ℝ), 0 < ib → ∃ ia, True ∧ ∀ (x : β), x ∈ Ioi ia → u x ∈ ball a ib) ↔
    ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (n : β), n > N → dist (u n) a < ε
[PROOFSTEP]
simp only [true_and, gt_iff_lt, mem_Ioi, mem_ball]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α✝
x✝ y z : α✝
δ ε ε₁ ε₂ : ℝ
s : Set α✝
α : Type u_3
inst✝ : PseudoMetricSpace α
x : α
⊢ IsOpen {x} ↔ ∃ ε, ε > 0 ∧ ∀ (y : α), dist y x < ε → y = x
[PROOFSTEP]
simp [isOpen_iff, subset_singleton_iff, mem_ball]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
hs : Dense s
x : α
ε : ℝ
hε : 0 < ε
⊢ ∃ y, y ∈ s ∧ dist x y < ε
[PROOFSTEP]
have : (ball x ε).Nonempty := by simp [hε]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
hs : Dense s
x : α
ε : ℝ
hε : 0 < ε
⊢ Set.Nonempty (ball x ε)
[PROOFSTEP]
simp [hε]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
δ ε✝ ε₁ ε₂ : ℝ
s✝ s : Set α
hs : Dense s
x : α
ε : ℝ
hε : 0 < ε
this : Set.Nonempty (ball x ε)
⊢ ∃ y, y ∈ s ∧ dist x y < ε
[PROOFSTEP]
simpa only [mem_ball'] using hs.exists_mem_open isOpen_ball this
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
⊢ ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε} = ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
simp only [le_antisymm_iff, le_iInf_iff, le_principal_iff]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
⊢ (∀ (i : ℝ≥0∞), i > 0 → {p | ↑(d p.fst p.snd) < i} ∈ ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}) ∧
    ∀ (i : ℝ), i > 0 → {p | ↑(d p.fst p.snd) < i} ∈ ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
refine ⟨fun ε hε => ?_, fun ε hε => ?_⟩
[GOAL]
case refine_1
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ≥0∞
hε : ε > 0
⊢ {p | ↑(d p.fst p.snd) < ε} ∈ ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
rcases ENNReal.lt_iff_exists_nnreal_btwn.1 hε with ⟨ε', ε'0, ε'ε⟩
[GOAL]
case refine_1.intro.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ≥0∞
hε : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
⊢ {p | ↑(d p.fst p.snd) < ε} ∈ ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
refine mem_iInf_of_mem (ε' : ℝ) (mem_iInf_of_mem (ENNReal.coe_pos.1 ε'0) ?_)
[GOAL]
case refine_1.intro.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ≥0∞
hε : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
⊢ {p | ↑(d p.fst p.snd) < ε} ∈ 𝓟 {p | ↑(d p.fst p.snd) < ↑ε'}
[PROOFSTEP]
exact fun x hx => lt_trans (ENNReal.coe_lt_coe.2 hx) ε'ε
[GOAL]
case refine_2
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ
hε : ε > 0
⊢ {p | ↑(d p.fst p.snd) < ε} ∈ ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
lift ε to ℝ≥0 using le_of_lt hε
[GOAL]
case refine_2.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ≥0
hε : ↑ε > 0
⊢ {p | ↑(d p.fst p.snd) < ↑ε} ∈ ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | ↑(d p.fst p.snd) < ε}
[PROOFSTEP]
refine mem_iInf_of_mem (ε : ℝ≥0∞) (mem_iInf_of_mem (ENNReal.coe_pos.2 hε) ?_)
[GOAL]
case refine_2.intro
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
d : α → α → ℝ≥0
ε : ℝ≥0
hε : ↑ε > 0
⊢ {p | ↑(d p.fst p.snd) < ↑ε} ∈ 𝓟 {p | ↑(d p.fst p.snd) < ↑ε}
[PROOFSTEP]
exact fun _ => ENNReal.coe_lt_coe.1
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
⊢ 𝓤 α = ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | edist p.fst p.snd < ε}
[PROOFSTEP]
simp only [PseudoMetricSpace.uniformity_dist, dist_nndist, edist_nndist, Metric.uniformity_edist_aux]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
⊢ ∀ (x : α), EDist.edist x x = 0
[PROOFSTEP]
simp [edist_dist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
x✝¹ x✝ : α
⊢ EDist.edist x✝¹ x✝ = EDist.edist x✝ x✝¹
[PROOFSTEP]
simp only [edist_dist, dist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
x y z : α
⊢ EDist.edist x z ≤ EDist.edist x y + EDist.edist y z
[PROOFSTEP]
simp only [edist_dist, ← ENNReal.ofReal_add, dist_nonneg]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
x y z : α
⊢ ENNReal.ofReal (dist x z) ≤ ENNReal.ofReal (dist x y + dist y z)
[PROOFSTEP]
rw [ENNReal.ofReal_le_ofReal_iff _]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
x y z : α
⊢ dist x z ≤ dist x y + dist y z
[PROOFSTEP]
exact dist_triangle _ _ _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
src✝ : PseudoMetricSpace α := inst✝
x y z : α
⊢ 0 ≤ dist x y + dist y z
[PROOFSTEP]
simpa using add_le_add (dist_nonneg : 0 ≤ dist x y) dist_nonneg
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ
⊢ EMetric.ball x (ENNReal.ofReal ε) = ball x ε
[PROOFSTEP]
ext y
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ
y : α
⊢ y ∈ EMetric.ball x (ENNReal.ofReal ε) ↔ y ∈ ball x ε
[PROOFSTEP]
simp only [EMetric.mem_ball, mem_ball, edist_dist]
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ
y : α
⊢ ENNReal.ofReal (dist y x) < ENNReal.ofReal ε ↔ dist y x < ε
[PROOFSTEP]
exact ENNReal.ofReal_lt_ofReal_iff_of_nonneg dist_nonneg
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ≥0
⊢ EMetric.ball x ↑ε = ball x ↑ε
[PROOFSTEP]
rw [← Metric.emetric_ball]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ≥0
⊢ EMetric.ball x ↑ε = EMetric.ball x (ENNReal.ofReal ↑ε)
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ
h : 0 ≤ ε
⊢ EMetric.closedBall x (ENNReal.ofReal ε) = closedBall x ε
[PROOFSTEP]
ext y
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ
h : 0 ≤ ε
y : α
⊢ y ∈ EMetric.closedBall x (ENNReal.ofReal ε) ↔ y ∈ closedBall x ε
[PROOFSTEP]
simp [edist_le_ofReal h]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
ε : ℝ≥0
⊢ EMetric.closedBall x ↑ε = closedBall x ↑ε
[PROOFSTEP]
rw [← Metric.emetric_closedBall ε.coe_nonneg, ENNReal.ofReal_coe_nnreal]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : α
⊢ Inseparable x y ↔ dist x y = 0
[PROOFSTEP]
rw [EMetric.inseparable_iff, edist_nndist, dist_nndist, ENNReal.coe_eq_zero, NNReal.coe_eq_zero]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
U : UniformSpace α
m : PseudoMetricSpace α
H : 𝓤 α = 𝓤 α
⊢ replaceUniformity m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
U : UniformSpace α
m : PseudoMetricSpace α
H : 𝓤 α = 𝓤 α
x✝¹ x✝ : α
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
γ : Type u_3
U : TopologicalSpace γ
m : PseudoMetricSpace γ
H : U = UniformSpace.toTopologicalSpace
⊢ replaceTopology m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
γ : Type u_3
U : TopologicalSpace γ
m : PseudoMetricSpace γ
H : U = UniformSpace.toTopologicalSpace
x✝¹ x✝ : γ
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
x : α
⊢ Dist.dist x x = 0
[PROOFSTEP]
simp [h]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
x y : α
⊢ Dist.dist x y = Dist.dist y x
[PROOFSTEP]
simp [h, edist_comm]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
x y z : α
⊢ Dist.dist x z ≤ Dist.dist x y + Dist.dist y z
[PROOFSTEP]
simp only [h]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
x y z : α
⊢ ENNReal.toReal (edist x z) ≤ ENNReal.toReal (edist x y) + ENNReal.toReal (edist y z)
[PROOFSTEP]
exact ENNReal.toReal_le_add (edist_triangle _ _ _) (edist_ne_top _ _) (edist_ne_top _ _)
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
x✝¹ x✝ : α
⊢ edist x✝¹ x✝ = ENNReal.ofReal (Dist.dist x✝¹ x✝)
[PROOFSTEP]
simp only [h, ENNReal.ofReal_toReal (edist_ne_top _ _)]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u
e : PseudoEMetricSpace α
dist : α → α → ℝ
edist_ne_top : ∀ (x y : α), edist x y ≠ ⊤
h : ∀ (x y : α), dist x y = ENNReal.toReal (edist x y)
⊢ ⨅ (ε : ℝ≥0∞) (_ : ε > 0), 𝓟 {p | edist p.fst p.snd < ε} = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | Dist.dist p.fst p.snd < ε}
[PROOFSTEP]
simpa only [ENNReal.coe_toNNReal (edist_ne_top _ _), h] using
  (Metric.uniformity_edist_aux fun x y : α => (edist x y).toNNReal).symm
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type ?u.169779
B : Bornology α
m : PseudoMetricSpace α
H : ∀ (s : Set α), IsBounded s ↔ IsBounded s
s : Set α
⊢ IsBounded s ↔ sᶜ ∈ {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
[PROOFSTEP]
rw [isBounded_iff, mem_setOf_eq, compl_compl]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
m : PseudoMetricSpace α
B : Bornology α
H : ∀ (s : Set α), IsBounded s ↔ IsBounded s
⊢ replaceBornology m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
m : PseudoMetricSpace α
B : Bornology α
H : ∀ (s : Set α), IsBounded s ↔ IsBounded s
x✝¹ x✝ : α
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
⊢ ∀ (x : ℝ), dist x x = 0
[PROOFSTEP]
simp [abs_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : ℝ
⊢ (fun x y => ↑{ val := |x - y|, property := (_ : 0 ≤ |x - y|) }) x y = ENNReal.ofReal (dist x y)
[PROOFSTEP]
exact ENNReal.coe_nnreal_eq _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : ℝ
⊢ dist x 0 = |x|
[PROOFSTEP]
simp [Real.dist_eq]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : ℝ
h : y ∈ uIcc x z
⊢ dist x y ≤ dist x z
[PROOFSTEP]
simpa only [dist_comm x] using abs_sub_left_of_mem_uIcc h
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : ℝ
h : y ∈ uIcc x z
⊢ dist y z ≤ dist x z
[PROOFSTEP]
simpa only [dist_comm _ z] using abs_sub_right_of_mem_uIcc h
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y x' y' : ℝ
hx : x ∈ uIcc x' y'
hy : y ∈ uIcc x' y'
⊢ y ∈ uIcc y' x'
[PROOFSTEP]
rwa [uIcc_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y x' y' : ℝ
hx : x ∈ uIcc x' y'
hy : y ∈ uIcc x' y'
⊢ x ∈ uIcc y' x'
[PROOFSTEP]
rwa [uIcc_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y x' y' : ℝ
hx : x ∈ Icc x' y'
hy : y ∈ Icc x' y'
⊢ dist x y ≤ y' - x'
[PROOFSTEP]
simpa only [Real.dist_eq, abs_of_nonpos (sub_nonpos.2 <| hx.1.trans hx.2), neg_sub] using
  Real.dist_le_of_mem_uIcc (Icc_subset_uIcc hx) (Icc_subset_uIcc hy)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : ℝ
hx : x ∈ Icc 0 1
hy : y ∈ Icc 0 1
⊢ dist x y ≤ 1
[PROOFSTEP]
simpa only [sub_zero] using Real.dist_le_of_mem_Icc hx hy
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : ℝ
⊢ 𝓝 x = ⨅ (r : ℝ) (_ : r > 0), 𝓟 {b | |x - b| < r}
[PROOFSTEP]
simp only [nhds_basis_ball.eq_biInf, ball, Real.dist_eq, abs_sub_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x r y : ℝ
⊢ y ∈ ball x r ↔ y ∈ Ioo (x - r) (x + r)
[PROOFSTEP]
rw [mem_ball, dist_comm, Real.dist_eq, abs_sub_lt_iff, mem_Ioo, ← sub_lt_iff_lt_add', sub_lt_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x r : ℝ
⊢ closedBall x r = Icc (x - r) (x + r)
[PROOFSTEP]
ext y
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x r y : ℝ
⊢ y ∈ closedBall x r ↔ y ∈ Icc (x - r) (x + r)
[PROOFSTEP]
rw [mem_closedBall, dist_comm, Real.dist_eq, abs_sub_le_iff, mem_Icc, ← sub_le_iff_le_add', sub_le_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : ℝ
⊢ Ioo x y = ball ((x + y) / 2) ((y - x) / 2)
[PROOFSTEP]
rw [Real.ball_eq_Ioo, ← sub_div, add_comm, ← sub_add, add_sub_cancel', add_self_div_two, ← add_div, add_assoc,
  add_sub_cancel'_right, add_self_div_two]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y : ℝ
⊢ Icc x y = closedBall ((x + y) / 2) ((y - x) / 2)
[PROOFSTEP]
rw [Real.closedBall_eq_Icc, ← sub_div, add_comm, ← sub_add, add_sub_cancel', add_self_div_two, ← add_div, add_assoc,
  add_sub_cancel'_right, add_self_div_two]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
⊢ 𝓤 α = comap (fun p => dist p.fst p.snd) (𝓝 0)
[PROOFSTEP]
ext s
[GOAL]
case a
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set (α × α)
⊢ s ∈ 𝓤 α ↔ s ∈ comap (fun p => dist p.fst p.snd) (𝓝 0)
[PROOFSTEP]
simp only [mem_uniformity_dist, (nhds_basis_ball.comap _).mem_iff]
[GOAL]
case a
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set (α × α)
⊢ (∃ ε, ε > 0 ∧ ∀ {a b : α}, dist a b < ε → (a, b) ∈ s) ↔ ∃ i, 0 < i ∧ (fun p => dist p.fst p.snd) ⁻¹' ball 0 i ⊆ s
[PROOFSTEP]
simp [subset_def, Real.dist_0_eq_abs]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
⊢ CauchySeq u ↔ Tendsto (fun n => dist (u n.fst) (u n.snd)) atTop (𝓝 0)
[PROOFSTEP]
rw [cauchySeq_iff_tendsto, Metric.uniformity_eq_comap_nhds_zero, tendsto_comap_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
⊢ Tendsto ((fun p => dist p.fst p.snd) ∘ Prod.map u u) atTop (𝓝 0) ↔
    Tendsto (fun n => dist (u n.fst) (u n.snd)) atTop (𝓝 0)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
ι : Type u_3
f : ι → α × α
p : Filter ι
⊢ Tendsto f p (𝓤 α) ↔ Tendsto (fun x => dist (f x).fst (f x).snd) p (𝓝 0)
[PROOFSTEP]
rw [Metric.uniformity_eq_comap_nhds_zero, tendsto_comap_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι✝ : Type u_2
inst✝ : PseudoMetricSpace α
ι : Type u_3
f : ι → α × α
p : Filter ι
⊢ Tendsto ((fun p => dist p.fst p.snd) ∘ f) p (𝓝 0) ↔ Tendsto (fun x => dist (f x).fst (f x).snd) p (𝓝 0)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
u : Set α
hu : u ∈ 𝓝 x
⊢ ∀ᶠ (r : ℝ) in 𝓝 0, closedBall x r ⊆ u
[PROOFSTEP]
obtain ⟨ε, εpos, hε⟩ : ∃ ε, 0 < ε ∧ closedBall x ε ⊆ u := nhds_basis_closedBall.mem_iff.1 hu
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
u : Set α
hu : u ∈ 𝓝 x
ε : ℝ
εpos : 0 < ε
hε : closedBall x ε ⊆ u
⊢ ∀ᶠ (r : ℝ) in 𝓝 0, closedBall x r ⊆ u
[PROOFSTEP]
have : Iic ε ∈ 𝓝 (0 : ℝ) := Iic_mem_nhds εpos
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
u : Set α
hu : u ∈ 𝓝 x
ε : ℝ
εpos : 0 < ε
hε : closedBall x ε ⊆ u
this : Iic ε ∈ 𝓝 0
⊢ ∀ᶠ (r : ℝ) in 𝓝 0, closedBall x r ⊆ u
[PROOFSTEP]
filter_upwards [this] with _ hr using Subset.trans (closedBall_subset_closedBall hr) hε
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
⊢ UniformCauchySeqOn F atTop s ↔
    ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
⊢ UniformCauchySeqOn F atTop s →
    ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
[PROOFSTEP]
intro h ε hε
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : UniformCauchySeqOn F atTop s
ε : ℝ
hε : ε > 0
⊢ ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
[PROOFSTEP]
let u := {a : α × α | dist a.fst a.snd < ε}
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : UniformCauchySeqOn F atTop s
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
⊢ ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
[PROOFSTEP]
have hu : u ∈ 𝓤 α := Metric.mem_uniformity_dist.mpr ⟨ε, hε, by simp⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : UniformCauchySeqOn F atTop s
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
⊢ ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
[PROOFSTEP]
simp
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : UniformCauchySeqOn F atTop s
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
hu : u ∈ 𝓤 α
⊢ ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
[PROOFSTEP]
rw [← @Filter.eventually_atTop_prod_self' _ _ _ fun m => ∀ x ∈ s, dist (F m.fst x) (F m.snd x) < ε]
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : UniformCauchySeqOn F atTop s
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (x : β × β) in atTop, ∀ (x_1 : γ), x_1 ∈ s → dist (F x.fst x_1) (F x.snd x_1) < ε
[PROOFSTEP]
specialize h u hu
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
hu : u ∈ 𝓤 α
h : ∀ᶠ (m : β × β) in atTop ×ˢ atTop, ∀ (x : γ), x ∈ s → (F m.fst x, F m.snd x) ∈ u
⊢ ∀ᶠ (x : β × β) in atTop, ∀ (x_1 : γ), x_1 ∈ s → dist (F x.fst x_1) (F x.snd x_1) < ε
[PROOFSTEP]
rw [prod_atTop_atTop_eq] at h 
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
ε : ℝ
hε : ε > 0
u : Set (α × α) := {a | dist a.fst a.snd < ε}
hu : u ∈ 𝓤 α
h : ∀ᶠ (m : β × β) in atTop, ∀ (x : γ), x ∈ s → (F m.fst x, F m.snd x) ∈ u
⊢ ∀ᶠ (x : β × β) in atTop, ∀ (x_1 : γ), x_1 ∈ s → dist (F x.fst x_1) (F x.snd x_1) < ε
[PROOFSTEP]
exact h.mono fun n h x hx => h x hx
[GOAL]
case mpr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
⊢ (∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε) →
    UniformCauchySeqOn F atTop s
[PROOFSTEP]
intro h u hu
[GOAL]
case mpr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
⊢ ∀ᶠ (m : β × β) in atTop ×ˢ atTop, ∀ (x : γ), x ∈ s → (F m.fst x, F m.snd x) ∈ u
[PROOFSTEP]
rcases Metric.mem_uniformity_dist.mp hu with ⟨ε, hε, hab⟩
[GOAL]
case mpr.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
⊢ ∀ᶠ (m : β × β) in atTop ×ˢ atTop, ∀ (x : γ), x ∈ s → (F m.fst x, F m.snd x) ∈ u
[PROOFSTEP]
rcases h ε hε with ⟨N, hN⟩
[GOAL]
case mpr.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
N : β
hN : ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
⊢ ∀ᶠ (m : β × β) in atTop ×ˢ atTop, ∀ (x : γ), x ∈ s → (F m.fst x, F m.snd x) ∈ u
[PROOFSTEP]
rw [prod_atTop_atTop_eq, eventually_atTop]
[GOAL]
case mpr.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
N : β
hN : ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
⊢ ∃ a, ∀ (b : β × β), b ≥ a → ∀ (x : γ), x ∈ s → (F b.fst x, F b.snd x) ∈ u
[PROOFSTEP]
use(N, N)
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
N : β
hN : ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
⊢ ∀ (b : β × β), b ≥ (N, N) → ∀ (x : γ), x ∈ s → (F b.fst x, F b.snd x) ∈ u
[PROOFSTEP]
intro b hb x hx
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
N : β
hN : ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
b : β × β
hb : b ≥ (N, N)
x : γ
hx : x ∈ s
⊢ (F b.fst x, F b.snd x) ∈ u
[PROOFSTEP]
rcases hb with ⟨hbl, hbr⟩
[GOAL]
case h.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
γ : Type u_3
F : β → γ → α
s : Set γ
h : ∀ (ε : ℝ), ε > 0 → ∃ N, ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
u : Set (α × α)
hu : u ∈ 𝓤 α
ε : ℝ
hε : ε > 0
hab : ∀ {a b : α}, dist a b < ε → (a, b) ∈ u
N : β
hN : ∀ (m : β), m ≥ N → ∀ (n : β), n ≥ N → ∀ (x : γ), x ∈ s → dist (F m x) (F n x) < ε
b : β × β
x : γ
hx : x ∈ s
hbl : (N, N).fst ≤ b.fst
hbr : (N, N).snd ≤ b.snd
⊢ (F b.fst x, F b.snd x) ∈ u
[PROOFSTEP]
exact hab (hN b.fst hbl.ge b.snd hbr.ge x hx)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
⊢ ∃ R, R > 0 ∧ ∀ (m n : ℕ), dist (u m) (u n) < R
[PROOFSTEP]
rcases Metric.cauchySeq_iff'.1 hu 1 zero_lt_one with ⟨N, hN⟩
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
⊢ ∃ R, R > 0 ∧ ∀ (m n : ℕ), dist (u m) (u n) < R
[PROOFSTEP]
suffices : ∃ R > 0, ∀ n, dist (u n) (u N) < R
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
this : ∃ R, R > 0 ∧ ∀ (n : ℕ), dist (u n) (u N) < R
⊢ ∃ R, R > 0 ∧ ∀ (m n : ℕ), dist (u m) (u n) < R
[PROOFSTEP]
rcases this with ⟨R, R0, H⟩
[GOAL]
case intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ
R0 : R > 0
H : ∀ (n : ℕ), dist (u n) (u N) < R
⊢ ∃ R, R > 0 ∧ ∀ (m n : ℕ), dist (u m) (u n) < R
[PROOFSTEP]
exact ⟨_, add_pos R0 R0, fun m n => lt_of_le_of_lt (dist_triangle_right _ _ _) (add_lt_add (H m) (H n))⟩
[GOAL]
case this
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
⊢ ∃ R, R > 0 ∧ ∀ (n : ℕ), dist (u n) (u N) < R
[PROOFSTEP]
let R := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
[GOAL]
case this
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ≥0 := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
⊢ ∃ R, R > 0 ∧ ∀ (n : ℕ), dist (u n) (u N) < R
[PROOFSTEP]
refine' ⟨↑R + 1, add_pos_of_nonneg_of_pos R.2 zero_lt_one, fun n => _⟩
[GOAL]
case this
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ≥0 := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
n : ℕ
⊢ dist (u n) (u N) < ↑R + 1
[PROOFSTEP]
cases' le_or_lt N n with h h
[GOAL]
case this.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ≥0 := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
n : ℕ
h : N ≤ n
⊢ dist (u n) (u N) < ↑R + 1
[PROOFSTEP]
exact lt_of_lt_of_le (hN _ h) (le_add_of_nonneg_left R.2)
[GOAL]
case this.inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ≥0 := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
n : ℕ
h : n < N
⊢ dist (u n) (u N) < ↑R + 1
[PROOFSTEP]
have : _ ≤ R := Finset.le_sup (Finset.mem_range.2 h)
[GOAL]
case this.inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : ℕ → α
hu : CauchySeq u
N : ℕ
hN : ∀ (n : ℕ), n ≥ N → dist (u n) (u N) < 1
R : ℝ≥0 := Finset.sup (Finset.range N) fun n => nndist (u n) (u N)
n : ℕ
h : n < N
this : nndist (u n) (u N) ≤ R
⊢ dist (u n) (u N) < ↑R + 1
[PROOFSTEP]
exact lt_of_le_of_lt this (lt_add_of_pos_right _ zero_lt_one)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
let S N := (fun p : ℕ × ℕ => dist (s p.1) (s p.2)) '' {p | p.1 ≥ N ∧ p.2 ≥ N}
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
have hS : ∀ N, ∃ x, ∀ y ∈ S N, y ≤ x := by
  rcases cauchySeq_bdd hs with ⟨R, -, hR⟩
  refine' fun N => ⟨R, _⟩
  rintro _ ⟨⟨m, n⟩, _, rfl⟩
  exact
    le_of_lt
      (hR m n)
        -- Prove that it bounds the distances of points in the Cauchy sequence
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
[PROOFSTEP]
rcases cauchySeq_bdd hs with ⟨R, -, hR⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
⊢ ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
[PROOFSTEP]
refine' fun N => ⟨R, _⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
N : ℕ
⊢ ∀ (y : ℝ), y ∈ S N → y ≤ R
[PROOFSTEP]
rintro _ ⟨⟨m, n⟩, _, rfl⟩
[GOAL]
case intro.intro.intro.mk.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
R : ℝ
hR : ∀ (m n : ℕ), dist (s m) (s n) < R
N m n : ℕ
left✝ : (m, n) ∈ {p | p.fst ≥ N ∧ p.snd ≥ N}
⊢ (fun p => dist (s p.fst) (s p.snd)) (m, n) ≤ R
[PROOFSTEP]
exact
  le_of_lt
    (hR m n)
      -- Prove that it bounds the distances of points in the Cauchy sequence
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
have ub : ∀ m n N, N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N) := fun m n N hm hn =>
  le_csSup (hS N) ⟨⟨_, _⟩, ⟨hm, hn⟩, rfl⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
have S0m : ∀ n, (0 : ℝ) ∈ S n := fun n => ⟨⟨n, n⟩, ⟨le_rfl, le_rfl⟩, dist_self _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
have S0 := fun n =>
  le_csSup (hS n)
    (S0m n)
      -- Prove that it tends to `0`, by using the Cauchy property of `s`
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
⊢ ∃ b, (∀ (n : ℕ), 0 ≤ b n) ∧ (∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (s n) (s m) ≤ b N) ∧ Tendsto b atTop (𝓝 0)
[PROOFSTEP]
refine' ⟨fun N => sSup (S N), S0, ub, Metric.tendsto_atTop.2 fun ε ε0 => _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
⊢ ∃ N, ∀ (n : ℕ), n ≥ N → dist (sSup (S n)) 0 < ε
[PROOFSTEP]
refine' (Metric.cauchySeq_iff.1 hs (ε / 2) (half_pos ε0)).imp fun N hN n hn => _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ dist (sSup (S n)) 0 < ε
[PROOFSTEP]
rw [Real.dist_0_eq_abs, abs_of_nonneg (S0 n)]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ sSup (S n) < ε
[PROOFSTEP]
refine' lt_of_le_of_lt (csSup_le ⟨_, S0m _⟩ _) (half_lt_self ε0)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
⊢ ∀ (b : ℝ), b ∈ S n → b ≤ ε / 2
[PROOFSTEP]
rintro _ ⟨⟨m', n'⟩, ⟨hm', hn'⟩, rfl⟩
[GOAL]
case intro.mk.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
s : ℕ → α
hs : CauchySeq s
S : ℕ → Set ℝ := fun N => (fun p => dist (s p.fst) (s p.snd)) '' {p | p.fst ≥ N ∧ p.snd ≥ N}
hS : ∀ (N : ℕ), ∃ x, ∀ (y : ℝ), y ∈ S N → y ≤ x
ub : ∀ (m n N : ℕ), N ≤ m → N ≤ n → dist (s m) (s n) ≤ sSup (S N)
S0m : ∀ (n : ℕ), 0 ∈ S n
S0 : ∀ (n : ℕ), 0 ≤ sSup (S n)
ε : ℝ
ε0 : ε > 0
N : ℕ
hN : ∀ (m : ℕ), m ≥ N → ∀ (n : ℕ), n ≥ N → dist (s m) (s n) < ε / 2
n : ℕ
hn : n ≥ N
m' n' : ℕ
hm' : (m', n').fst ≥ n
hn' : (m', n').snd ≥ n
⊢ (fun p => dist (s p.fst) (s p.snd)) (m', n') ≤ ε / 2
[PROOFSTEP]
exact le_of_lt (hN _ (le_trans hn hm') _ (le_trans hn hn'))
[GOAL]
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type ?u.236042
β : Type ?u.236039
f : α → β
m : PseudoMetricSpace β
s : Set α
⊢ (f '' sᶜ)ᶜ ∈ cobounded β ↔ s ∈ {s | ∃ C, ∀ (x : α), x ∈ sᶜ → ∀ (y : α), y ∈ sᶜ → dist x y ≤ C}
[PROOFSTEP]
simp only [← isBounded_def, isBounded_iff, ball_image_iff, mem_setOf]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a b x✝ : ℝ≥0
⊢ nndist a b ≤ x✝ ↔ max (a - b) (b - a) ≤ x✝
[PROOFSTEP]
simp only [← NNReal.coe_le_coe, coe_nndist, dist_eq, max_le_iff, abs_sub_le_iff, tsub_le_iff_right, NNReal.coe_add]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
z : ℝ≥0
⊢ nndist 0 z = z
[PROOFSTEP]
simp only [NNReal.nndist_eq, max_eq_right, tsub_zero, zero_tsub, zero_le']
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
z : ℝ≥0
⊢ nndist z 0 = z
[PROOFSTEP]
rw [nndist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
z : ℝ≥0
⊢ nndist 0 z = z
[PROOFSTEP]
exact NNReal.nndist_zero_eq_val z
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a b : ℝ≥0
⊢ a ≤ b + nndist a b
[PROOFSTEP]
suffices (a : ℝ) ≤ (b : ℝ) + dist a b by rwa [← NNReal.coe_le_coe, NNReal.coe_add, coe_nndist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a b : ℝ≥0
this : ↑a ≤ ↑b + dist a b
⊢ a ≤ b + nndist a b
[PROOFSTEP]
rwa [← NNReal.coe_le_coe, NNReal.coe_add, coe_nndist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a b : ℝ≥0
⊢ ↑a ≤ ↑b + dist a b
[PROOFSTEP]
rw [← sub_le_iff_le_add']
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a b : ℝ≥0
⊢ ↑a - ↑b ≤ dist a b
[PROOFSTEP]
exact le_of_abs_le (dist_eq a b).ge
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x y : α × β
⊢ (fun x y => dist x.fst y.fst ⊔ dist x.snd y.snd) x y = ENNReal.toReal (edist x y)
[PROOFSTEP]
simp only [sup_eq_max, dist_edist, ← ENNReal.toReal_max (edist_ne_top _ _) (edist_ne_top _ _), Prod.edist_eq]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
i : PseudoMetricSpace (α × β) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun x y => dist x.fst y.fst ⊔ dist x.snd y.snd)
    (_ : ∀ (x y : α × β), max (edist x.fst y.fst) (edist x.snd y.snd) ≠ ⊤)
    (_ :
      ∀ (x y : α × β),
        dist x.fst y.fst ⊔ dist x.snd y.snd = ENNReal.toReal (max (edist x.fst y.fst) (edist x.snd y.snd)))
s : Set (α × β)
⊢ IsBounded s ↔ IsBounded s
[PROOFSTEP]
simp only [← isBounded_image_fst_and_snd, isBounded_iff_eventually, ball_image_iff, ← eventually_and, ← forall_and, ←
  max_le_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
i : PseudoMetricSpace (α × β) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun x y => dist x.fst y.fst ⊔ dist x.snd y.snd)
    (_ : ∀ (x y : α × β), max (edist x.fst y.fst) (edist x.snd y.snd) ≠ ⊤)
    (_ :
      ∀ (x y : α × β),
        dist x.fst y.fst ⊔ dist x.snd y.snd = ENNReal.toReal (max (edist x.fst y.fst) (edist x.snd y.snd)))
s : Set (α × β)
⊢ (∀ᶠ (x : ℝ) in atTop,
      ∀ (x_1 : α × β), x_1 ∈ s → ∀ (x_3 : α × β), x_3 ∈ s → max (dist x_1.fst x_3.fst) (dist x_1.snd x_3.snd) ≤ x) ↔
    ∀ᶠ (C : ℝ) in atTop, ∀ ⦃x : α × β⦄, x ∈ s → ∀ ⦃y : α × β⦄, y ∈ s → dist x y ≤ C
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α
y₁ y₂ : β
⊢ dist (x, y₁) (x, y₂) = dist y₁ y₂
[PROOFSTEP]
simp [Prod.dist_eq, dist_nonneg]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x₁ x₂ : α
y : β
⊢ dist (x₁, y) (x₂, y) = dist x₁ x₂
[PROOFSTEP]
simp [Prod.dist_eq, dist_nonneg]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α
y : β
r : ℝ
z : α × β
⊢ z ∈ ball x r ×ˢ ball y r ↔ z ∈ ball (x, y) r
[PROOFSTEP]
simp [Prod.dist_eq]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α
y : β
r : ℝ
z : α × β
⊢ z ∈ closedBall x r ×ˢ closedBall y r ↔ z ∈ closedBall (x, y) r
[PROOFSTEP]
simp [Prod.dist_eq]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
⊢ sphere x r = sphere x.fst r ×ˢ closedBall x.snd r ∪ closedBall x.fst r ×ˢ sphere x.snd r
[PROOFSTEP]
obtain hr | rfl | hr := lt_trichotomy r 0
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : r < 0
⊢ sphere x r = sphere x.fst r ×ˢ closedBall x.snd r ∪ closedBall x.fst r ×ˢ sphere x.snd r
[PROOFSTEP]
simp [hr]
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
⊢ sphere x 0 = sphere x.fst 0 ×ˢ closedBall x.snd 0 ∪ closedBall x.fst 0 ×ˢ sphere x.snd 0
[PROOFSTEP]
cases x
[GOAL]
case inr.inl.mk
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
fst✝ : α
snd✝ : β
⊢ sphere (fst✝, snd✝) 0 =
    sphere (fst✝, snd✝).fst 0 ×ˢ closedBall (fst✝, snd✝).snd 0 ∪
      closedBall (fst✝, snd✝).fst 0 ×ˢ sphere (fst✝, snd✝).snd 0
[PROOFSTEP]
simp_rw [← closedBall_eq_sphere_of_nonpos le_rfl, union_self, closedBall_prod_same]
[GOAL]
case inr.inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
⊢ sphere x r = sphere x.fst r ×ˢ closedBall x.snd r ∪ closedBall x.fst r ×ˢ sphere x.snd r
[PROOFSTEP]
ext ⟨x', y'⟩
[GOAL]
case inr.inr.h.mk
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ (x', y') ∈ sphere x r ↔ (x', y') ∈ sphere x.fst r ×ˢ closedBall x.snd r ∪ closedBall x.fst r ×ˢ sphere x.snd r
[PROOFSTEP]
simp_rw [Set.mem_union, Set.mem_prod, Metric.mem_closedBall, Metric.mem_sphere, Prod.dist_eq, max_eq_iff]
[GOAL]
case inr.inr.h.mk
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ dist x' x.fst = r ∧ dist y' x.snd ≤ dist x' x.fst ∨ dist y' x.snd = r ∧ dist x' x.fst ≤ dist y' x.snd ↔
    dist x' x.fst = r ∧ dist y' x.snd ≤ r ∨ dist x' x.fst ≤ r ∧ dist y' x.snd = r
[PROOFSTEP]
refine' or_congr (and_congr_right _) (and_comm.trans (and_congr_left _))
[GOAL]
case inr.inr.h.mk.refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ dist x' x.fst = r → (dist y' x.snd ≤ dist x' x.fst ↔ dist y' x.snd ≤ r)
case inr.inr.h.mk.refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ dist y' x.snd = r → (dist x' x.fst ≤ dist y' x.snd ↔ dist x' x.fst ≤ r)
[PROOFSTEP]
all_goals rintro rfl; rfl
[GOAL]
case inr.inr.h.mk.refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ dist x' x.fst = r → (dist y' x.snd ≤ dist x' x.fst ↔ dist y' x.snd ≤ r)
[PROOFSTEP]
rintro rfl
[GOAL]
case inr.inr.h.mk.refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
x' : α
y' : β
hr : 0 < dist x' x.fst
⊢ dist y' x.snd ≤ dist x' x.fst ↔ dist y' x.snd ≤ dist x' x.fst
[PROOFSTEP]
rfl
[GOAL]
case inr.inr.h.mk.refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
r : ℝ
hr : 0 < r
x' : α
y' : β
⊢ dist y' x.snd = r → (dist x' x.fst ≤ dist y' x.snd ↔ dist x' x.fst ≤ r)
[PROOFSTEP]
rintro rfl
[GOAL]
case inr.inr.h.mk.refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
x : α × β
x' : α
y' : β
hr : 0 < dist y' x.snd
⊢ dist x' x.fst ≤ dist y' x.snd ↔ dist x' x.fst ≤ dist y' x.snd
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
⊢ dist (dist x y) (dist x z) ≤ dist y z
[PROOFSTEP]
simpa only [dist_comm x] using dist_dist_dist_le_left y z x
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
a : α
⊢ comap (fun x => dist x a) (𝓝 0) = 𝓝 a
[PROOFSTEP]
simp only [@nhds_eq_comap_uniformity α, Metric.uniformity_eq_comap_nhds_zero, comap_comap, (· ∘ ·), dist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : β → α
x : Filter β
a : α
⊢ Tendsto f x (𝓝 a) ↔ Tendsto (fun b => dist (f b) a) x (𝓝 0)
[PROOFSTEP]
rw [← nhds_comap_dist a, tendsto_comap_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : β → α
x : Filter β
a : α
⊢ Tendsto ((fun x => dist x a) ∘ f) x (𝓝 0) ↔ Tendsto (fun b => dist (f b) a) x (𝓝 0)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ s : Set α
a : α
⊢ (∀ (i : ℝ), 0 < i → ∃ y, y ∈ s ∧ y ∈ ball a i) ↔ ∀ (ε : ℝ), ε > 0 → ∃ b, b ∈ s ∧ dist a b < ε
[PROOFSTEP]
simp only [mem_ball, dist_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s : Set α
e : β → α
a : α
⊢ a ∈ closure (range e) ↔ ∀ (ε : ℝ), ε > 0 → ∃ k, dist a (e k) < ε
[PROOFSTEP]
simp only [mem_closure_iff, exists_range_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s : Set α
e : β → α
a : α
⊢ (∀ (i : ℕ), True → ∃ y, y ∈ range e ∧ y ∈ ball a (1 / (↑i + 1))) ↔ ∀ (n : ℕ), ∃ k, dist a (e k) < 1 / (↑n + 1)
[PROOFSTEP]
simp only [mem_ball, dist_comm, exists_range_iff, forall_const]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ s : Set α
hs : IsClosed s
a : α
⊢ a ∈ s ↔ ∀ (ε : ℝ), ε > 0 → ∃ b, b ∈ s ∧ dist a b < ε
[PROOFSTEP]
simpa only [hs.closure_eq] using @mem_closure_iff _ _ s a
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
ε ε₁ ε₂ : ℝ
s✝ s : Set α
x : α
⊢ x ∈ closure s ↔ ∀ (r : ℝ), r > 0 → Set.Nonempty (ball x r ∩ s)
[PROOFSTEP]
simp only [mem_closure_iff, Set.Nonempty, exists_prop, mem_inter_iff, mem_ball', and_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ y z : α
ε ε₁ ε₂ : ℝ
s : Set α
f : β → α
x : α
⊢ x ∈ closure (range f) ↔ ∀ (r : ℝ), r > 0 → ∃ y, dist x (f y) < r
[PROOFSTEP]
simp only [mem_closure_iff, exists_range_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
f : β → α
inst✝ : TopologicalSpace β
hf : Inducing f
s : Set α
hs : IsSeparable s
⊢ IsSeparable (f ⁻¹' s)
[PROOFSTEP]
have : SeparableSpace s := hs.separableSpace
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
f : β → α
inst✝ : TopologicalSpace β
hf : Inducing f
s : Set α
hs : IsSeparable s
this : SeparableSpace ↑s
⊢ IsSeparable (f ⁻¹' s)
[PROOFSTEP]
have : SecondCountableTopology s := UniformSpace.secondCountable_of_separable _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
f : β → α
inst✝ : TopologicalSpace β
hf : Inducing f
s : Set α
hs : IsSeparable s
this✝ : SeparableSpace ↑s
this : SecondCountableTopology ↑s
⊢ IsSeparable (f ⁻¹' s)
[PROOFSTEP]
have : Inducing ((mapsTo_preimage f s).restrict _ _ _) := (hf.comp inducing_subtype_val).codRestrict _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
f : β → α
inst✝ : TopologicalSpace β
hf : Inducing f
s : Set α
hs : IsSeparable s
this✝¹ : SeparableSpace ↑s
this✝ : SecondCountableTopology ↑s
this : Inducing (MapsTo.restrict f (f ⁻¹' s) s (_ : MapsTo f (f ⁻¹' s) s))
⊢ IsSeparable (f ⁻¹' s)
[PROOFSTEP]
have := this.secondCountableTopology
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
f : β → α
inst✝ : TopologicalSpace β
hf : Inducing f
s : Set α
hs : IsSeparable s
this✝² : SeparableSpace ↑s
this✝¹ : SecondCountableTopology ↑s
this✝ : Inducing (MapsTo.restrict f (f ⁻¹' s) s (_ : MapsTo f (f ⁻¹' s) s))
this : SecondCountableTopology ↑(f ⁻¹' s)
⊢ IsSeparable (f ⁻¹' s)
[PROOFSTEP]
exact isSeparable_of_separableSpace_subtype _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : TopologicalSpace β
f : α → β
s : Set α
hf : ContinuousOn f s
hs : IsSeparable s
⊢ IsSeparable (f '' s)
[PROOFSTEP]
rw [image_eq_range, ← image_univ]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
ε ε₁ ε₂ : ℝ
s✝ : Set α
inst✝ : TopologicalSpace β
f : α → β
s : Set α
hf : ContinuousOn f s
hs : IsSeparable s
⊢ IsSeparable ((fun x => f ↑x) '' univ)
[PROOFSTEP]
exact (isSeparable_univ_iff.2 hs.separableSpace).image hf.restrict
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
⊢ PseudoMetricSpace ((b : β) → π b)
[PROOFSTEP]
let i :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist
    (fun f g : ∀ b, π b => ((sup univ fun b => nndist (f b) (g b) : ℝ≥0) : ℝ))
    (fun f g => ((Finset.sup_lt_iff bot_lt_top).2 fun b _ => edist_lt_top _ _).ne)
    (fun f g => by simp only [edist_pi_def, edist_nndist, ← ENNReal.coe_finset_sup, ENNReal.coe_toReal])
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
⊢ (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b))) f g = ENNReal.toReal (edist f g)
[PROOFSTEP]
simp only [edist_pi_def, edist_nndist, ← ENNReal.coe_finset_sup, ENNReal.coe_toReal]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
⊢ PseudoMetricSpace ((b : β) → π b)
[PROOFSTEP]
refine i.replaceBornology fun s => ?_
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
s : Set ((b : β) → π b)
⊢ IsBounded s ↔ IsBounded s
[PROOFSTEP]
simp only [← isBounded_def, isBounded_iff_eventually, ← forall_isBounded_image_eval_iff, ball_image_iff, ←
  Filter.eventually_all, Function.eval_apply, @dist_nndist (π _)]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
s : Set ((b : β) → π b)
⊢ (∀ᶠ (x : ℝ) in atTop,
      ∀ (i : β) (x_1 : (x : β) → π x),
        x_1 ∈ s → ∀ (x_2 : (x : β) → π x), x_2 ∈ s → ↑(nndist (Function.eval i x_1) (Function.eval i x_2)) ≤ x) ↔
    ∀ᶠ (C : ℝ) in atTop, ∀ ⦃x : (b : β) → π b⦄, x ∈ s → ∀ ⦃y : (b : β) → π b⦄, y ∈ s → dist x y ≤ C
[PROOFSTEP]
refine' eventually_congr ((eventually_ge_atTop 0).mono fun C hC => _)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
s : Set ((b : β) → π b)
C : ℝ
hC : 0 ≤ C
⊢ (∀ (i : β) (x : (x : β) → π x),
      x ∈ s → ∀ (x_1 : (x : β) → π x), x_1 ∈ s → ↑(nndist (Function.eval i x) (Function.eval i x_1)) ≤ C) ↔
    ∀ ⦃x : (b : β) → π b⦄, x ∈ s → ∀ ⦃y : (b : β) → π b⦄, y ∈ s → dist x y ≤ C
[PROOFSTEP]
lift C to ℝ≥0 using hC
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
s : Set ((b : β) → π b)
C : ℝ≥0
⊢ (∀ (i : β) (x : (x : β) → π x),
      x ∈ s → ∀ (x_1 : (x : β) → π x), x_1 ∈ s → ↑(nndist (Function.eval i x) (Function.eval i x_1)) ≤ ↑C) ↔
    ∀ ⦃x : (b : β) → π b⦄, x ∈ s → ∀ ⦃y : (b : β) → π b⦄, y ∈ s → dist x y ≤ ↑C
[PROOFSTEP]
refine'
  ⟨fun H x hx y hy => NNReal.coe_le_coe.2 <| Finset.sup_le fun b _ => H b x hx y hy, fun H b x hx y hy =>
    NNReal.coe_le_coe.2 _⟩
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
i : PseudoMetricSpace ((b : β) → π b) :=
  PseudoEMetricSpace.toPseudoMetricSpaceOfDist (fun f g => ↑(sup Finset.univ fun b => nndist (f b) (g b)))
    (_ : ∀ (f g : (b : β) → π b), (sup Finset.univ fun b => edist (f b) (g b)) ≠ ⊤)
    (_ :
      ∀ (f g : (b : β) → π b),
        ↑(sup Finset.univ fun b => nndist (f b) (g b)) = ENNReal.toReal (sup Finset.univ fun x => edist (f x) (g x)))
s : Set ((b : β) → π b)
C : ℝ≥0
H : ∀ ⦃x : (b : β) → π b⦄, x ∈ s → ∀ ⦃y : (b : β) → π b⦄, y ∈ s → dist x y ≤ ↑C
b : β
x : (x : β) → π x
hx : x ∈ s
y : (x : β) → π x
hy : y ∈ s
⊢ nndist (Function.eval b x) (Function.eval b y) ≤ C
[PROOFSTEP]
simpa only using Finset.sup_le_iff.1 (NNReal.coe_le_coe.1 <| H hx hy) b (Finset.mem_univ b)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
⊢ nndist f g ≤ r ↔ ∀ (b : β), nndist (f b) (g b) ≤ r
[PROOFSTEP]
simp [nndist_pi_def]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
⊢ nndist f g < r ↔ ∀ (b : β), nndist (f b) (g b) < r
[PROOFSTEP]
simp [nndist_pi_def, Finset.sup_lt_iff (show ⊥ < r from hr)]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
⊢ nndist f g = r ↔ (∃ i, nndist (f i) (g i) = r) ∧ ∀ (b : β), nndist (f b) (g b) ≤ r
[PROOFSTEP]
rw [eq_iff_le_not_lt, nndist_pi_lt_iff hr, nndist_pi_le_iff, not_forall, and_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
⊢ ((∃ x, ¬nndist (f x) (g x) < r) ∧ ∀ (b : β), nndist (f b) (g b) ≤ r) ↔
    (∃ i, nndist (f i) (g i) = r) ∧ ∀ (b : β), nndist (f b) (g b) ≤ r
[PROOFSTEP]
simp_rw [not_lt, and_congr_left_iff, le_antisymm_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
⊢ (∀ (b : β), nndist (f b) (g b) ≤ r) →
    ((∃ x, r ≤ nndist (f x) (g x)) ↔ ∃ i, nndist (f i) (g i) ≤ r ∧ r ≤ nndist (f i) (g i))
[PROOFSTEP]
intro h
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
h : ∀ (b : β), nndist (f b) (g b) ≤ r
⊢ (∃ x, r ≤ nndist (f x) (g x)) ↔ ∃ i, nndist (f i) (g i) ≤ r ∧ r ≤ nndist (f i) (g i)
[PROOFSTEP]
refine' exists_congr fun b => _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < r
h : ∀ (b : β), nndist (f b) (g b) ≤ r
b : β
⊢ r ≤ nndist (f b) (g b) ↔ nndist (f b) (g b) ≤ r ∧ r ≤ nndist (f b) (g b)
[PROOFSTEP]
apply (and_iff_right <| h _).symm
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ
hr : 0 < r
⊢ dist f g < r ↔ ∀ (b : β), dist (f b) (g b) < r
[PROOFSTEP]
lift r to ℝ≥0 using hr.le
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < ↑r
⊢ dist f g < ↑r ↔ ∀ (b : β), dist (f b) (g b) < ↑r
[PROOFSTEP]
exact nndist_pi_lt_iff hr
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ
hr : 0 ≤ r
⊢ dist f g ≤ r ↔ ∀ (b : β), dist (f b) (g b) ≤ r
[PROOFSTEP]
lift r to ℝ≥0 using hr
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
⊢ dist f g ≤ ↑r ↔ ∀ (b : β), dist (f b) (g b) ≤ ↑r
[PROOFSTEP]
exact nndist_pi_le_iff
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ
hr : 0 < r
⊢ dist f g = r ↔ (∃ i, dist (f i) (g i) = r) ∧ ∀ (b : β), dist (f b) (g b) ≤ r
[PROOFSTEP]
lift r to ℝ≥0 using hr.le
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
r : ℝ≥0
hr : 0 < ↑r
⊢ dist f g = ↑r ↔ (∃ i, dist (f i) (g i) = ↑r) ∧ ∀ (b : β), dist (f b) (g b) ≤ ↑r
[PROOFSTEP]
simp_rw [← coe_nndist, NNReal.coe_eq, nndist_pi_eq_iff hr, NNReal.coe_le_coe]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
f g : (b : β) → π b
r : ℝ
⊢ dist f g ≤ r ↔ ∀ (b : β), dist (f b) (g b) ≤ r
[PROOFSTEP]
by_cases hr : 0 ≤ r
[GOAL]
case pos
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
f g : (b : β) → π b
r : ℝ
hr : 0 ≤ r
⊢ dist f g ≤ r ↔ ∀ (b : β), dist (f b) (g b) ≤ r
[PROOFSTEP]
exact dist_pi_le_iff hr
[GOAL]
case neg
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
f g : (b : β) → π b
r : ℝ
hr : ¬0 ≤ r
⊢ dist f g ≤ r ↔ ∀ (b : β), dist (f b) (g b) ≤ r
[PROOFSTEP]
exact iff_of_false (fun h => hr <| dist_nonneg.trans h) fun h => hr <| dist_nonneg.trans <| h <| Classical.arbitrary _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
a b : α
⊢ (dist (fun x => a) fun x => b) = dist a b
[PROOFSTEP]
simpa only [dist_edist] using congr_arg ENNReal.toReal (edist_pi_const a b)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
b : β
⊢ nndist (f b) (g b) ≤ nndist f g
[PROOFSTEP]
rw [← ENNReal.coe_le_coe, ← edist_nndist, ← edist_nndist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
b : β
⊢ edist (f b) (g b) ≤ edist f g
[PROOFSTEP]
exact edist_le_pi_edist f g b
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
f g : (b : β) → π b
b : β
⊢ dist (f b) (g b) ≤ dist f g
[PROOFSTEP]
simp only [dist_nndist, NNReal.coe_le_coe, nndist_le_pi_nndist f g b]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 < r
⊢ ball x r = Set.pi Set.univ fun b => ball (x b) r
[PROOFSTEP]
ext p
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 < r
p : (b : β) → π b
⊢ p ∈ ball x r ↔ p ∈ Set.pi Set.univ fun b => ball (x b) r
[PROOFSTEP]
simp [dist_pi_lt_iff hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
x : (b : β) → π b
r : ℝ
hr : r ≤ 0
⊢ ball x r = Set.pi Set.univ fun b => ball (x b) r
[PROOFSTEP]
simp [ball_eq_empty.2 hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 ≤ r
⊢ closedBall x r = Set.pi Set.univ fun b => closedBall (x b) r
[PROOFSTEP]
ext p
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 ≤ r
p : (b : β) → π b
⊢ p ∈ closedBall x r ↔ p ∈ Set.pi Set.univ fun b => closedBall (x b) r
[PROOFSTEP]
simp [dist_pi_le_iff hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
inst✝ : Nonempty β
x : (b : β) → π b
r : ℝ
hr : r < 0
⊢ closedBall x r = Set.pi Set.univ fun b => closedBall (x b) r
[PROOFSTEP]
simp [closedBall_eq_empty.2 hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
h : 0 < r ∨ Nonempty β
⊢ sphere x r = (⋃ (i : β), Function.eval i ⁻¹' sphere (x i) r) ∩ closedBall x r
[PROOFSTEP]
obtain hr | rfl | hr := lt_trichotomy r 0
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
h : 0 < r ∨ Nonempty β
hr : r < 0
⊢ sphere x r = (⋃ (i : β), Function.eval i ⁻¹' sphere (x i) r) ∩ closedBall x r
[PROOFSTEP]
simp [hr]
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
⊢ sphere x 0 = (⋃ (i : β), Function.eval i ⁻¹' sphere (x i) 0) ∩ closedBall x 0
[PROOFSTEP]
rw [closedBall_eq_sphere_of_nonpos le_rfl, eq_comm, Set.inter_eq_right_iff_subset]
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
⊢ sphere x 0 ⊆ ⋃ (i : β), Function.eval i ⁻¹' sphere (x i) 0
[PROOFSTEP]
letI := h.resolve_left (lt_irrefl _)
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
⊢ sphere x 0 ⊆ ⋃ (i : β), Function.eval i ⁻¹' sphere (x i) 0
[PROOFSTEP]
inhabit β
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
inhabited_h : Inhabited β
⊢ sphere x 0 ⊆ ⋃ (i : β), Function.eval i ⁻¹' sphere (x i) 0
[PROOFSTEP]
refine' subset_iUnion_of_subset default _
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
inhabited_h : Inhabited β
⊢ sphere x 0 ⊆ Function.eval default ⁻¹' sphere (x default) 0
[PROOFSTEP]
intro x hx
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x✝ : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
inhabited_h : Inhabited β
x : (x : β) → π x
hx : x ∈ sphere x✝ 0
⊢ x ∈ Function.eval default ⁻¹' sphere (x✝ default) 0
[PROOFSTEP]
replace hx := hx.le
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x✝ : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
inhabited_h : Inhabited β
x : (x : β) → π x
hx : dist x x✝ ≤ 0
⊢ x ∈ Function.eval default ⁻¹' sphere (x✝ default) 0
[PROOFSTEP]
rw [dist_pi_le_iff le_rfl] at hx 
[GOAL]
case inr.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x✝ : (b : β) → π b
h : 0 < 0 ∨ Nonempty β
this : Nonempty β := Or.resolve_left h (lt_irrefl 0)
inhabited_h : Inhabited β
x : (x : β) → π x
hx : ∀ (b : β), dist (x b) (x✝ b) ≤ 0
⊢ x ∈ Function.eval default ⁻¹' sphere (x✝ default) 0
[PROOFSTEP]
exact le_antisymm (hx default) dist_nonneg
[GOAL]
case inr.inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
h : 0 < r ∨ Nonempty β
hr : 0 < r
⊢ sphere x r = (⋃ (i : β), Function.eval i ⁻¹' sphere (x i) r) ∩ closedBall x r
[PROOFSTEP]
ext
[GOAL]
case inr.inr.h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x : (b : β) → π b
r : ℝ
h : 0 < r ∨ Nonempty β
hr : 0 < r
x✝ : (b : β) → π b
⊢ x✝ ∈ sphere x r ↔ x✝ ∈ (⋃ (i : β), Function.eval i ⁻¹' sphere (x i) r) ∩ closedBall x r
[PROOFSTEP]
simp [dist_pi_eq_iff hr, dist_pi_le_iff hr.le]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α✝
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
n : ℕ
α : Fin (n + 1) → Type u_4
inst✝ : (i : Fin (n + 1)) → PseudoMetricSpace (α i)
i : Fin (n + 1)
x y : α i
f g : (j : Fin n) → α (succAbove i j)
c : ℝ≥0
⊢ nndist (insertNth i x f) (insertNth i y g) ≤ c ↔ max (nndist x y) (nndist f g) ≤ c
[PROOFSTEP]
simp [nndist_pi_le_iff, i.forall_iff_succAbove]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α✝
π : β → Type u_3
inst✝² : Fintype β
inst✝¹ : (b : β) → PseudoMetricSpace (π b)
n : ℕ
α : Fin (n + 1) → Type u_4
inst✝ : (i : Fin (n + 1)) → PseudoMetricSpace (α i)
i : Fin (n + 1)
x y : α i
f g : (j : Fin n) → α (succAbove i j)
⊢ dist (insertNth i x f) (insertNth i y g) = max (dist x y) (dist f g)
[PROOFSTEP]
simp only [dist_nndist, Fin.nndist_insertNth_insertNth, NNReal.coe_max]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x y x' y' : β → ℝ
hx : x ∈ Set.Icc x' y'
hy : y ∈ Set.Icc x' y'
⊢ dist x y ≤ dist x' y'
[PROOFSTEP]
refine' (dist_pi_le_iff dist_nonneg).2 fun b => (Real.dist_le_of_mem_uIcc _ _).trans (dist_le_pi_dist x' y' b)
[GOAL]
case refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x y x' y' : β → ℝ
hx : x ∈ Set.Icc x' y'
hy : y ∈ Set.Icc x' y'
b : β
⊢ x b ∈ Set.uIcc (x' b) (y' b)
[PROOFSTEP]
refine' Icc_subset_uIcc _
[GOAL]
case refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x y x' y' : β → ℝ
hx : x ∈ Set.Icc x' y'
hy : y ∈ Set.Icc x' y'
b : β
⊢ y b ∈ Set.uIcc (x' b) (y' b)
[PROOFSTEP]
refine' Icc_subset_uIcc _
[GOAL]
case refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x y x' y' : β → ℝ
hx : x ∈ Set.Icc x' y'
hy : y ∈ Set.Icc x' y'
b : β
⊢ x b ∈ Set.Icc (x' b) (y' b)
case refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
x y x' y' : β → ℝ
hx : x ∈ Set.Icc x' y'
hy : y ∈ Set.Icc x' y'
b : β
⊢ y b ∈ Set.Icc (x' b) (y' b)
[PROOFSTEP]
exacts [⟨hx.1 _, hx.2 _⟩, ⟨hy.1 _, hy.2 _⟩]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
⊢ SecondCountableTopology α
[PROOFSTEP]
suffices SigmaCompactSpace α by exact EMetric.secondCountable_of_sigmaCompact α
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
this : SigmaCompactSpace α
⊢ SecondCountableTopology α
[PROOFSTEP]
exact EMetric.secondCountable_of_sigmaCompact α
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
⊢ SigmaCompactSpace α
[PROOFSTEP]
rcases em (Nonempty α) with (⟨⟨x⟩⟩ | hn)
[GOAL]
case inl.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
⊢ SigmaCompactSpace α
[PROOFSTEP]
exact ⟨⟨fun n => closedBall x n, fun n => isCompact_closedBall _ _, iUnion_closedBall_nat _⟩⟩
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
hn : ¬Nonempty α
⊢ SigmaCompactSpace α
[PROOFSTEP]
exact ⟨⟨fun _ => ∅, fun _ => isCompact_empty, iUnion_eq_univ_iff.2 fun x => (hn ⟨x⟩).elim⟩⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
⊢ Tendsto (dist x) (cocompact α) atTop
[PROOFSTEP]
simpa only [dist_comm] using tendsto_dist_right_cocompact_atTop x
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
f : Filter α
hf : Cauchy f
⊢ ∃ x, f ≤ 𝓝 x
[PROOFSTEP]
obtain ⟨t, t_fset, ht⟩ : ∃ t ∈ f, ∀ x ∈ t, ∀ y ∈ t, dist x y < 1 := (Metric.cauchy_iff.1 hf).2 1 zero_lt_one
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
f : Filter α
hf : Cauchy f
t : Set α
t_fset : t ∈ f
ht : ∀ (x : α), x ∈ t → ∀ (y : α), y ∈ t → dist x y < 1
⊢ ∃ x, f ≤ 𝓝 x
[PROOFSTEP]
rcases hf.1.nonempty_of_mem t_fset with ⟨x, xt⟩
[GOAL]
case intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
f : Filter α
hf : Cauchy f
t : Set α
t_fset : t ∈ f
ht : ∀ (x : α), x ∈ t → ∀ (y : α), y ∈ t → dist x y < 1
x : α
xt : x ∈ t
⊢ ∃ x, f ≤ 𝓝 x
[PROOFSTEP]
have : closedBall x 1 ∈ f := mem_of_superset t_fset fun y yt => (ht y yt x xt).le
[GOAL]
case intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
f : Filter α
hf : Cauchy f
t : Set α
t_fset : t ∈ f
ht : ∀ (x : α), x ∈ t → ∀ (y : α), y ∈ t → dist x y < 1
x : α
xt : x ∈ t
this : closedBall x 1 ∈ f
⊢ ∃ x, f ≤ 𝓝 x
[PROOFSTEP]
rcases(isCompact_iff_totallyBounded_isComplete.1 (isCompact_closedBall x 1)).2 f hf (le_principal_iff.2 this) with
  ⟨y, -, hy⟩
[GOAL]
case intro.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
f : Filter α
hf : Cauchy f
t : Set α
t_fset : t ∈ f
ht : ∀ (x : α), x ∈ t → ∀ (y : α), y ∈ t → dist x y < 1
x : α
xt : x ∈ t
this : closedBall x 1 ∈ f
y : α
hy : f ≤ 𝓝 y
⊢ ∃ x, f ≤ 𝓝 x
[PROOFSTEP]
exact ⟨y, hy⟩
[GOAL]
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝⁴ : PseudoMetricSpace α✝
α : Type u_3
β : Type u_4
inst✝³ : PseudoMetricSpace α
inst✝² : PseudoMetricSpace β
inst✝¹ : ProperSpace α
inst✝ : ProperSpace β
⊢ ∀ (x : α × β) (r : ℝ), IsCompact (closedBall x r)
[PROOFSTEP]
rintro ⟨x, y⟩ r
[GOAL]
case mk
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝⁴ : PseudoMetricSpace α✝
α : Type u_3
β : Type u_4
inst✝³ : PseudoMetricSpace α
inst✝² : PseudoMetricSpace β
inst✝¹ : ProperSpace α
inst✝ : ProperSpace β
x : α
y : β
r : ℝ
⊢ IsCompact (closedBall (x, y) r)
[PROOFSTEP]
rw [← closedBall_prod_same x y]
[GOAL]
case mk
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝⁴ : PseudoMetricSpace α✝
α : Type u_3
β : Type u_4
inst✝³ : PseudoMetricSpace α
inst✝² : PseudoMetricSpace β
inst✝¹ : ProperSpace α
inst✝ : ProperSpace β
x : α
y : β
r : ℝ
⊢ IsCompact (closedBall x r ×ˢ closedBall y r)
[PROOFSTEP]
exact (isCompact_closedBall x r).prod (isCompact_closedBall y r)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
h : ∀ (b : β), ProperSpace (π b)
⊢ ProperSpace ((b : β) → π b)
[PROOFSTEP]
refine' properSpace_of_compact_closedBall_of_le 0 fun x r hr => _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
h : ∀ (b : β), ProperSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 ≤ r
⊢ IsCompact (closedBall x r)
[PROOFSTEP]
rw [closedBall_pi _ hr]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
π : β → Type u_3
inst✝¹ : Fintype β
inst✝ : (b : β) → PseudoMetricSpace (π b)
h : ∀ (b : β), ProperSpace (π b)
x : (b : β) → π b
r : ℝ
hr : 0 ≤ r
⊢ IsCompact (Set.pi univ fun b => closedBall (x b) r)
[PROOFSTEP]
exact isCompact_univ_pi fun _ => isCompact_closedBall _ _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
rcases eq_empty_or_nonempty s with (rfl | hne)
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
hr : 0 < r
hs : IsClosed ∅
h : ∅ ⊆ ball x r
⊢ ∃ r', r' ∈ Ioo 0 r ∧ ∅ ⊆ ball x r'
[PROOFSTEP]
exact ⟨r / 2, ⟨half_pos hr, half_lt_self hr⟩, empty_subset _⟩
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
hne : Set.Nonempty s
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
have : IsCompact s := isCompact_of_isClosed_subset (isCompact_closedBall x r) hs (h.trans ball_subset_closedBall)
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
hne : Set.Nonempty s
this : IsCompact s
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
obtain ⟨y, hys, hy⟩ : ∃ y ∈ s, s ⊆ closedBall x (dist y x) :=
  this.exists_forall_ge hne (continuous_id.dist continuous_const).continuousOn
[GOAL]
case inr.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
hne : Set.Nonempty s
this : IsCompact s
y : α
hys : y ∈ s
hy : s ⊆ closedBall x (dist y x)
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
have hyr : dist y x < r := h hys
[GOAL]
case inr.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
hne : Set.Nonempty s
this : IsCompact s
y : α
hys : y ∈ s
hy : s ⊆ closedBall x (dist y x)
hyr : dist y x < r
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
rcases exists_between hyr with ⟨r', hyr', hrr'⟩
[GOAL]
case inr.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hr : 0 < r
hs : IsClosed s
h : s ⊆ ball x r
hne : Set.Nonempty s
this : IsCompact s
y : α
hys : y ∈ s
hy : s ⊆ closedBall x (dist y x)
hyr : dist y x < r
r' : ℝ
hyr' : dist y x < r'
hrr' : r' < r
⊢ ∃ r', r' ∈ Ioo 0 r ∧ s ⊆ ball x r'
[PROOFSTEP]
exact ⟨r', ⟨dist_nonneg.trans_lt hyr', hrr'⟩, hy.trans <| closedBall_subset_ball hyr'⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hs : IsClosed s
h : s ⊆ ball x r
⊢ ∃ r', r' < r ∧ s ⊆ ball x r'
[PROOFSTEP]
cases' le_or_lt r 0 with hr hr
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hs : IsClosed s
h : s ⊆ ball x r
hr : r ≤ 0
⊢ ∃ r', r' < r ∧ s ⊆ ball x r'
[PROOFSTEP]
rw [ball_eq_empty.2 hr, subset_empty_iff] at h 
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hs : IsClosed s
h : s = ∅
hr : r ≤ 0
⊢ ∃ r', r' < r ∧ s ⊆ ball x r'
[PROOFSTEP]
subst s
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
hr : r ≤ 0
hs : IsClosed ∅
⊢ ∃ r', r' < r ∧ ∅ ⊆ ball x r'
[PROOFSTEP]
exact (exists_lt r).imp fun r' hr' => ⟨hr', empty_subset _⟩
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
inst✝ : ProperSpace α
x : α
r : ℝ
s : Set α
hs : IsClosed s
h : s ⊆ ball x r
hr : 0 < r
⊢ ∃ r', r' < r ∧ s ⊆ ball x r'
[PROOFSTEP]
exact (exists_pos_lt_subset_ball hr hs h).imp fun r' hr' => ⟨hr'.1.2, hr'.2⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
⊢ SecondCountableTopology α
[PROOFSTEP]
refine' EMetric.secondCountable_of_almost_dense_set fun ε ε0 => _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
ε : ℝ≥0∞
ε0 : ε > 0
⊢ ∃ t, Set.Countable t ∧ ⋃ (x : α) (_ : x ∈ t), EMetric.closedBall x ε = univ
[PROOFSTEP]
rcases ENNReal.lt_iff_exists_nnreal_btwn.1 ε0 with ⟨ε', ε'0, ε'ε⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
ε : ℝ≥0∞
ε0 : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
⊢ ∃ t, Set.Countable t ∧ ⋃ (x : α) (_ : x ∈ t), EMetric.closedBall x ε = univ
[PROOFSTEP]
choose s hsc y hys hyx using H ε' (by exact_mod_cast ε'0)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
ε : ℝ≥0∞
ε0 : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
⊢ ↑ε' > 0
[PROOFSTEP]
exact_mod_cast ε'0
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
ε : ℝ≥0∞
ε0 : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
s : Set α
hsc : Set.Countable s
y : α → α
hys : ∀ (x : α), y x ∈ s
hyx : ∀ (x : α), dist x (y x) ≤ ↑ε'
⊢ ∃ t, Set.Countable t ∧ ⋃ (x : α) (_ : x ∈ t), EMetric.closedBall x ε = univ
[PROOFSTEP]
refine' ⟨s, hsc, iUnion₂_eq_univ_iff.2 fun x => ⟨y x, hys _, le_trans _ ε'ε.le⟩⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
ε : ℝ≥0∞
ε0 : ε > 0
ε' : ℝ≥0
ε'0 : 0 < ↑ε'
ε'ε : ↑ε' < ε
s : Set α
hsc : Set.Countable s
y : α → α
hys : ∀ (x : α), y x ∈ s
hyx : ∀ (x : α), dist x (y x) ≤ ↑ε'
x : α
⊢ edist x (y x) ≤ ↑ε'
[PROOFSTEP]
exact_mod_cast hyx x
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
c : Set (Set α)
hs : IsCompact s
hc₁ : ∀ (t : Set α), t ∈ c → IsOpen t
hc₂ : s ⊆ ⋃₀ c
⊢ ∃ δ, δ > 0 ∧ ∀ (x : α), x ∈ s → ∃ t, t ∈ c ∧ ball x δ ⊆ t
[PROOFSTEP]
rw [sUnion_eq_iUnion] at hc₂ 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
c : Set (Set α)
hs : IsCompact s
hc₁ : ∀ (t : Set α), t ∈ c → IsOpen t
hc₂ : s ⊆ ⋃ (i : ↑c), ↑i
⊢ ∃ δ, δ > 0 ∧ ∀ (x : α), x ∈ s → ∃ t, t ∈ c ∧ ball x δ ⊆ t
[PROOFSTEP]
simpa using lebesgue_number_lemma_of_metric hs (by simpa) hc₂
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
c : Set (Set α)
hs : IsCompact s
hc₁ : ∀ (t : Set α), t ∈ c → IsOpen t
hc₂ : s ⊆ ⋃ (i : ↑c), ↑i
⊢ ∀ (i : ↑c), IsOpen ↑i
[PROOFSTEP]
simpa
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
s : Set α
⊢ Bounded s ↔ IsBounded s
[PROOFSTEP]
change Bounded s ↔ sᶜ ∈ (cobounded α).sets
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
s : Set α
⊢ Bounded s ↔ sᶜ ∈ (cobounded α).sets
[PROOFSTEP]
simp [PseudoMetricSpace.cobounded_sets, Metric.Bounded]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
⊢ ∀ (x : α), x ∈ ∅ → ∀ (y : α), y ∈ ∅ → dist x y ≤ 0
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
c : α
⊢ Bounded s ↔ ∃ r, s ⊆ closedBall c r
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
c : α
⊢ Bounded s → ∃ r, s ⊆ closedBall c r
[PROOFSTEP]
rintro ⟨C, hC⟩
[GOAL]
case mpr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
c : α
⊢ (∃ r, s ⊆ closedBall c r) → Bounded s
[PROOFSTEP]
rintro ⟨C, hC⟩
[GOAL]
case mp.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
c : α
C : ℝ
hC : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → dist x y ≤ C
⊢ ∃ r, s ⊆ closedBall c r
[PROOFSTEP]
rcases s.eq_empty_or_nonempty with (rfl | ⟨x, hx⟩)
[GOAL]
case mp.intro.inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
t : Set α
r : ℝ
c : α
C : ℝ
hC : ∀ (x : α), x ∈ ∅ → ∀ (y : α), y ∈ ∅ → dist x y ≤ C
⊢ ∃ r, ∅ ⊆ closedBall c r
[PROOFSTEP]
exact ⟨0, by simp⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
t : Set α
r : ℝ
c : α
C : ℝ
hC : ∀ (x : α), x ∈ ∅ → ∀ (y : α), y ∈ ∅ → dist x y ≤ C
⊢ ∅ ⊆ closedBall c 0
[PROOFSTEP]
simp
[GOAL]
case mp.intro.inr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ : α
s t : Set α
r : ℝ
c : α
C : ℝ
hC : ∀ (x : α), x ∈ s → ∀ (y : α), y ∈ s → dist x y ≤ C
x : α
hx : x ∈ s
⊢ ∃ r, s ⊆ closedBall c r
[PROOFSTEP]
exact
  ⟨C + dist x c, fun y hy =>
    calc
      dist y c ≤ dist y x + dist x c := dist_triangle _ _ _
      _ ≤ C + dist x c := add_le_add_right (hC y hy x hx) _⟩
[GOAL]
case mpr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
c : α
C : ℝ
hC : s ⊆ closedBall c C
⊢ Bounded s
[PROOFSTEP]
exact bounded_closedBall.mono hC
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
h : Bounded s
a : ℝ
c : α
⊢ ∃ r, a < r ∧ s ⊆ closedBall c r
[PROOFSTEP]
rcases h.subset_ball c with ⟨r, hr⟩
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r✝ : ℝ
h : Bounded s
a : ℝ
c : α
r : ℝ
hr : s ⊆ closedBall c r
⊢ ∃ r, a < r ∧ s ⊆ closedBall c r
[PROOFSTEP]
refine' ⟨max r (a + 1), lt_of_lt_of_le (by linarith) (le_max_right _ _), _⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r✝ : ℝ
h : Bounded s
a : ℝ
c : α
r : ℝ
hr : s ⊆ closedBall c r
⊢ a < a + 1
[PROOFSTEP]
linarith
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r✝ : ℝ
h : Bounded s
a : ℝ
c : α
r : ℝ
hr : s ⊆ closedBall c r
⊢ s ⊆ closedBall c (max r (a + 1))
[PROOFSTEP]
exact hr.trans (closedBall_subset_closedBall (le_max_left _ _))
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
⊢ Bounded (s ∪ t) ↔ Bounded s ∧ Bounded t
[PROOFSTEP]
simp only [bounded_iff_isBounded, isBounded_union]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
I : Set β
s : β → Set α
H : Set.Finite I
⊢ Bounded (⋃ (i : β) (_ : i ∈ I), s i) ↔ ∀ (i : β), i ∈ I → Bounded (s i)
[PROOFSTEP]
simp only [bounded_iff_isBounded, isBounded_biUnion H]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t✝ : Set α
r : ℝ
inst✝ : PseudoMetricSpace β
s : Set α
t : Set β
hs : Bounded s
ht : Bounded t
⊢ Bounded (s ×ˢ t)
[PROOFSTEP]
rw [bounded_iff_isBounded] at *
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t✝ : Set α
r : ℝ
inst✝ : PseudoMetricSpace β
s : Set α
t : Set β
hs : IsBounded s
ht : IsBounded t
⊢ IsBounded (s ×ˢ t)
[PROOFSTEP]
exact hs.prod ht
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
f : β → α
hf : Tendsto (Prod.map f f) (Filter.cofinite ×ˢ Filter.cofinite) (𝓤 α)
⊢ Bounded (range f)
[PROOFSTEP]
rcases(hasBasis_cofinite.prod_self.tendsto_iff uniformity_basis_dist).1 hf 1 zero_lt_one with ⟨s, hsf, hs1⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
f : β → α
hf : Tendsto (Prod.map f f) (Filter.cofinite ×ˢ Filter.cofinite) (𝓤 α)
s : Set β
hsf : Set.Finite s
hs1 : ∀ (x : β × β), x ∈ sᶜ ×ˢ sᶜ → Prod.map f f x ∈ {p | dist p.fst p.snd < 1}
⊢ Bounded (range f)
[PROOFSTEP]
rw [← image_univ, ← union_compl_self s, image_union, bounded_union]
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
f : β → α
hf : Tendsto (Prod.map f f) (Filter.cofinite ×ˢ Filter.cofinite) (𝓤 α)
s : Set β
hsf : Set.Finite s
hs1 : ∀ (x : β × β), x ∈ sᶜ ×ˢ sᶜ → Prod.map f f x ∈ {p | dist p.fst p.snd < 1}
⊢ Bounded (f '' s) ∧ Bounded (f '' sᶜ)
[PROOFSTEP]
use(hsf.image f).bounded, 1
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
f : β → α
hf : Tendsto (Prod.map f f) (Filter.cofinite ×ˢ Filter.cofinite) (𝓤 α)
s : Set β
hsf : Set.Finite s
hs1 : ∀ (x : β × β), x ∈ sᶜ ×ˢ sᶜ → Prod.map f f x ∈ {p | dist p.fst p.snd < 1}
⊢ ∀ (x : α), x ∈ f '' sᶜ → ∀ (y : α), y ∈ f '' sᶜ → dist x y ≤ 1
[PROOFSTEP]
rintro _ ⟨x, hx, rfl⟩ _ ⟨y, hy, rfl⟩
[GOAL]
case h.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
f : β → α
hf : Tendsto (Prod.map f f) (Filter.cofinite ×ˢ Filter.cofinite) (𝓤 α)
s : Set β
hsf : Set.Finite s
hs1 : ∀ (x : β × β), x ∈ sᶜ ×ˢ sᶜ → Prod.map f f x ∈ {p | dist p.fst p.snd < 1}
x : β
hx : x ∈ sᶜ
y : β
hy : y ∈ sᶜ
⊢ dist (f x) (f y) ≤ 1
[PROOFSTEP]
exact le_of_lt (hs1 (x, y) ⟨hx, hy⟩)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
f : ℕ → α
hf : CauchySeq f
⊢ Cauchy (map f Filter.cofinite)
[PROOFSTEP]
rwa [Nat.cofinite_eq_atTop]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ ∃ t, k ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s))
[PROOFSTEP]
refine hk.induction_on ?_ ?_ ?_ ?_
[GOAL]
case refine_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ ∃ t, ∅ ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s))
[PROOFSTEP]
exact ⟨∅, Subset.rfl, isOpen_empty, by simp only [image_empty, bounded_empty, empty_inter]⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ Bounded (f '' (∅ ∩ s))
[PROOFSTEP]
simp only [image_empty, bounded_empty, empty_inter]
[GOAL]
case refine_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ ∀ ⦃s_1 t : Set β⦄,
    s_1 ⊆ t →
      (∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))) → ∃ t, s_1 ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s))
[PROOFSTEP]
rintro s s' hss' ⟨t, s't, t_open, t_bounded⟩
[GOAL]
case refine_2.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝¹ t✝ : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s✝ : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s✝ x
s s' : Set β
hss' : s ⊆ s'
t : Set β
s't : s' ⊆ t
t_open : IsOpen t
t_bounded : Bounded (f '' (t ∩ s✝))
⊢ ∃ t, s ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s✝))
[PROOFSTEP]
exact ⟨t, hss'.trans s't, t_open, t_bounded⟩
[GOAL]
case refine_3
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ ∀ ⦃s_1 t : Set β⦄,
    (∃ t, s_1 ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s))) →
      (∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))) →
        ∃ t_1, s_1 ∪ t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
rintro s s' ⟨t, st, t_open, t_bounded⟩ ⟨t', s't', t'_open, t'_bounded⟩
[GOAL]
case refine_3.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝¹ t✝ : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s✝ : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s✝ x
s s' t : Set β
st : s ⊆ t
t_open : IsOpen t
t_bounded : Bounded (f '' (t ∩ s✝))
t' : Set β
s't' : s' ⊆ t'
t'_open : IsOpen t'
t'_bounded : Bounded (f '' (t' ∩ s✝))
⊢ ∃ t, s ∪ s' ⊆ t ∧ IsOpen t ∧ Bounded (f '' (t ∩ s✝))
[PROOFSTEP]
refine' ⟨t ∪ t', union_subset_union st s't', t_open.union t'_open, _⟩
[GOAL]
case refine_3.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝¹ t✝ : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s✝ : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s✝ x
s s' t : Set β
st : s ⊆ t
t_open : IsOpen t
t_bounded : Bounded (f '' (t ∩ s✝))
t' : Set β
s't' : s' ⊆ t'
t'_open : IsOpen t'
t'_bounded : Bounded (f '' (t' ∩ s✝))
⊢ Bounded (f '' ((t ∪ t') ∩ s✝))
[PROOFSTEP]
rw [union_inter_distrib_right, image_union]
[GOAL]
case refine_3.intro.intro.intro.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝¹ t✝ : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s✝ : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s✝ x
s s' t : Set β
st : s ⊆ t
t_open : IsOpen t
t_bounded : Bounded (f '' (t ∩ s✝))
t' : Set β
s't' : s' ⊆ t'
t'_open : IsOpen t'
t'_bounded : Bounded (f '' (t' ∩ s✝))
⊢ Bounded (f '' (t ∩ s✝) ∪ f '' (t' ∩ s✝))
[PROOFSTEP]
exact t_bounded.union t'_bounded
[GOAL]
case refine_4
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
⊢ ∀ (x : β), x ∈ k → ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
intro x hx
[GOAL]
case refine_4
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
⊢ ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
have A : ball (f x) 1 ∈ 𝓝 (f x) := ball_mem_nhds _ zero_lt_one
[GOAL]
case refine_4
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
⊢ ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
have B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x := hf x hx A
[GOAL]
case refine_4
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
⊢ ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
obtain ⟨u, u_open, xu, uf⟩ : ∃ u : Set β, IsOpen u ∧ x ∈ u ∧ u ∩ s ⊆ f ⁻¹' ball (f x) 1
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
⊢ ∃ u, IsOpen u ∧ x ∈ u ∧ u ∩ s ⊆ f ⁻¹' ball (f x) 1
case refine_4.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
exact _root_.mem_nhdsWithin.1 B
[GOAL]
case refine_4.intro.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ ∃ t, t ∈ 𝓝[k] x ∧ ∃ t_1, t ⊆ t_1 ∧ IsOpen t_1 ∧ Bounded (f '' (t_1 ∩ s))
[PROOFSTEP]
refine' ⟨u, _, u, Subset.rfl, u_open, _⟩
[GOAL]
case refine_4.intro.intro.intro.refine'_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ u ∈ 𝓝[k] x
[PROOFSTEP]
apply nhdsWithin_le_nhds
[GOAL]
case refine_4.intro.intro.intro.refine'_1.a
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ u ∈ 𝓝 x
[PROOFSTEP]
exact u_open.mem_nhds xu
[GOAL]
case refine_4.intro.intro.intro.refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ Bounded (f '' (u ∩ s))
[PROOFSTEP]
apply Bounded.mono (image_subset _ uf)
[GOAL]
case refine_4.intro.intro.intro.refine'_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s✝ t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k s : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f s x
x : β
hx : x ∈ k
A : ball (f x) 1 ∈ 𝓝 (f x)
B : f ⁻¹' ball (f x) 1 ∈ 𝓝[s] x
u : Set β
u_open : IsOpen u
xu : x ∈ u
uf : u ∩ s ⊆ f ⁻¹' ball (f x) 1
⊢ Bounded (f '' (f ⁻¹' ball (f x) 1))
[PROOFSTEP]
exact bounded_ball.mono (image_preimage_subset _ _)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousAt f x
⊢ ∃ t, k ⊆ t ∧ IsOpen t ∧ Bounded (f '' t)
[PROOFSTEP]
simp_rw [← continuousWithinAt_univ] at hf 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
inst✝ : TopologicalSpace β
k : Set β
f : β → α
hk : IsCompact k
hf : ∀ (x : β), x ∈ k → ContinuousWithinAt f univ x
⊢ ∃ t, k ⊆ t ∧ IsOpen t ∧ Bounded (f '' t)
[PROOFSTEP]
simpa only [inter_univ] using exists_isOpen_bounded_image_inter_of_isCompact_of_forall_continuousWithinAt hk hf
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
s t : Set α
r : ℝ
inst✝ : ProperSpace α
hc : IsClosed s
hb : Bounded s
⊢ IsCompact s
[PROOFSTEP]
rcases eq_empty_or_nonempty s with (rfl | ⟨x, -⟩)
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x : α
t : Set α
r : ℝ
inst✝ : ProperSpace α
hc : IsClosed ∅
hb : Bounded ∅
⊢ IsCompact ∅
[PROOFSTEP]
exact isCompact_empty
[GOAL]
case inr.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s t : Set α
r : ℝ
inst✝ : ProperSpace α
hc : IsClosed s
hb : Bounded s
x : α
⊢ IsCompact s
[PROOFSTEP]
rcases hb.subset_ball x with ⟨r, hr⟩
[GOAL]
case inr.intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
x✝ : α
s t : Set α
r✝ : ℝ
inst✝ : ProperSpace α
hc : IsClosed s
hb : Bounded s
x : α
r : ℝ
hr : s ⊆ closedBall x r
⊢ IsCompact s
[PROOFSTEP]
exact isCompact_of_isClosed_subset (isCompact_closedBall x r) hc hr
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
hs : Set.Subsingleton s
⊢ diam s = 0
[PROOFSTEP]
simp only [diam, EMetric.diam_subsingleton hs, ENNReal.zero_toReal]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ diam {x, y} = dist x y
[PROOFSTEP]
simp only [diam, EMetric.diam_pair, dist_edist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ diam {x, y, z} = max (max (dist x y) (dist x z)) (dist y z)
[PROOFSTEP]
simp only [Metric.diam, EMetric.diam_triple, dist_edist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ ENNReal.toReal (max (max (edist x y) (edist x z)) (edist y z)) =
    max (max (ENNReal.toReal (edist x y)) (ENNReal.toReal (edist x z))) (ENNReal.toReal (edist y z))
[PROOFSTEP]
rw [ENNReal.toReal_max, ENNReal.toReal_max]
[GOAL]
case hr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ edist x y ≠ ⊤
[PROOFSTEP]
apply_rules [ne_of_lt, edist_lt_top, max_lt]
[GOAL]
case hp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ edist x z ≠ ⊤
[PROOFSTEP]
apply_rules [ne_of_lt, edist_lt_top, max_lt]
[GOAL]
case hr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ max (edist x y) (edist x z) ≠ ⊤
[PROOFSTEP]
apply_rules [ne_of_lt, edist_lt_top, max_lt]
[GOAL]
case hp
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
⊢ edist y z ≠ ⊤
[PROOFSTEP]
apply_rules [ne_of_lt, edist_lt_top, max_lt]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
h : EMetric.diam s ≠ ⊤
hx : x ∈ s
hy : y ∈ s
⊢ dist x y ≤ diam s
[PROOFSTEP]
rw [diam, dist_edist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
h : EMetric.diam s ≠ ⊤
hx : x ∈ s
hy : y ∈ s
⊢ ENNReal.toReal (edist x y) ≤ ENNReal.toReal (EMetric.diam s)
[PROOFSTEP]
rw [ENNReal.toReal_le_toReal (edist_ne_top _ _) h]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
h : EMetric.diam s ≠ ⊤
hx : x ∈ s
hy : y ∈ s
⊢ edist x y ≤ EMetric.diam s
[PROOFSTEP]
exact EMetric.edist_le_diam_of_mem hx hy
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
s : Set α
x y z : α
inst✝ : ProperSpace α
⊢ EMetric.diam univ = ⊤ ↔ NoncompactSpace α
[PROOFSTEP]
rw [← not_compactSpace_iff, compactSpace_iff_bounded_univ, bounded_iff_ediam_ne_top, Classical.not_not]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
s : Set α
x y z : α
inst✝¹ : ProperSpace α
inst✝ : NoncompactSpace α
⊢ diam univ = 0
[PROOFSTEP]
simp [diam]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
h : ¬Bounded s
⊢ diam s = 0
[PROOFSTEP]
rw [diam, ediam_of_unbounded h, ENNReal.top_toReal]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
xs : x ∈ s
yt : y ∈ t
⊢ diam (s ∪ t) ≤ diam s + dist x y + diam t
[PROOFSTEP]
simp only [diam, dist_edist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
xs : x ∈ s
yt : y ∈ t
⊢ ENNReal.toReal (EMetric.diam (s ∪ t)) ≤
    ENNReal.toReal (EMetric.diam s) + ENNReal.toReal (edist x y) + ENNReal.toReal (EMetric.diam t)
[PROOFSTEP]
refine (ENNReal.toReal_le_add' (EMetric.diam_union xs yt) ?_ ?_).trans (add_le_add_right ENNReal.toReal_add_le _)
[GOAL]
case refine_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
xs : x ∈ s
yt : y ∈ t
⊢ EMetric.diam s + edist x y = ⊤ → EMetric.diam (s ∪ t) = ⊤
[PROOFSTEP]
simp only [ENNReal.add_eq_top, edist_ne_top, or_false]
[GOAL]
case refine_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
xs : x ∈ s
yt : y ∈ t
⊢ EMetric.diam s = ⊤ → EMetric.diam (s ∪ t) = ⊤
[PROOFSTEP]
exact fun h ↦ top_unique <| h ▸ EMetric.diam_mono (subset_union_left _ _)
[GOAL]
case refine_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
xs : x ∈ s
yt : y ∈ t
⊢ EMetric.diam t = ⊤ → EMetric.diam (s ∪ t) = ⊤
[PROOFSTEP]
exact fun h ↦ top_unique <| h ▸ EMetric.diam_mono (subset_union_right _ _)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
t : Set α
h : Set.Nonempty (s ∩ t)
⊢ diam (s ∪ t) ≤ diam s + diam t
[PROOFSTEP]
rcases h with ⟨x, ⟨xs, xt⟩⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x✝ y z : α
t : Set α
x : α
xs : x ∈ s
xt : x ∈ t
⊢ diam (s ∪ t) ≤ diam s + diam t
[PROOFSTEP]
simpa using diam_union xs xt
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s : Set α
x y z : α
r : ℝ
hr : 0 ≤ r
h : s ⊆ closedBall x r
a : α
ha : a ∈ s
b : α
hb : b ∈ s
⊢ r + r = 2 * r
[PROOFSTEP]
simp [mul_two, mul_comm]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
⊢ Set.Nonempty (⋂ (n : ℕ), s n)
[PROOFSTEP]
let u N := (h N).some
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
⊢ Set.Nonempty (⋂ (n : ℕ), s n)
[PROOFSTEP]
have I : ∀ n N, n ≤ N → u N ∈ s n := by
  intro n N hn
  apply mem_of_subset_of_mem _ (h N).choose_spec
  intro x hx
  simp only [mem_iInter] at hx 
  exact hx n hn
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
⊢ ∀ (n N : ℕ), n ≤ N → u N ∈ s n
[PROOFSTEP]
intro n N hn
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
n N : ℕ
hn : n ≤ N
⊢ u N ∈ s n
[PROOFSTEP]
apply mem_of_subset_of_mem _ (h N).choose_spec
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
n N : ℕ
hn : n ≤ N
⊢ ⋂ (n : ℕ) (_ : n ≤ N), s n ⊆ s n
[PROOFSTEP]
intro x hx
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
n N : ℕ
hn : n ≤ N
x : α
hx : x ∈ ⋂ (n : ℕ) (_ : n ≤ N), s n
⊢ x ∈ s n
[PROOFSTEP]
simp only [mem_iInter] at hx 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
n N : ℕ
hn : n ≤ N
x : α
hx : ∀ (i : ℕ), i ≤ N → x ∈ s i
⊢ x ∈ s n
[PROOFSTEP]
exact hx n hn
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
⊢ Set.Nonempty (⋂ (n : ℕ), s n)
[PROOFSTEP]
have : CauchySeq u := by
  apply cauchySeq_of_le_tendsto_0 _ _ h'
  intro m n N hm hn
  exact dist_le_diam_of_mem (h's N) (I _ _ hm) (I _ _ hn)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
⊢ CauchySeq u
[PROOFSTEP]
apply cauchySeq_of_le_tendsto_0 _ _ h'
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
⊢ ∀ (n m N : ℕ), N ≤ n → N ≤ m → dist (u n) (u m) ≤ diam (s N)
[PROOFSTEP]
intro m n N hm hn
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
m n N : ℕ
hm : N ≤ m
hn : N ≤ n
⊢ dist (u m) (u n) ≤ diam (s N)
[PROOFSTEP]
exact dist_le_diam_of_mem (h's N) (I _ _ hm) (I _ _ hn)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
this : CauchySeq u
⊢ Set.Nonempty (⋂ (n : ℕ), s n)
[PROOFSTEP]
obtain ⟨x, -, xlim⟩ : ∃ x ∈ s 0, Tendsto (fun n : ℕ => u n) atTop (𝓝 x) :=
  cauchySeq_tendsto_of_isComplete h0 (fun n => I 0 n (zero_le _)) this
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
this : CauchySeq u
x : α
xlim : Tendsto (fun n => u n) atTop (𝓝 x)
⊢ Set.Nonempty (⋂ (n : ℕ), s n)
[PROOFSTEP]
refine' ⟨x, mem_iInter.2 fun n => _⟩
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
this : CauchySeq u
x : α
xlim : Tendsto (fun n => u n) atTop (𝓝 x)
n : ℕ
⊢ x ∈ s n
[PROOFSTEP]
apply (hs n).mem_of_tendsto xlim
[GOAL]
case intro.intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
this : CauchySeq u
x : α
xlim : Tendsto (fun n => u n) atTop (𝓝 x)
n : ℕ
⊢ ∀ᶠ (x : ℕ) in atTop, u x ∈ s n
[PROOFSTEP]
filter_upwards [Ici_mem_atTop n] with p hp
[GOAL]
case h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
s✝ : Set α
x✝ y z : α
s : ℕ → Set α
h0 : IsComplete (s 0)
hs : ∀ (n : ℕ), IsClosed (s n)
h's : ∀ (n : ℕ), Bounded (s n)
h : ∀ (N : ℕ), Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n)
h' : Tendsto (fun n => diam (s n)) atTop (𝓝 0)
u : ℕ → α := fun N => Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ N), s n))
I : ∀ (n N : ℕ), n ≤ N → u N ∈ s n
this : CauchySeq u
x : α
xlim : Tendsto (fun n => u n) atTop (𝓝 x)
n p : ℕ
hp : p ∈ Ici n
⊢ Set.Nonempty.some (_ : Set.Nonempty (⋂ (n : ℕ) (_ : n ≤ p), s n)) ∈ s n
[PROOFSTEP]
exact I n p hp
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝⁴ : PseudoMetricSpace α
inst✝³ : ProperSpace α
inst✝² : TopologicalSpace β
inst✝¹ : ConditionallyCompleteLinearOrder β
inst✝ : OrderTopology β
f : α → β
a z : α
r : ℝ
hf : ContinuousOn f (closedBall a r)
hz : z ∈ closedBall a r
hf1 : ∀ (z' : α), z' ∈ sphere a r → f z < f z'
⊢ ∃ z, z ∈ ball a r ∧ IsLocalMin f z
[PROOFSTEP]
simp_rw [← closedBall_diff_ball] at hf1 
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝⁴ : PseudoMetricSpace α
inst✝³ : ProperSpace α
inst✝² : TopologicalSpace β
inst✝¹ : ConditionallyCompleteLinearOrder β
inst✝ : OrderTopology β
f : α → β
a z : α
r : ℝ
hf : ContinuousOn f (closedBall a r)
hz : z ∈ closedBall a r
hf1 : ∀ (z' : α), z' ∈ closedBall a r \ ball a r → f z < f z'
⊢ ∃ z, z ∈ ball a r ∧ IsLocalMin f z
[PROOFSTEP]
exact (isCompact_closedBall a r).exists_isLocalMin_mem_open ball_subset_closedBall hf hz hf1 isOpen_ball
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
⊢ comap (fun y => dist y x) atTop ≤ cocompact α
[PROOFSTEP]
refine' Filter.hasBasis_cocompact.ge_iff.2 fun s hs => mem_comap.2 _
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s : Set α
hs : IsCompact s
⊢ ∃ t, t ∈ atTop ∧ (fun y => dist y x) ⁻¹' t ⊆ sᶜ
[PROOFSTEP]
rcases hs.bounded.subset_ball x with ⟨r, hr⟩
[GOAL]
case intro
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
s : Set α
hs : IsCompact s
r : ℝ
hr : s ⊆ closedBall x r
⊢ ∃ t, t ∈ atTop ∧ (fun y => dist y x) ⁻¹' t ⊆ sᶜ
[PROOFSTEP]
exact ⟨Ioi r, Ioi_mem_atTop r, fun y hy hys => (mem_closedBall.1 <| hr hys).not_lt hy⟩
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
x : α
⊢ comap (dist x) atTop ≤ cocompact α
[PROOFSTEP]
simpa only [dist_comm _ x] using comap_dist_right_atTop_le_cocompact x
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : β → α
l : Filter β
x : α
h : Tendsto (fun y => dist (f y) x) l atTop
⊢ Tendsto f l (cocompact α)
[PROOFSTEP]
refine' Tendsto.mono_right _ (comap_dist_right_atTop_le_cocompact x)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α
f : β → α
l : Filter β
x : α
h : Tendsto (fun y => dist (f y) x) l atTop
⊢ Tendsto f l (comap (fun y => dist y x) atTop)
[PROOFSTEP]
rwa [tendsto_comap_iff]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
m m' : MetricSpace α
h : PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
⊢ m = m'
[PROOFSTEP]
cases m
[GOAL]
case mk
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
m' : MetricSpace α
toPseudoMetricSpace✝ : PseudoMetricSpace α
eq_of_dist_eq_zero✝ : ∀ {x y : α}, dist x y = 0 → x = y
h : PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
⊢ mk eq_of_dist_eq_zero✝ = m'
[PROOFSTEP]
cases m'
[GOAL]
case mk.mk
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
toPseudoMetricSpace✝¹ : PseudoMetricSpace α
eq_of_dist_eq_zero✝¹ : ∀ {x y : α}, dist x y = 0 → x = y
toPseudoMetricSpace✝ : PseudoMetricSpace α
eq_of_dist_eq_zero✝ : ∀ {x y : α}, dist x y = 0 → x = y
h : PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
⊢ mk eq_of_dist_eq_zero✝¹ = mk eq_of_dist_eq_zero✝
[PROOFSTEP]
congr
[GOAL]
case mk.mk.e_toPseudoMetricSpace
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
toPseudoMetricSpace✝¹ : PseudoMetricSpace α
eq_of_dist_eq_zero✝¹ : ∀ {x y : α}, dist x y = 0 → x = y
toPseudoMetricSpace✝ : PseudoMetricSpace α
eq_of_dist_eq_zero✝ : ∀ {x y : α}, dist x y = 0 → x = y
h : PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
⊢ toPseudoMetricSpace✝¹ = toPseudoMetricSpace✝
[PROOFSTEP]
ext1
[GOAL]
case mk.mk.e_toPseudoMetricSpace.h
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝ : PseudoMetricSpace α✝
α : Type u_3
toPseudoMetricSpace✝¹ : PseudoMetricSpace α
eq_of_dist_eq_zero✝¹ : ∀ {x y : α}, dist x y = 0 → x = y
toPseudoMetricSpace✝ : PseudoMetricSpace α
eq_of_dist_eq_zero✝ : ∀ {x y : α}, dist x y = 0 → x = y
h : PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
⊢ PseudoMetricSpace.toDist = PseudoMetricSpace.toDist
[PROOFSTEP]
assumption
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ 0 = dist x y ↔ x = y
[PROOFSTEP]
rw [eq_comm, dist_eq_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ dist x y ≠ 0 ↔ x ≠ y
[PROOFSTEP]
simpa only [not_iff_not] using dist_eq_zero
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ dist x y ≤ 0 ↔ x = y
[PROOFSTEP]
simpa [le_antisymm_iff, dist_nonneg] using @dist_eq_zero _ _ x y
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ 0 < dist x y ↔ x ≠ y
[PROOFSTEP]
simpa only [not_le] using not_congr dist_le_zero
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ nndist x y = 0 → x = y
[PROOFSTEP]
simp only [← NNReal.eq_iff, ← dist_nndist, imp_self, NNReal.coe_zero, dist_eq_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ nndist x y = 0 ↔ x = y
[PROOFSTEP]
simp only [← NNReal.eq_iff, ← dist_nndist, imp_self, NNReal.coe_zero, dist_eq_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x y : γ
⊢ 0 = nndist x y ↔ x = y
[PROOFSTEP]
simp only [← NNReal.eq_iff, ← dist_nndist, imp_self, NNReal.coe_zero, zero_eq_dist]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝ : γ
s : Set γ
x : γ
r : ℝ
hr : r ≤ 0
⊢ Set.Subsingleton (closedBall x r)
[PROOFSTEP]
rcases hr.lt_or_eq with (hr | rfl)
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝ : γ
s : Set γ
x : γ
r : ℝ
hr✝ : r ≤ 0
hr : r < 0
⊢ Set.Subsingleton (closedBall x r)
[PROOFSTEP]
rw [closedBall_eq_empty.2 hr]
[GOAL]
case inl
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝ : γ
s : Set γ
x : γ
r : ℝ
hr✝ : r ≤ 0
hr : r < 0
⊢ Set.Subsingleton ∅
[PROOFSTEP]
exact subsingleton_empty
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝ : γ
s : Set γ
x : γ
hr : 0 ≤ 0
⊢ Set.Subsingleton (closedBall x 0)
[PROOFSTEP]
rw [closedBall_zero]
[GOAL]
case inr
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝ : γ
s : Set γ
x : γ
hr : 0 ≤ 0
⊢ Set.Subsingleton {x}
[PROOFSTEP]
exact subsingleton_singleton
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
γ : Type w
inst✝¹ : MetricSpace γ
x : γ
s : Set γ
inst✝ : MetricSpace β
f : γ → β
⊢ UniformEmbedding f ↔
    (∀ (ε : ℝ), ε > 0 → ∃ δ, δ > 0 ∧ ∀ {a b : γ}, dist a b < δ → dist (f a) (f b) < ε) ∧
      ∀ (δ : ℝ), δ > 0 → ∃ ε, ε > 0 ∧ ∀ {a b : γ}, dist (f a) (f b) < ε → dist a b < δ
[PROOFSTEP]
rw [uniformEmbedding_iff_uniformInducing, uniformInducing_iff, uniformContinuous_iff]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x : γ
s✝ s : Set γ
ε : ℝ
hε : 0 < ε
hs : Set.Pairwise s fun x y => ε ≤ dist x y
⊢ Set.Pairwise s fun x y => ¬(x, y) ∈ {p | dist p.fst p.snd < ε}
[PROOFSTEP]
simpa using hs
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α✝
γ : Type w
inst✝² : MetricSpace γ
x : γ
s : Set γ
α : Type u_3
inst✝¹ : TopologicalSpace α
inst✝ : DiscreteTopology α
ε : ℝ
hε : 0 < ε
f : α → γ
hf : Pairwise fun x y => ε ≤ dist (f x) (f y)
⊢ Pairwise fun x y => ¬(f x, f y) ∈ {p | dist p.fst p.snd < ε}
[PROOFSTEP]
simpa using hf
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x : γ
s : Set γ
β : Type u_3
ε : ℝ
hε : 0 < ε
f : β → α
hf : Pairwise fun x y => ε ≤ dist (f x) (f y)
⊢ UniformSpace α
[PROOFSTEP]
infer_instance
[GOAL]
α : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x : γ
s : Set γ
β : Type u_3
ε : ℝ
hε : 0 < ε
f : β → α
hf : Pairwise fun x y => ε ≤ dist (f x) (f y)
⊢ Pairwise fun x y => ¬(f x, f y) ∈ {p | dist p.fst p.snd < ε}
[PROOFSTEP]
simpa using hf
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
γ : Type w
inst✝² : MetricSpace γ
x : γ
s✝ : Set γ
inst✝¹ : ProperSpace α
K s : Set α
inst✝ : DiscreteTopology ↑s
hK : Bounded K
hs : IsClosed s
⊢ Set.Finite (K ∩ s)
[PROOFSTEP]
refine Set.Finite.subset (IsCompact.finite ?_ ?_) (Set.inter_subset_inter_left s subset_closure)
[GOAL]
case refine_1
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
γ : Type w
inst✝² : MetricSpace γ
x : γ
s✝ : Set γ
inst✝¹ : ProperSpace α
K s : Set α
inst✝ : DiscreteTopology ↑s
hK : Bounded K
hs : IsClosed s
⊢ IsCompact (closure K ∩ s)
[PROOFSTEP]
exact IsCompact.inter_right (Metric.Bounded.isCompact_closure hK) hs
[GOAL]
case refine_2
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝³ : PseudoMetricSpace α
γ : Type w
inst✝² : MetricSpace γ
x : γ
s✝ : Set γ
inst✝¹ : ProperSpace α
K s : Set α
inst✝ : DiscreteTopology ↑s
hK : Bounded K
hs : IsClosed s
⊢ DiscreteTopology ↑(closure K ∩ s)
[PROOFSTEP]
exact DiscreteTopology.of_subset inferInstance (Set.inter_subset_right _ s)
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ✝ : Type w
inst✝ : MetricSpace γ✝
γ : Type u_3
U : UniformSpace γ
m : MetricSpace γ
H : 𝓤 γ = 𝓤 γ
⊢ replaceUniformity m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ✝ : Type w
inst✝ : MetricSpace γ✝
γ : Type u_3
U : UniformSpace γ
m : MetricSpace γ
H : 𝓤 γ = 𝓤 γ
x✝¹ x✝ : γ
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ✝ : Type w
inst✝ : MetricSpace γ✝
γ : Type u_3
U : TopologicalSpace γ
m : MetricSpace γ
H : U = UniformSpace.toTopologicalSpace
⊢ replaceTopology m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ✝ : Type w
inst✝ : MetricSpace γ✝
γ : Type u_3
U : TopologicalSpace γ
m : MetricSpace γ
H : U = UniformSpace.toTopologicalSpace
x✝¹ x✝ : γ
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α✝
γ : Type w
inst✝ : MetricSpace γ
α : Type u_3
m : MetricSpace α
B : Bornology α
H : ∀ (s : Set α), IsBounded s ↔ IsBounded s
⊢ replaceBornology m H = m
[PROOFSTEP]
ext
[GOAL]
case h.dist.h.h
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α✝
γ : Type w
inst✝ : MetricSpace γ
α : Type u_3
m : MetricSpace α
B : Bornology α
H : ∀ (s : Set α), IsBounded s ↔ IsBounded s
x✝¹ x✝ : α
⊢ dist x✝¹ x✝ = dist x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝² x✝¹ x✝ : Empty
⊢ 0 ≤ 0 + 0
[PROOFSTEP]
rw [add_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
x✝² x✝¹ x✝ : PUnit
⊢ 0 ≤ 0 + 0
[PROOFSTEP]
rw [add_zero]
[GOAL]
α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝¹ : PseudoMetricSpace α
γ : Type w
inst✝ : MetricSpace γ
⊢ 𝓤 PUnit = ⨅ (ε : ℝ) (_ : ε > 0), 𝓟 {p | dist p.fst p.snd < ε}
[PROOFSTEP]
simp (config := { contextual := true }) [principal_univ, eq_top_of_neBot (𝓤 PUnit)]
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
⊢ SecondCountableTopology α
[PROOFSTEP]
refine secondCountable_of_almost_dense_set fun ε ε0 => ?_
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
⊢ ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
[PROOFSTEP]
rcases H ε ε0 with ⟨β, fβ, F, hF⟩
[GOAL]
case intro.intro.intro
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
β : Type u_3
fβ : Encodable β
F : α → β
hF : ∀ (x y : α), F x = F y → dist x y ≤ ε
⊢ ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
[PROOFSTEP]
let Finv := rangeSplitting F
[GOAL]
case intro.intro.intro
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
β : Type u_3
fβ : Encodable β
F : α → β
hF : ∀ (x y : α), F x = F y → dist x y ≤ ε
Finv : ↑(range F) → α := rangeSplitting F
⊢ ∃ s, Set.Countable s ∧ ∀ (x : α), ∃ y, y ∈ s ∧ dist x y ≤ ε
[PROOFSTEP]
refine ⟨range Finv, ⟨countable_range _, fun x => ?_⟩⟩
[GOAL]
case intro.intro.intro
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
β : Type u_3
fβ : Encodable β
F : α → β
hF : ∀ (x y : α), F x = F y → dist x y ≤ ε
Finv : ↑(range F) → α := rangeSplitting F
x : α
⊢ ∃ y, y ∈ range Finv ∧ dist x y ≤ ε
[PROOFSTEP]
let x' := Finv ⟨F x, mem_range_self _⟩
[GOAL]
case intro.intro.intro
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
β : Type u_3
fβ : Encodable β
F : α → β
hF : ∀ (x y : α), F x = F y → dist x y ≤ ε
Finv : ↑(range F) → α := rangeSplitting F
x : α
x' : α := Finv { val := F x, property := (_ : F x ∈ range F) }
⊢ ∃ y, y ∈ range Finv ∧ dist x y ≤ ε
[PROOFSTEP]
have : F x' = F x := apply_rangeSplitting F _
[GOAL]
case intro.intro.intro
α✝ : Type u
β✝ : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : MetricSpace α
H : ∀ (ε : ℝ), ε > 0 → ∃ β x F, ∀ (x y : α), F x = F y → dist x y ≤ ε
ε : ℝ
ε0 : ε > 0
β : Type u_3
fβ : Encodable β
F : α → β
hF : ∀ (x y : α), F x = F y → dist x y ≤ ε
Finv : ↑(range F) → α := rangeSplitting F
x : α
x' : α := Finv { val := F x, property := (_ : F x ∈ range F) }
this : F x' = F x
⊢ ∃ y, y ∈ range Finv ∧ dist x y ≤ ε
[PROOFSTEP]
exact ⟨x', mem_range_self _, hF _ _ this.symm⟩
[GOAL]
α✝ : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α✝
γ : Type w
inst✝¹ : MetricSpace γ
α : Type u
inst✝ : PseudoMetricSpace α
p q : UniformSpace.SeparationQuotient α
x y x' y' : α
hx : Setoid.r x x'
hy : Setoid.r y y'
⊢ dist x y = dist x' y'
[PROOFSTEP]
rw [dist_edist, dist_edist, ← UniformSpace.SeparationQuotient.edist_mk x, ← UniformSpace.SeparationQuotient.edist_mk x',
  Quot.sound hx, Quot.sound hy]
