-- Mathlib/Topology/Connected/Clopen.lean
/-- In a preconnected space, given a transitive relation `P`, if `P x y` and `P y x` are true
for `y` close enough to `x`, then `P x y` holds for all `x, y`. This is a version of the fact
that, if an equivalence relation has open classes, then it has a single equivalence class. -/
lemma PreconnectedSpace.induction₂' [PreconnectedSpace α] (P : α → α → Prop)
    (h : ∀ x, ∀ᶠ y in 𝓝 x, P x y ∧ P y x) (h' : Transitive P) (x y : α) :
    P x y

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
⊢ IsOpen u

Tactic:
apply isOpen_iff_mem_nhds.2 (fun z hz ↦ ?_)

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
z : α
hz : z ∈ u
⊢ u ∈ 𝓝 z

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
D : u = univ
⊢ y ∈ u

Tactic:
simp [D]

Result:
no goals

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
D : u = univ
⊢ P x y

Tactic:
show y ∈ u

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
D : u = univ
⊢ y ∈ u

Proof state:
case intro.intro
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
z : α
hz : ∀ U ∈ 𝓝 z, (U ∩ u).Nonempty
t : α
ht : t ∈ {x | (fun y => P z y ∧ P y z) x}
h't : t ∈ u
⊢ z ∈ u

Tactic:
exact h' h't ht.2

Result:
no goals

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
⊢ P x y

Tactic:
have A : IsClosed u := by
  apply isClosed_iff_nhds.2 (fun z hz ↦ ?_)
  rcases hz _ (h z) with ⟨t, ht, h't⟩
  exact h' h't ht.2

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
⊢ P x y

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
⊢ P x y

Tactic:
have D : u = Set.univ := IsClopen.eq_univ ⟨A, B⟩ C

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
D : u = univ
⊢ P x y

Proof state:
case h
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
z : α
hz : z ∈ u
t : α
ht : P z t ∧ P t z
⊢ t ∈ u

Tactic:
exact h' hz ht.1

Result:
no goals

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
⊢ IsClosed u

Tactic:
apply isClosed_iff_nhds.2 (fun z hz ↦ ?_)

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
z : α
hz : ∀ U ∈ 𝓝 z, (U ∩ u).Nonempty
⊢ z ∈ u

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
z : α
hz : z ∈ u
⊢ u ∈ 𝓝 z

Tactic:
filter_upwards [h z] with t ht

Result:
case h
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
z : α
hz : z ∈ u
t : α
ht : P z t ∧ P t z
⊢ t ∈ u

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
z : α
hz : ∀ U ∈ 𝓝 z, (U ∩ u).Nonempty
⊢ z ∈ u

Tactic:
rcases hz _ (h z) with ⟨t, ht, h't⟩

Result:
case intro.intro
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
z : α
hz : ∀ U ∈ 𝓝 z, (U ∩ u).Nonempty
t : α
ht : t ∈ {x | (fun y => P z y ∧ P y z) x}
h't : t ∈ u
⊢ z ∈ u

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
⊢ P x y

Tactic:
have B : IsOpen u := by
  apply isOpen_iff_mem_nhds.2 (fun z hz ↦ ?_)
  filter_upwards [h z] with t ht
  exact h' hz ht.1

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
⊢ P x y

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
⊢ P x y

Tactic:
have C : u.Nonempty := ⟨x, (mem_of_mem_nhds (h x)).1⟩

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
A : IsClosed u
B : IsOpen u
C : u.Nonempty
⊢ P x y

Proof state:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
⊢ P x y

Tactic:
let u := {z | P x z}

Result:
α : Type u
inst✝¹ : TopologicalSpace α
inst✝ : PreconnectedSpace α
P : α → α → Prop
h : ∀ (x : α), ∀ᶠ (y : α) in 𝓝 x, P x y ∧ P y x
h' : Transitive P
x y : α
u : Set α := {z | P x z}
⊢ P x y