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

Proof steps:
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
⊢ Injective (finsetClopens X)
state_after: α : 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
⊢ Injective (((image fun t => t.carrier) ∘ Finset.toSet) ∘ finsetClopens X)
tactic: apply Function.Injective.of_comp (f := Set.image (fun (t : Clopens X) ↦ t.carrier) ∘ Finset.toSet)
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
⊢ Injective (((image fun t => t.carrier) ∘ Finset.toSet) ∘ finsetClopens X)
state_after: α : 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
⊢ Injective fun x =>
    match x with
    | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes
tactic: rw [comp_finsetClopens]
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
⊢ Injective fun x =>
    match x with
    | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes
state_after: α : 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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
tactic: intro ⟨_, _⟩ ⟨_, _⟩ h
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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
state_after: case e_toSetoid
α : 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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ toSetoid✝¹ = toSetoid✝
tactic: congr
state_before: case e_toSetoid
α : 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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ toSetoid✝¹ = toSetoid✝
state_after: case e_toSetoid
α : 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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ toSetoid✝¹.classes = toSetoid✝.classes
tactic: rw [Setoid.classes_inj]
state_before: case e_toSetoid
α : 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
toSetoid✝¹ : Setoid X
isOpen_setOf_rel✝¹ : ∀ (x : X), IsOpen (setOf (toSetoid✝¹.Rel x))
toSetoid✝ : Setoid X
isOpen_setOf_rel✝ : ∀ (x : X), IsOpen (setOf (toSetoid✝.Rel x))
h :
  (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝¹, isOpen_setOf_rel := isOpen_setOf_rel✝¹ } =
    (fun x =>
        match x with
        | { toSetoid := f, isOpen_setOf_rel := isOpen_setOf_rel } => f.classes)
      { toSetoid := toSetoid✝, isOpen_setOf_rel := isOpen_setOf_rel✝ }
⊢ toSetoid✝¹.classes = toSetoid✝.classes
state_after: no goals
tactic: exact h