Theorem: ContinuousMonoidHom.closedEmbedding_toContinuousMap
File: Mathlib/Topology/Algebra/ContinuousMonoidHom.lean

tactic: suffices
  Set.range (toContinuousMap : ContinuousMonoidHom A B → C(A, B)) =
    ({ f | f '' {1} ⊆ {1}ᶜ } ∪
        ⋃ (x) (y) (U) (V) (W) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W),
          { f | f '' {x} ⊆ U } ∩ { f | f '' {y} ⊆ V } ∩ { f | f '' {x * y} ⊆ W } :
            Set C(A , B))ᶜ by
  rw [this, compl_compl]
  refine' (ContinuousMap.isOpen_gen isCompact_singleton isOpen_compl_singleton).union _
  repeat' apply isOpen_iUnion; intro
  repeat' apply IsOpen.inter
  all_goals apply ContinuousMap.isOpen_gen isCompact_singleton; assumption
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
⊢ IsOpen (Set.range toContinuousMapᶜ)

tactic: simp_rw [Set.compl_union, Set.compl_iUnion, Set.image_singleton, Set.singleton_subset_iff,
  Set.ext_iff, Set.mem_inter_iff, Set.mem_iInter, Set.mem_compl_iff]
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
⊢ Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ

tactic: refine' fun f => ⟨_, _⟩
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
⊢ ∀ (x : C(A, B)),
    x ∈ Set.range toContinuousMap ↔
      ¬x ∈ {f | ¬↑f 1 ∈ {1}} ∧
        ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
          IsOpen i_2 →
            IsOpen i_3 →
              IsOpen i_4 →
                Disjoint (i_2 * i_3) i_4 → ¬x ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: rw [this, compl_compl]
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
⊢ IsOpen (Set.range toContinuousMapᶜ)

tactic: refine' (ContinuousMap.isOpen_gen isCompact_singleton isOpen_compl_singleton).union _
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
⊢ IsOpen
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
      ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
        Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})

tactic: repeat' apply isOpen_iUnion; intro
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
⊢ IsOpen
    (⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
      Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})

tactic: repeat' apply IsOpen.inter
state_before: case h.h.h.h.h.h.h.h.h
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen ({f | ↑f '' {i✝⁸} ⊆ i✝⁶} ∩ {f | ↑f '' {i✝⁷} ⊆ i✝⁵} ∩ {f | ↑f '' {i✝⁸ * i✝⁷} ⊆ i✝⁴})

tactic: all_goals apply ContinuousMap.isOpen_gen isCompact_singleton; assumption
state_before: case h.h.h.h.h.h.h.h.h.h₁.h₁
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen {f | ↑f '' {i✝⁸} ⊆ i✝⁶}

case h.h.h.h.h.h.h.h.h.h₁.h₂
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen {f | ↑f '' {i✝⁷} ⊆ i✝⁵}

case h.h.h.h.h.h.h.h.h.h₂
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen {f | ↑f '' {i✝⁸ * i✝⁷} ⊆ i✝⁴}

tactic: apply isOpen_iUnion
state_before: case h.h.h.h.h.h.h.h.h
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen ({f | ↑f '' {i✝⁸} ⊆ i✝⁶} ∩ {f | ↑f '' {i✝⁷} ⊆ i✝⁵} ∩ {f | ↑f '' {i✝⁸ * i✝⁷} ⊆ i✝⁴})

tactic: intro
state_before: case h.h.h.h.h.h.h.h.h
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁷ i✝⁶ : A
i✝⁵ i✝⁴ i✝³ : Set B
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : IsOpen i✝³
⊢ Disjoint (i✝⁵ * i✝⁴) i✝³ → IsOpen ({f | ↑f '' {i✝⁷} ⊆ i✝⁵} ∩ {f | ↑f '' {i✝⁶} ⊆ i✝⁴} ∩ {f | ↑f '' {i✝⁷ * i✝⁶} ⊆ i✝³})

tactic: apply IsOpen.inter
state_before: case h.h.h.h.h.h.h.h.h.h₂
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen {f | ↑f '' {i✝⁸ * i✝⁷} ⊆ i✝⁴}

tactic: apply ContinuousMap.isOpen_gen isCompact_singleton
state_before: case h.h.h.h.h.h.h.h.h.h₂
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen {f | ↑f '' {i✝⁸ * i✝⁷} ⊆ i✝⁴}

tactic: assumption
state_before: case h.h.h.h.h.h.h.h.h.h₂
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
this :
  Set.range toContinuousMap =
    ({f | ↑f '' {1} ⊆ {1}ᶜ} ∪
        ⋃ (x : A) (y : A) (U : Set B) (V : Set B) (W : Set B) (_ : IsOpen U) (_ : IsOpen V) (_ : IsOpen W) (_ :
          Disjoint (U * V) W), {f | ↑f '' {x} ⊆ U} ∩ {f | ↑f '' {y} ⊆ V} ∩ {f | ↑f '' {x * y} ⊆ W})ᶜ
i✝⁸ i✝⁷ : A
i✝⁶ i✝⁵ i✝⁴ : Set B
i✝³ : IsOpen i✝⁶
i✝² : IsOpen i✝⁵
i✝¹ : IsOpen i✝⁴
i✝ : Disjoint (i✝⁶ * i✝⁵) i✝⁴
⊢ IsOpen i✝⁴

tactic: rintro ⟨f, rfl⟩
state_before: case refine'_1
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
⊢ f ∈ Set.range toContinuousMap →
    ¬f ∈ {f | ¬↑f 1 ∈ {1}} ∧
      ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
        IsOpen i_2 →
          IsOpen i_3 →
            IsOpen i_4 →
              Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: rintro ⟨hf1, hf2⟩
state_before: case refine'_2
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
⊢ (¬f ∈ {f | ¬↑f 1 ∈ {1}} ∧
      ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
        IsOpen i_2 →
          IsOpen i_3 →
            IsOpen i_4 →
              Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}) →
    f ∈ Set.range toContinuousMap

tactic: suffices ∀ x y, f (x * y) = f x * f y by
  refine'
    ⟨({ f with
          map_one' := of_not_not hf1
          map_mul' := this } :
        ContinuousMonoidHom A B),
      ContinuousMap.ext fun _ => rfl⟩
state_before: case refine'_2.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
hf2 :
  ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
    IsOpen i_2 →
      IsOpen i_3 →
        IsOpen i_4 → Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}
⊢ f ∈ Set.range toContinuousMap

tactic: intro x y
state_before: case refine'_2.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
hf2 :
  ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
    IsOpen i_2 →
      IsOpen i_3 →
        IsOpen i_4 → Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}
⊢ ∀ (x y : A), ↑f (x * y) = ↑f x * ↑f y

tactic: contrapose! hf2
state_before: case refine'_2.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
hf2 :
  ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
    IsOpen i_2 →
      IsOpen i_3 →
        IsOpen i_4 → Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}
x y : A
⊢ ↑f (x * y) = ↑f x * ↑f y

tactic: obtain ⟨UV, W, hUV, hW, hfUV, hfW, h⟩ := t2_separation hf2.symm
state_before: case refine'_2.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x y : A
hf2 : ↑f (x * y) ≠ ↑f x * ↑f y
⊢ ∃ i i_1 i_2 i_3 i_4,
    IsOpen i_2 ∧
      IsOpen i_3 ∧
        IsOpen i_4 ∧ Disjoint (i_2 * i_3) i_4 ∧ f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: have hB := @continuous_mul B _ _ _
state_before: case refine'_2.intro.intro.intro.intro.intro.intro.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x y : A
hf2 : ↑f (x * y) ≠ ↑f x * ↑f y
UV W : Set B
hUV : IsOpen UV
hW : IsOpen W
hfUV : ↑f x * ↑f y ∈ UV
hfW : ↑f (x * y) ∈ W
h : Disjoint UV W
⊢ ∃ i i_1 i_2 i_3 i_4,
    IsOpen i_2 ∧
      IsOpen i_3 ∧
        IsOpen i_4 ∧ Disjoint (i_2 * i_3) i_4 ∧ f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: obtain ⟨U, V, hU, hV, hfU, hfV, h'⟩ :=
  isOpen_prod_iff.mp (hUV.preimage hB) (f x) (f y) hfUV
state_before: case refine'_2.intro.intro.intro.intro.intro.intro.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x y : A
hf2 : ↑f (x * y) ≠ ↑f x * ↑f y
UV W : Set B
hUV : IsOpen UV
hW : IsOpen W
hfUV : ↑f x * ↑f y ∈ UV
hfW : ↑f (x * y) ∈ W
h : Disjoint UV W
hB : Continuous fun p => p.fst * p.snd
⊢ ∃ i i_1 i_2 i_3 i_4,
    IsOpen i_2 ∧
      IsOpen i_3 ∧
        IsOpen i_4 ∧ Disjoint (i_2 * i_3) i_4 ∧ f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: refine' ⟨x, y, U, V, W, hU, hV, hW, h.mono_left _, ⟨hfU, hfV⟩, hfW⟩
state_before: case refine'_2.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x y : A
hf2 : ↑f (x * y) ≠ ↑f x * ↑f y
UV W : Set B
hUV : IsOpen UV
hW : IsOpen W
hfUV : ↑f x * ↑f y ∈ UV
hfW : ↑f (x * y) ∈ W
h : Disjoint UV W
hB : Continuous fun p => p.fst * p.snd
U V : Set B
hU : IsOpen U
hV : IsOpen V
hfU : ↑f x ∈ U
hfV : ↑f y ∈ V
h' : U ×ˢ V ⊆ (fun p => p.fst * p.snd) ⁻¹' UV
⊢ ∃ i i_1 i_2 i_3 i_4,
    IsOpen i_2 ∧
      IsOpen i_3 ∧
        IsOpen i_4 ∧ Disjoint (i_2 * i_3) i_4 ∧ f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}

tactic: rintro _ ⟨x, y, hx : (x, y).1 ∈ U, hy : (x, y).2 ∈ V, rfl⟩
state_before: case refine'_2.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x y : A
hf2 : ↑f (x * y) ≠ ↑f x * ↑f y
UV W : Set B
hUV : IsOpen UV
hW : IsOpen W
hfUV : ↑f x * ↑f y ∈ UV
hfW : ↑f (x * y) ∈ W
h : Disjoint UV W
hB : Continuous fun p => p.fst * p.snd
U V : Set B
hU : IsOpen U
hV : IsOpen V
hfU : ↑f x ∈ U
hfV : ↑f y ∈ V
h' : U ×ˢ V ⊆ (fun p => p.fst * p.snd) ⁻¹' UV
⊢ U * V ≤ UV

tactic: exact h' ⟨hx, hy⟩
state_before: case refine'_2.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
x✝ y✝ : A
hf2 : ↑f (x✝ * y✝) ≠ ↑f x✝ * ↑f y✝
UV W : Set B
hUV : IsOpen UV
hW : IsOpen W
hfUV : ↑f x✝ * ↑f y✝ ∈ UV
hfW : ↑f (x✝ * y✝) ∈ W
h : Disjoint UV W
hB : Continuous fun p => p.fst * p.snd
U V : Set B
hU : IsOpen U
hV : IsOpen V
hfU : ↑f x✝ ∈ U
hfV : ↑f y✝ ∈ V
h' : U ×ˢ V ⊆ (fun p => p.fst * p.snd) ⁻¹' UV
x y : B
hx : (x, y).fst ∈ U
hy : (x, y).snd ∈ V
⊢ (fun x x_1 => x * x_1) x y ∈ UV

tactic: refine'
  ⟨({ f with
        map_one' := of_not_not hf1
        map_mul' := this } :
      ContinuousMonoidHom A B),
    ContinuousMap.ext fun _ => rfl⟩
state_before: F : Type ?u.142376
A : Type u_2
B : Type u_1
C : Type ?u.142385
D : Type ?u.142388
E : Type ?u.142391
inst✝¹² : Monoid A
inst✝¹¹ : Monoid B
inst✝¹⁰ : Monoid C
inst✝⁹ : Monoid D
inst✝⁸ : CommGroup E
inst✝⁷ : TopologicalSpace A
inst✝⁶ : TopologicalSpace B
inst✝⁵ : TopologicalSpace C
inst✝⁴ : TopologicalSpace D
inst✝³ : TopologicalSpace E
inst✝² : TopologicalGroup E
inst✝¹ : ContinuousMul B
inst✝ : T2Space B
f : C(A, B)
hf1 : ¬f ∈ {f | ¬↑f 1 ∈ {1}}
hf2 :
  ∀ (i i_1 : A) (i_2 i_3 i_4 : Set B),
    IsOpen i_2 →
      IsOpen i_3 →
        IsOpen i_4 → Disjoint (i_2 * i_3) i_4 → ¬f ∈ {f | ↑f i ∈ i_2} ∩ {f | ↑f i_1 ∈ i_3} ∩ {f | ↑f (i * i_1) ∈ i_4}
this : ∀ (x y : A), ↑f (x * y) = ↑f x * ↑f y
⊢ f ∈ Set.range toContinuousMap