Theorem: lebesgue_number_lemma
File: Mathlib/Topology/UniformSpace/Basic.lean

tactic: let u n := { x | ∃ i, ∃ m ∈ 𝓤 α, { y | (x, y) ∈ m ○ n } ⊆ c i }
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
⊢ ∃ n, n ∈ 𝓤 α ∧ ∀ (x : α), x ∈ s → ∃ i, {y | (x, y) ∈ n} ⊆ c i

tactic: have hu₁ : ∀ n ∈ 𝓤 α, IsOpen (u n) := by
  refine' fun n _ => isOpen_uniformity.2 _
  rintro x ⟨i, m, hm, h⟩
  rcases comp_mem_uniformity_sets hm with ⟨m', hm', mm'⟩
  apply (𝓤 α).sets_of_superset hm'
  rintro ⟨x, y⟩ hp rfl
  refine' ⟨i, m', hm', fun z hz => h (monotone_id.compRel monotone_const mm' _)⟩
  dsimp [-mem_compRel] at hz⊢
  rw [compRel_assoc]
  exact ⟨y, hp, hz⟩
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
⊢ ∃ n, n ∈ 𝓤 α ∧ ∀ (x : α), x ∈ s → ∃ i, {y | (x, y) ∈ n} ⊆ c i

tactic: have hu₂ : s ⊆ ⋃ n ∈ 𝓤 α, u n := fun x hx => by
  rcases mem_iUnion.1 (hc₂ hx) with ⟨i, h⟩
  rcases comp_mem_uniformity_sets (isOpen_uniformity.1 (hc₁ i) x h) with ⟨m', hm', mm'⟩
  exact mem_biUnion hm' ⟨i, _, hm', fun y hy => mm' hy rfl⟩
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
⊢ ∃ n, n ∈ 𝓤 α ∧ ∀ (x : α), x ∈ s → ∃ i, {y | (x, y) ∈ n} ⊆ c i

tactic: rcases hs.elim_finite_subcover_image hu₁ hu₂ with ⟨b, bu, b_fin, b_cover⟩
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
hu₂ : s ⊆ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n
⊢ ∃ n, n ∈ 𝓤 α ∧ ∀ (x : α), x ∈ s → ∃ i, {y | (x, y) ∈ n} ⊆ c i

tactic: refine' ⟨_, (biInter_mem b_fin).2 bu, fun x hx => _⟩
state_before: case intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
hu₂ : s ⊆ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n
b : Set (Set (α × α))
bu : b ⊆ (𝓤 α).sets
b_fin : Set.Finite b
b_cover : s ⊆ ⋃ (i : Set (α × α)) (_ : i ∈ b), u i
⊢ ∃ n, n ∈ 𝓤 α ∧ ∀ (x : α), x ∈ s → ∃ i, {y | (x, y) ∈ n} ⊆ c i

tactic: rcases mem_iUnion₂.1 (b_cover hx) with ⟨n, bn, i, m, hm, h⟩
state_before: case intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
hu₂ : s ⊆ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n
b : Set (Set (α × α))
bu : b ⊆ (𝓤 α).sets
b_fin : Set.Finite b
b_cover : s ⊆ ⋃ (i : Set (α × α)) (_ : i ∈ b), u i
x : α
hx : x ∈ s
⊢ ∃ i, {y | (x, y) ∈ ⋂ (i : Set (α × α)) (_ : i ∈ b), i} ⊆ c i

tactic: refine' ⟨i, fun y hy => h _⟩
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
hu₂ : s ⊆ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n
b : Set (Set (α × α))
bu : b ⊆ (𝓤 α).sets
b_fin : Set.Finite b
b_cover : s ⊆ ⋃ (i : Set (α × α)) (_ : i ∈ b), u i
x : α
hx : x ∈ s
n : Set (α × α)
bn : n ∈ b
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
h : {y | (x, y) ∈ m ○ n} ⊆ c i
⊢ ∃ i, {y | (x, y) ∈ ⋂ (i : Set (α × α)) (_ : i ∈ b), i} ⊆ c i

tactic: exact prod_mk_mem_compRel (refl_mem_uniformity hm) (biInter_subset_of_mem bn hy)
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
hu₂ : s ⊆ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n
b : Set (Set (α × α))
bu : b ⊆ (𝓤 α).sets
b_fin : Set.Finite b
b_cover : s ⊆ ⋃ (i : Set (α × α)) (_ : i ∈ b), u i
x : α
hx : x ∈ s
n : Set (α × α)
bn : n ∈ b
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
h : {y | (x, y) ∈ m ○ n} ⊆ c i
y : α
hy : y ∈ {y | (x, y) ∈ ⋂ (i : Set (α × α)) (_ : i ∈ b), i}
⊢ y ∈ {y | (x, y) ∈ m ○ n}

tactic: refine' fun n _ => isOpen_uniformity.2 _
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
⊢ ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)

tactic: rintro x ⟨i, m, hm, h⟩
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
⊢ ∀ (x : α), x ∈ u n → {p | p.fst = x → p.snd ∈ u n} ∈ 𝓤 α

tactic: rcases comp_mem_uniformity_sets hm with ⟨m', hm', mm'⟩
state_before: case intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
x : α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
h : {y | (x, y) ∈ m ○ n} ⊆ c i
⊢ {p | p.fst = x → p.snd ∈ u n} ∈ 𝓤 α

tactic: apply (𝓤 α).sets_of_superset hm'
state_before: case intro.intro.intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
x : α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
h : {y | (x, y) ∈ m ○ n} ⊆ c i
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
⊢ {p | p.fst = x → p.snd ∈ u n} ∈ 𝓤 α

tactic: rintro ⟨x, y⟩ hp rfl
state_before: case intro.intro.intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
x : α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
h : {y | (x, y) ∈ m ○ n} ⊆ c i
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
⊢ m' ⊆ {p | p.fst = x → p.snd ∈ u n}

tactic: refine' ⟨i, m', hm', fun z hz => h (monotone_id.compRel monotone_const mm' _)⟩
state_before: case intro.intro.intro.intro.intro.mk
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
x y : α
hp : (x, y) ∈ m'
h : {y_1 | ((x, y).fst, y_1) ∈ m ○ n} ⊆ c i
⊢ (x, y).snd ∈ u n

tactic: dsimp [-mem_compRel] at hz⊢
state_before: case intro.intro.intro.intro.intro.mk
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
x y : α
hp : (x, y) ∈ m'
h : {y_1 | ((x, y).fst, y_1) ∈ m ○ n} ⊆ c i
z : α
hz : z ∈ {y_1 | ((x, y).snd, y_1) ∈ m' ○ n}
⊢ ((x, y).fst, z) ∈ (fun x => id x ○ n) (m' ○ m')

tactic: rw [compRel_assoc]
state_before: case intro.intro.intro.intro.intro.mk
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
x y : α
hp : (x, y) ∈ m'
h : {y_1 | ((x, y).fst, y_1) ∈ m ○ n} ⊆ c i
z : α
hz : (y, z) ∈ m' ○ n
⊢ (x, z) ∈ m' ○ m' ○ n

tactic: exact ⟨y, hp, hz⟩
state_before: case intro.intro.intro.intro.intro.mk
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
n : Set (α × α)
x✝ : n ∈ 𝓤 α
i : ι
m : Set (α × α)
hm : m ∈ 𝓤 α
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ m
x y : α
hp : (x, y) ∈ m'
h : {y_1 | ((x, y).fst, y_1) ∈ m ○ n} ⊆ c i
z : α
hz : (y, z) ∈ m' ○ n
⊢ (x, z) ∈ m' ○ (m' ○ n)

tactic: rcases mem_iUnion.1 (hc₂ hx) with ⟨i, h⟩
state_before: α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
x : α
hx : x ∈ s
⊢ x ∈ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n

tactic: rcases comp_mem_uniformity_sets (isOpen_uniformity.1 (hc₁ i) x h) with ⟨m', hm', mm'⟩
state_before: case intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
x : α
hx : x ∈ s
i : ι
h : x ∈ c i
⊢ x ∈ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n

tactic: exact mem_biUnion hm' ⟨i, _, hm', fun y hy => mm' hy rfl⟩
state_before: case intro.intro.intro
α✝ : Type ua
β : Type ub
γ : Type uc
δ : Type ud
ι✝ : Sort ?u.181498
α : Type u
inst✝ : UniformSpace α
s : Set α
ι : Sort u_1
c : ι → Set α
hs : IsCompact s
hc₁ : ∀ (i : ι), IsOpen (c i)
hc₂ : s ⊆ ⋃ (i : ι), c i
u : Set (α × α) → Set α := fun n => {x | ∃ i m, m ∈ 𝓤 α ∧ {y | (x, y) ∈ m ○ n} ⊆ c i}
hu₁ : ∀ (n : Set (α × α)), n ∈ 𝓤 α → IsOpen (u n)
x : α
hx : x ∈ s
i : ι
h : x ∈ c i
m' : Set (α × α)
hm' : m' ∈ 𝓤 α
mm' : m' ○ m' ⊆ {p | p.fst = x → p.snd ∈ c i}
⊢ x ∈ ⋃ (n : Set (α × α)) (_ : n ∈ 𝓤 α), u n