Theorem: LocalHomeomorph.subtypeRestr_symm_trans_subtypeRestr
File: Mathlib/Topology/LocalHomeomorph.lean

tactic: simp only [subtypeRestr_def, trans_symm_eq_symm_trans_symm]
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
⊢ LocalHomeomorph.trans (LocalHomeomorph.symm (subtypeRestr f s)) (subtypeRestr f' s) ≈
    LocalHomeomorph.restr (LocalHomeomorph.trans (LocalHomeomorph.symm f) f')
      (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)

tactic: have openness₁ : IsOpen (f.target ∩ f.symm ⁻¹' s) := f.preimage_open_of_open_symm s.2
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
      (LocalHomeomorph.trans (Opens.localHomeomorphSubtypeCoe s) f') ≈
    LocalHomeomorph.restr (LocalHomeomorph.trans (LocalHomeomorph.symm f) f')
      (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)

tactic: rw [← ofSet_trans _ openness₁, ← trans_assoc, ← trans_assoc]
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
      (LocalHomeomorph.trans (Opens.localHomeomorphSubtypeCoe s) f') ≈
    LocalHomeomorph.restr (LocalHomeomorph.trans (LocalHomeomorph.symm f) f')
      (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)

tactic: refine' EqOnSource.trans' _ (eqOnSource_refl _)
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans
        (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
        (Opens.localHomeomorphSubtypeCoe s))
      f' ≈
    LocalHomeomorph.trans
      (LocalHomeomorph.trans (ofSet (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) openness₁) (LocalHomeomorph.symm f))
      f'

tactic: have sets_identity : f.symm.source ∩ (f.target ∩ f.symm ⁻¹' s) = f.symm.source ∩ f.symm ⁻¹' s :=
  by mfld_set_tac
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
      (Opens.localHomeomorphSubtypeCoe s) ≈
    LocalHomeomorph.trans (ofSet (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) openness₁) (LocalHomeomorph.symm f)

tactic: have openness₂ : IsOpen (s : Set α) := s.2
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
sets_identity :
  (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
      (Opens.localHomeomorphSubtypeCoe s) ≈
    LocalHomeomorph.trans (ofSet (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) openness₁) (LocalHomeomorph.symm f)

tactic: rw [ofSet_trans', sets_identity, ← trans_of_set' _ openness₂, trans_assoc]
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
sets_identity :
  (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s
openness₂ : IsOpen ↑s
⊢ LocalHomeomorph.trans
      (LocalHomeomorph.trans (LocalHomeomorph.symm f) (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)))
      (Opens.localHomeomorphSubtypeCoe s) ≈
    LocalHomeomorph.trans (ofSet (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) openness₁) (LocalHomeomorph.symm f)

tactic: refine' EqOnSource.trans' (eqOnSource_refl _) _
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
sets_identity :
  (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s
openness₂ : IsOpen ↑s
⊢ LocalHomeomorph.trans (LocalHomeomorph.symm f)
      (LocalHomeomorph.trans (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s))
        (Opens.localHomeomorphSubtypeCoe s)) ≈
    LocalHomeomorph.trans (LocalHomeomorph.symm f) (ofSet (↑s) openness₂)

tactic: refine' Setoid.trans (trans_symm_self s.localHomeomorphSubtypeCoe) _
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
sets_identity :
  (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s
openness₂ : IsOpen ↑s
⊢ LocalHomeomorph.trans (LocalHomeomorph.symm (Opens.localHomeomorphSubtypeCoe s)) (Opens.localHomeomorphSubtypeCoe s) ≈
    ofSet (↑s) openness₂

tactic: simp only [mfld_simps, Setoid.refl]
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
sets_identity :
  (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s
openness₂ : IsOpen ↑s
⊢ ofSet (Opens.localHomeomorphSubtypeCoe s).toLocalEquiv.target
      (_ : IsOpen (Opens.localHomeomorphSubtypeCoe s).toLocalEquiv.target) ≈
    ofSet (↑s) openness₂

tactic: mfld_set_tac
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.116202
δ : Type ?u.116205
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : TopologicalSpace δ
e : LocalHomeomorph α β
s : Opens α
inst✝ : Nonempty { x // x ∈ s }
f f' : LocalHomeomorph α β
openness₁ : IsOpen (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s)
⊢ (LocalHomeomorph.symm f).toLocalEquiv.source ∩ (f.target ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s) =
    (LocalHomeomorph.symm f).toLocalEquiv.source ∩ ↑(LocalHomeomorph.symm f) ⁻¹' ↑s