-- Mathlib/Topology/Separation/GDelta.lean
theorem Disjoint.hasSeparatingCover_closed_gdelta_right {s t : Set X} [NormalSpace X]
    (st_dis : Disjoint s t) (t_cl : IsClosed t) (t_gd : IsGδ t) : HasSeparatingCover s t

Proof state:
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
n : ?m.2365
⊢ ?m.2370 n

Tactic:
apply normal_exists_closure_subset t_cl (T_open (g n).1 (g n).2)

Result:
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
n : ℕ
⊢ t ⊆ ↑(g n)

Proof state:
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
n : ℕ
⊢ t ⊆ ↑(g n)

Tactic:
rw [T_int]

Result:
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
n : ℕ
⊢ ⋂₀ T ⊆ ↑(g n)

Proof state:
case h.right
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
n : ℕ
⊢ Disjoint (closure (closure (g' n))ᶜ) t

Tactic:
simp only [closure_compl, disjoint_compl_left_iff_subset]

Result:
case h.right
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
n : ℕ
⊢ t ⊆ interior (closure (g' n))

Proof state:
case intro
X : Type u_1
inst✝¹ : TopologicalSpace X
s t✝ : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t✝
t_cl : IsClosed t✝
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t✝ = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t✝ ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
t : Set X
tinT : t ∈ T
n : ℕ
gn : g n = ⟨t, tinT⟩
⊢ ↑(g n) ⊆ t

Tactic:
rw [gn]

Result:
no goals

Proof state:
case h.left
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
⊢ t ⊆ sᶜ

Tactic:
exact st_dis.subset_compl_left

Result:
no goals

Proof state:
case intro.intro.intro.inr.intro
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
⊢ HasSeparatingCover s t

Tactic:
use fun n ↦ (closure (g' n))ᶜ

Result:
case h
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
⊢ s ⊆ ⋃ n, (fun n => (closure (g' n))ᶜ) n ∧
    ∀ (n : ℕ), IsOpen ((fun n => (closure (g' n))ᶜ) n) ∧ Disjoint (closure ((fun n => (closure (g' n))ᶜ) n)) t

Proof state:
case intro.intro.intro
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
⊢ HasSeparatingCover s t

Tactic:
rcases T.eq_empty_or_nonempty with rfl | T_nonempty

Result:
case intro.intro.intro.inl
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T_open : ∀ t ∈ ∅, IsOpen t
T_count : ∅.Countable
T_int : t = ⋂₀ ∅
⊢ HasSeparatingCover s t

case intro.intro.intro.inr
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
⊢ HasSeparatingCover s t

Proof state:
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
n : ℕ
⊢ ⋂₀ T ⊆ ↑(g n)

Tactic:
exact sInter_subset_of_mem (g n).2

Result:
no goals

Proof state:
case intro.intro.intro.inr.intro
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
⊢ HasSeparatingCover s t

Tactic:
have clg'_int : t = ⋂ i, closure (g' i) := by
  apply (subset_iInter fun n ↦ (clt_sub_g' n).trans subset_closure).antisymm
  rw [T_int]
  refine subset_sInter fun t tinT ↦ ?_
  obtain ⟨n, gn⟩ := g_surj ⟨t, tinT⟩
  refine iInter_subset_of_subset n <| (clg'_sub_g n).trans ?_
  rw [gn]

Result:
case intro.intro.intro.inr.intro
X : Type u_1
inst✝¹ : TopologicalSpace X
s t : Set X
inst✝ : NormalSpace X
st_dis : Disjoint s t
t_cl : IsClosed t
T : Set (Set X)
T_open : ∀ t ∈ T, IsOpen t
T_count : T.Countable
T_int : t = ⋂₀ T
T_nonempty : T.Nonempty
g : ℕ → ↑T
g_surj : Surjective g
g' : ℕ → Set X
g'_open : ∀ (n : ℕ), IsOpen (g' n)
clt_sub_g' : ∀ (n : ℕ), t ⊆ g' n
clg'_sub_g : ∀ (n : ℕ), closure (g' n) ⊆ ↑(g n)
clg'_int : t = ⋂ i, closure (g' i)
⊢ HasSeparatingCover s t