-- Mathlib/MeasureTheory/Measure/Hausdorff.lean
theorem mkMetric'_isMetric (m : Set X → ℝ≥0∞) : (mkMetric' m).IsMetric

Proof state:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (fun r => (mkMetric'.pre m r) (s ∪ t)) =ᶠ[𝓝[>] 0] fun x => (mkMetric'.pre m x) s + (mkMetric'.pre m x) t

Tactic:
filter_upwards [Ioo_mem_nhdsGT r0]

Result:
case h
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ ∀ a ∈ Ioo 0 r, (mkMetric'.pre m a) (s ∪ t) = (mkMetric'.pre m a) s + (mkMetric'.pre m a) t

Proof state:
case h.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
⊢ ∀ (u : Set X), (s ∩ u).Nonempty → (t ∩ u).Nonempty → extend (fun s x => m s) u = ⊤

Tactic:
rintro u ⟨x, hxs, hxu⟩ ⟨y, hyt, hyu⟩

Result:
case h.intro.intro.intro.intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
u : Set X
x : X
hxs : x ∈ s
hxu : x ∈ u
y : X
hyt : y ∈ t
hyu : y ∈ u
⊢ extend (fun s x => m s) u = ⊤

Proof state:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : r ≠ 0
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (mkMetric' m) (s ∪ t) = (mkMetric' m) s + (mkMetric' m) t

Tactic:
refine tendsto_nhds_unique_of_eventuallyEq
  (mkMetric'.tendsto_pre _ _) ((mkMetric'.tendsto_pre _ _).add (mkMetric'.tendsto_pre _ _)) ?_

Result:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : r ≠ 0
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (fun r => (mkMetric'.pre m r) (s ∪ t)) =ᶠ[𝓝[>] 0] fun x => (mkMetric'.pre m x) s + (mkMetric'.pre m x) t

Proof state:
case h.intro.intro.intro.intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
u : Set X
x : X
hxs : x ∈ s
hxu : x ∈ u
y : X
hyt : y ∈ t
hyu : y ∈ u
⊢ extend (fun s x => m s) u = ⊤

Tactic:
have : ε < diam u := εr.trans_le ((hr x hxs y hyt).trans <| edist_le_diam_of_mem hxu hyu)

Result:
case h.intro.intro.intro.intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
u : Set X
x : X
hxs : x ∈ s
hxu : x ∈ u
y : X
hyt : y ∈ t
hyu : y ∈ u
this : ε < diam u
⊢ extend (fun s x => m s) u = ⊤

Proof state:
case h.intro.intro.intro.intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
u : Set X
x : X
hxs : x ∈ s
hxu : x ∈ u
y : X
hyt : y ∈ t
hyu : y ∈ u
this : ε < diam u
⊢ extend (fun s x => m s) u = ⊤

Tactic:
exact iInf_eq_top.2 fun h => (this.not_le h).elim

Result:
no goals

Proof state:
case h.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
⊢ (mkMetric'.pre m ε) (s ∪ t) = (mkMetric'.pre m ε) s + (mkMetric'.pre m ε) t

Tactic:
refine boundedBy_union_of_top_of_nonempty_inter ?_

Result:
case h.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
⊢ ∀ (u : Set X), (s ∩ u).Nonempty → (t ∩ u).Nonempty → extend (fun s x => m s) u = ⊤

Proof state:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : r ≠ 0
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (fun r => (mkMetric'.pre m r) (s ∪ t)) =ᶠ[𝓝[>] 0] fun x => (mkMetric'.pre m x) s + (mkMetric'.pre m x) t

Tactic:
rw [← pos_iff_ne_zero] at r0

Result:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (fun r => (mkMetric'.pre m r) (s ∪ t)) =ᶠ[𝓝[>] 0] fun x => (mkMetric'.pre m x) s + (mkMetric'.pre m x) t

Proof state:
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
⊢ (mkMetric' m).IsMetric

Tactic:
rintro s t ⟨r, r0, hr⟩

Result:
case intro.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : r ≠ 0
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ (mkMetric' m) (s ∪ t) = (mkMetric' m) s + (mkMetric' m) t

Proof state:
case h
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
⊢ ∀ a ∈ Ioo 0 r, (mkMetric'.pre m a) (s ∪ t) = (mkMetric'.pre m a) s + (mkMetric'.pre m a) t

Tactic:
rintro ε ⟨_, εr⟩

Result:
case h.intro
X : Type u_2
inst✝ : EMetricSpace X
m : Set X → ℝ≥0∞
s t : Set X
r : ℝ≥0∞
r0 : 0 < r
hr : ∀ x ∈ s, ∀ y ∈ t, r ≤ edist x y
ε : ℝ≥0∞
left✝ : 0 < ε
εr : ε < r
⊢ (mkMetric'.pre m ε) (s ∪ t) = (mkMetric'.pre m ε) s + (mkMetric'.pre m ε) t