Theorem: DiscreteQuotient.comp_finsetClopens
File: Mathlib/Topology/DiscreteQuotient.lean

tactic: ext d
state_before: α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
⊢ ((image fun t => t.carrier) ∘ Finset.toSet) ∘ finsetClopens X = fun x =>
    match x with
    | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes
state_after: case h.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ x✝ ∈ (((image fun t => t.carrier) ∘ Finset.toSet) ∘ finsetClopens X) d ↔
    x✝ ∈
      match d with
      | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes

tactic: simp only [Setoid.classes, Setoid.Rel, Set.mem_setOf_eq, Function.comp_apply,
  finsetClopens, Set.coe_toFinset, Set.mem_image, Set.mem_range,
  exists_exists_eq_and]
state_before: case h.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ x✝ ∈ (((image fun t => t.carrier) ∘ Finset.toSet) ∘ finsetClopens X) d ↔
    x✝ ∈
      match d with
      | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes
state_after: case h.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ a, d.proj ⁻¹' {a} = x✝) ↔ ∃ y, x✝ = {x | Setoid.r x y}

tactic: constructor
state_before: case h.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ a, d.proj ⁻¹' {a} = x✝) ↔ ∃ y, x✝ = {x | Setoid.r x y}
state_after: case h.h.mp
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ a, d.proj ⁻¹' {a} = x✝) → ∃ y, x✝ = {x | Setoid.r x y}

case h.h.mpr
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ y, x✝ = {x | Setoid.r x y}) → ∃ a, d.proj ⁻¹' {a} = x✝

tactic: refine fun ⟨y, h⟩ ↦ ⟨Quotient.out (s := d.toSetoid) y, ?_⟩
state_before: case h.h.mp
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ a, d.proj ⁻¹' {a} = x✝) → ∃ y, x✝ = {x | Setoid.r x y}
state_after: case h.h.mp
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝¹ : Set X
x✝ : ∃ a, d.proj ⁻¹' {a} = x✝¹
y : Quotient d.toSetoid
h : d.proj ⁻¹' {y} = x✝¹
⊢ x✝¹ = {x | Setoid.r x y.out}

tactic: ext
state_before: case h.h.mp
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝¹ : Set X
x✝ : ∃ a, d.proj ⁻¹' {a} = x✝¹
y : Quotient d.toSetoid
h : d.proj ⁻¹' {y} = x✝¹
⊢ x✝¹ = {x | Setoid.r x y.out}
state_after: case h.h.mp.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝² : Set X
x✝¹ : ∃ a, d.proj ⁻¹' {a} = x✝²
y : Quotient d.toSetoid
h : d.proj ⁻¹' {y} = x✝²
x✝ : X
⊢ x✝ ∈ x✝² ↔ x✝ ∈ {x | Setoid.r x y.out}

tactic: simpa [← h] using Quotient.mk_eq_iff_out (s := d.toSetoid)
state_before: case h.h.mp.h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝² : Set X
x✝¹ : ∃ a, d.proj ⁻¹' {a} = x✝²
y : Quotient d.toSetoid
h : d.proj ⁻¹' {y} = x✝²
x✝ : X
⊢ x✝ ∈ x✝² ↔ x✝ ∈ {x | Setoid.r x y.out}
state_after: no goals

tactic: exact fun ⟨y, h⟩ ↦ ⟨d.proj y, by ext; simp [h, proj]⟩
state_before: case h.h.mpr
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝ : Set X
⊢ (∃ y, x✝ = {x | Setoid.r x y}) → ∃ a, d.proj ⁻¹' {a} = x✝
state_after: no goals

tactic: ext
state_before: α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝¹ : Set X
x✝ : ∃ y, x✝¹ = {x | Setoid.r x y}
y : X
h : x✝¹ = {x | Setoid.r x y}
⊢ d.proj ⁻¹' {d.proj y} = x✝¹
state_after: case h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝² : Set X
x✝¹ : ∃ y, x✝² = {x | Setoid.r x y}
y : X
h : x✝² = {x | Setoid.r x y}
x✝ : X
⊢ x✝ ∈ d.proj ⁻¹' {d.proj y} ↔ x✝ ∈ x✝²

tactic: simp [h, proj]
state_before: case h
α : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
S : DiscreteQuotient X
inst✝ : CompactSpace X
d : DiscreteQuotient X
x✝² : Set X
x✝¹ : ∃ y, x✝² = {x | Setoid.r x y}
y : X
h : x✝² = {x | Setoid.r x y}
x✝ : X
⊢ x✝ ∈ d.proj ⁻¹' {d.proj y} ↔ x✝ ∈ x✝²
state_after: no goals