Theorem: contDiffGroupoid_prod
File: Mathlib/Geometry/Manifold/SmoothManifoldWithCorners.lean

tactic: cases' he with he he_symm
state_before: m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : e ∈ contDiffGroupoid ⊤ I
he' : e' ∈ contDiffGroupoid ⊤ I'
⊢ LocalHomeomorph.prod e e' ∈ contDiffGroupoid ⊤ (ModelWithCorners.prod I I')

tactic: cases' he' with he' he'_symm
state_before: case intro
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he' : e' ∈ contDiffGroupoid ⊤ I'
he :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑e) e.source
he_symm :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑(LocalHomeomorph.symm e)) e.target
⊢ LocalHomeomorph.prod e e' ∈ contDiffGroupoid ⊤ (ModelWithCorners.prod I I')

tactic: simp only at he he_symm he' he'_symm
state_before: case intro.intro
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑e) e.source
he_symm :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I),
      comp :=
        (_ :
          ∀ {f g : H → H} {u v : Set H},
            ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
              ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' v ∩ range ↑I) →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                            (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ : ContDiffOn 𝕜 ⊤ (↑I ∘ id ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' univ ∩ range ↑I)),
      locality :=
        (_ :
          ∀ {f : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I))
                                (↑(ModelWithCorners.symm I) ⁻¹' s ∩ range ↑I))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)),
      congr :=
        (_ :
          ∀ {f g : H → H} {u : Set H},
            IsOpen u →
              (∀ (x : H), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I ∘ f ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I) →
                  ContDiffOn 𝕜 ⊤ (↑I ∘ g ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' u ∩ range ↑I)) }
    (↑(LocalHomeomorph.symm e)) e.target
he' :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'),
      comp :=
        (_ :
          ∀ {f g : H' → H'} {u v : Set H'},
            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
              ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' v ∩ range ↑I') →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                            (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ :
          ContDiffOn 𝕜 ⊤ (↑I' ∘ id ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' univ ∩ range ↑I')),
      locality :=
        (_ :
          ∀ {f : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ (x : H'),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                                (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')),
      congr :=
        (_ :
          ∀ {f g : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ (x : H'), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
                  ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I'))
                    (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')) }
    (↑e') e'.source
he'_symm :
  Pregroupoid.property
    {
      property := fun f s =>
        ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'),
      comp :=
        (_ :
          ∀ {f g : H' → H'} {u v : Set H'},
            ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
              ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' v ∩ range ↑I') →
                IsOpen u →
                  IsOpen v →
                    IsOpen (u ∩ f ⁻¹' v) →
                      (fun f s =>
                          ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                            (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                        (g ∘ f) (u ∩ f ⁻¹' v)),
      id_mem :=
        (_ :
          ContDiffOn 𝕜 ⊤ (↑I' ∘ id ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' univ ∩ range ↑I')),
      locality :=
        (_ :
          ∀ {f : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ (x : H'),
                  x ∈ u →
                    ∃ v,
                      IsOpen v ∧
                        x ∈ v ∧
                          (fun f s =>
                              ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I'))
                                (↑(ModelWithCorners.symm I') ⁻¹' s ∩ range ↑I'))
                            f (u ∩ v)) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')),
      congr :=
        (_ :
          ∀ {f g : H' → H'} {u : Set H'},
            IsOpen u →
              (∀ (x : H'), x ∈ u → g x = f x) →
                ContDiffOn 𝕜 ⊤ (↑I' ∘ f ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I') →
                  ContDiffOn 𝕜 ⊤ (↑I' ∘ g ∘ ↑(ModelWithCorners.symm I'))
                    (↑(ModelWithCorners.symm I') ⁻¹' u ∩ range ↑I')) }
    (↑(LocalHomeomorph.symm e')) e'.target
⊢ LocalHomeomorph.prod e e' ∈ contDiffGroupoid ⊤ (ModelWithCorners.prod I I')

tactic: constructor <;> simp only [LocalEquiv.prod_source, LocalHomeomorph.prod_toLocalEquiv]
state_before: case intro.intro
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
⊢ LocalHomeomorph.prod e e' ∈ contDiffGroupoid ⊤ (ModelWithCorners.prod I I')

tactic: have h3 := ContDiffOn.prod_map he he'
state_before: case intro.intro.left
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.prod e e') ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' e.source ×ˢ e'.source ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: rw [← I.image_eq, ← I'.image_eq, Set.prod_image_image_eq] at h3
state_before: case intro.intro.left
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤ (Prod.map (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')))
    ((↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I) ×ˢ (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I'))
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.prod e e') ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' e.source ×ˢ e'.source ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: rw [← (I.prod I').image_eq]
state_before: case intro.intro.left
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤ (Prod.map (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')))
    ((fun p => (↑I p.fst, ↑I' p.snd)) '' e.source ×ˢ e'.source)
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.prod e e') ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' e.source ×ˢ e'.source ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: exact h3
state_before: case intro.intro.left
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤ (Prod.map (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')))
    ((fun p => (↑I p.fst, ↑I' p.snd)) '' e.source ×ˢ e'.source)
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.prod e e') ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.prod I I') '' e.source ×ˢ e'.source)

tactic: have h3 := ContDiffOn.prod_map he_symm he'_symm
state_before: case intro.intro.right
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.symm (LocalHomeomorph.prod e e')) ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' (LocalEquiv.prod e.toLocalEquiv e'.toLocalEquiv).target ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: rw [← I.image_eq, ← I'.image_eq, Set.prod_image_image_eq] at h3
state_before: case intro.intro.right
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤
    (Prod.map (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
      (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I')))
    ((↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I) ×ˢ (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I'))
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.symm (LocalHomeomorph.prod e e')) ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' (LocalEquiv.prod e.toLocalEquiv e'.toLocalEquiv).target ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: rw [← (I.prod I').image_eq]
state_before: case intro.intro.right
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤
    (Prod.map (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
      (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I')))
    ((fun p => (↑I p.fst, ↑I' p.snd)) '' e.target ×ˢ e'.target)
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.symm (LocalHomeomorph.prod e e')) ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.symm (ModelWithCorners.prod I I')) ⁻¹' (LocalEquiv.prod e.toLocalEquiv e'.toLocalEquiv).target ∩
      range ↑(ModelWithCorners.prod I I'))

tactic: exact h3
state_before: case intro.intro.right
m n : ℕ∞
𝕜 : Type u_1
inst✝⁷ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace 𝕜 E
H : Type u_3
inst✝⁴ : TopologicalSpace H
I✝ : ModelWithCorners 𝕜 E H
M : Type ?u.106905
inst✝³ : TopologicalSpace M
E' : Type u_4
H' : Type u_5
inst✝² : NormedAddCommGroup E'
inst✝¹ : NormedSpace 𝕜 E'
inst✝ : TopologicalSpace H'
I : ModelWithCorners 𝕜 E H
I' : ModelWithCorners 𝕜 E' H'
e : LocalHomeomorph H H
e' : LocalHomeomorph H' H'
he : ContDiffOn 𝕜 ⊤ (↑I ∘ ↑e ∘ ↑(ModelWithCorners.symm I)) (↑(ModelWithCorners.symm I) ⁻¹' e.source ∩ range ↑I)
he_symm :
  ContDiffOn 𝕜 ⊤ (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
    (↑(ModelWithCorners.symm I) ⁻¹' e.target ∩ range ↑I)
he' : ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑e' ∘ ↑(ModelWithCorners.symm I')) (↑(ModelWithCorners.symm I') ⁻¹' e'.source ∩ range ↑I')
he'_symm :
  ContDiffOn 𝕜 ⊤ (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I'))
    (↑(ModelWithCorners.symm I') ⁻¹' e'.target ∩ range ↑I')
h3 :
  ContDiffOn 𝕜 ⊤
    (Prod.map (↑I ∘ ↑(LocalHomeomorph.symm e) ∘ ↑(ModelWithCorners.symm I))
      (↑I' ∘ ↑(LocalHomeomorph.symm e') ∘ ↑(ModelWithCorners.symm I')))
    ((fun p => (↑I p.fst, ↑I' p.snd)) '' e.target ×ˢ e'.target)
⊢ ContDiffOn 𝕜 ⊤
    (↑(ModelWithCorners.prod I I') ∘
      ↑(LocalHomeomorph.symm (LocalHomeomorph.prod e e')) ∘ ↑(ModelWithCorners.symm (ModelWithCorners.prod I I')))
    (↑(ModelWithCorners.prod I I') '' (LocalEquiv.prod e.toLocalEquiv e'.toLocalEquiv).target)