Theorem: hasSeparatingCovers_iff_separatedNhds
File: Mathlib/Topology/Separation.lean

tactic: constructor
state_before: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
⊢ HasSeparatingCover s t ∧ HasSeparatingCover t s ↔ SeparatedNhds s t
state_after: case mp
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
⊢ HasSeparatingCover s t ∧ HasSeparatingCover t s → SeparatedNhds s t

case mpr
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
⊢ SeparatedNhds s t → HasSeparatingCover s t ∧ HasSeparatingCover t s

tactic: rintro ⟨⟨u, u_cov, u_props⟩, ⟨v, v_cov, v_props⟩⟩
state_before: case mp
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
⊢ HasSeparatingCover s t ∧ HasSeparatingCover t s → SeparatedNhds s t
state_after: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
⊢ SeparatedNhds s t

tactic: have open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ n, IsOpen (u₀ n)) →
  IsOpen (⋃ n, u₀ n \ closure (a n)) := fun _ _ u₀i_open ↦
    isOpen_iUnion fun i ↦ (u₀i_open i).sdiff isClosed_closure
state_before: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
⊢ SeparatedNhds s t
state_after: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
⊢ SeparatedNhds s t

tactic: have cover_lemma : ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    (h₀ ⊆ ⋃ n, u₀ n) → (∀ n, Disjoint (closure (v₀ n)) h₀) →
    (h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m ≤ n, v₀ m)) :=
    fun h₀ u₀ v₀ h₀_cov dis x xinh ↦ by
  rcases h₀_cov xinh with ⟨un , ⟨n, rfl⟩ , xinun⟩
  simp only [mem_iUnion]
  refine ⟨n, xinun, ?_⟩
  simp_all only [closure_iUnion₂_le_nat, disjoint_right, mem_setOf_eq, mem_iUnion,
    exists_false, exists_const, not_false_eq_true]
state_before: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
⊢ SeparatedNhds s t
state_after: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ SeparatedNhds s t

tactic: refine
  ⟨⋃ n : ℕ, u n \ (closure (⋃ m ≤ n, v m)),
   ⋃ n : ℕ, v n \ (closure (⋃ m ≤ n, u m)),
   open_lemma u (fun n ↦ ⋃ m ≤ n, v m) (fun n ↦ (u_props n).1),
   open_lemma v (fun n ↦ ⋃ m ≤ n, u m) (fun n ↦ (v_props n).1),
   cover_lemma s u v u_cov (fun n ↦ (v_props n).2),
   cover_lemma t v u v_cov (fun n ↦ (u_props n).2),
   ?_⟩
state_before: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ SeparatedNhds s t
state_after: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ Disjoint (⋃ n, u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) (⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m))

tactic: rw [Set.disjoint_left]
state_before: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ Disjoint (⋃ n, u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) (⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m))
state_after: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ ∀ ⦃a : X⦄, a ∈ ⋃ n, u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m) → a ∉ ⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m)

tactic: rintro x ⟨un, ⟨n, rfl⟩, xinun⟩
state_before: case mp.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
⊢ ∀ ⦃a : X⦄, a ∈ ⋃ n, u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m) → a ∉ ⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m)
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
⊢ x ∉ ⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m)

tactic: suffices ∀ (m : ℕ), x ∈ v m → x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m') by simpa
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
⊢ x ∉ ⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m)
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
⊢ ∀ (m : ℕ), x ∈ v m → x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')

tactic: intro m xinvm
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
⊢ ∀ (m : ℕ), x ∈ v m → x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
⊢ x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')

tactic: have n_le_m : n ≤ m := by
  by_contra m_gt_n
  exact xinun.2 (subset_closure (mem_biUnion (le_of_lt (not_le.mp m_gt_n)) xinvm))
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
⊢ x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
n_le_m : n ≤ m
⊢ x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')

tactic: exact subset_closure (mem_biUnion n_le_m xinun.1)
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
n_le_m : n ≤ m
⊢ x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')
state_after: no goals

tactic: rcases h₀_cov xinh with ⟨un , ⟨n, rfl⟩ , xinun⟩
state_before: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
⊢ x ∈ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
state_after: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ x ∈ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)

tactic: simp only [mem_iUnion]
state_before: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ x ∈ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
state_after: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ ∃ i, x ∈ u₀ i \ closure (⋃ m, ⋃ (_ : m ≤ i), v₀ m)

tactic: refine ⟨n, xinun, ?_⟩
state_before: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ ∃ i, x ∈ u₀ i \ closure (⋃ m, ⋃ (_ : m ≤ i), v₀ m)
state_after: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ x ∉ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)

tactic: simp_all only [closure_iUnion₂_le_nat, disjoint_right, mem_setOf_eq, mem_iUnion,
  exists_false, exists_const, not_false_eq_true]
state_before: case intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
h₀ : Set X
u₀ v₀ : ℕ → Set X
h₀_cov : h₀ ⊆ ⋃ n, u₀ n
dis : ∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀
x : X
xinh : x ∈ h₀
n : ℕ
xinun : x ∈ (fun n => u₀ n) n
⊢ x ∉ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
state_after: no goals

tactic: simpa
state_before: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
this : ∀ (m : ℕ), x ∈ v m → x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m')
⊢ x ∉ ⋃ n, v n \ closure (⋃ m, ⋃ (_ : m ≤ n), u m)
state_after: no goals

tactic: by_contra m_gt_n
state_before: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
⊢ n ≤ m
state_after: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
m_gt_n : ¬n ≤ m
⊢ False

tactic: exact xinun.2 (subset_closure (mem_biUnion (le_of_lt (not_le.mp m_gt_n)) xinvm))
state_before: X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
u : ℕ → Set X
u_cov : s ⊆ ⋃ n, u n
u_props : ∀ (n : ℕ), IsOpen (u n) ∧ Disjoint (closure (u n)) t
v : ℕ → Set X
v_cov : t ⊆ ⋃ n, v n
v_props : ∀ (n : ℕ), IsOpen (v n) ∧ Disjoint (closure (v n)) s
open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ (n : ℕ), IsOpen (u₀ n)) → IsOpen (⋃ n, u₀ n \ closure (a n))
cover_lemma :
  ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
    h₀ ⊆ ⋃ n, u₀ n → (∀ (n : ℕ), Disjoint (closure (v₀ n)) h₀) → h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m, ⋃ (_ : m ≤ n), v₀ m)
x : X
n : ℕ
xinun : x ∈ (fun n => u n \ closure (⋃ m, ⋃ (_ : m ≤ n), v m)) n
m : ℕ
xinvm : x ∈ v m
m_gt_n : ¬n ≤ m
⊢ False
state_after: no goals

tactic: rintro ⟨U, V, U_open, V_open, h_sub_U, k_sub_V, UV_dis⟩
state_before: case mpr
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t : Set X
⊢ SeparatedNhds s t → HasSeparatingCover s t ∧ HasSeparatingCover t s
state_after: case mpr.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t U V : Set X
U_open : IsOpen U
V_open : IsOpen V
h_sub_U : s ⊆ U
k_sub_V : t ⊆ V
UV_dis : Disjoint U V
⊢ HasSeparatingCover s t ∧ HasSeparatingCover t s

tactic: exact
  ⟨⟨fun _ ↦ U,
    h_sub_U.trans (iUnion_const U).symm.subset,
    fun _ ↦
      ⟨U_open, disjoint_of_subset (fun ⦃a⦄ a ↦ a) k_sub_V (UV_dis.closure_left V_open)⟩⟩,
   ⟨fun _ ↦ V,
    k_sub_V.trans (iUnion_const V).symm.subset,
    fun _ ↦
      ⟨V_open, disjoint_of_subset (fun ⦃a⦄ a ↦ a) h_sub_U (UV_dis.closure_right U_open).symm⟩⟩⟩
state_before: case mpr.intro.intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
inst✝ : TopologicalSpace X
s t U V : Set X
U_open : IsOpen U
V_open : IsOpen V
h_sub_U : s ⊆ U
k_sub_V : t ⊆ V
UV_dis : Disjoint U V
⊢ HasSeparatingCover s t ∧ HasSeparatingCover t s
state_after: no goals