Theorem: ModelWithCorners.boundary_prod
File: Mathlib/Geometry/Manifold/InteriorBoundary.lean

Proof steps:
state_before: 𝕜 : 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_4
inst✝⁷ : TopologicalSpace M
inst✝⁶ : ChartedSpace H M
E' : Type u_5
inst✝⁵ : NormedAddCommGroup E'
inst✝⁴ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝³ : TopologicalSpace H'
N : Type u_7
inst✝² : TopologicalSpace N
inst✝¹ : ChartedSpace H' N
J : ModelWithCorners 𝕜 E' H'
inst✝ : SmoothManifoldWithCorners J N
x : M
y : N
⊢ (I.prod J).boundary (M × N) = univ.prod (J.boundary N) ∪ (I.boundary M).prod univ
state_after: 𝕜 : 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_4
inst✝⁷ : TopologicalSpace M
inst✝⁶ : ChartedSpace H M
E' : Type u_5
inst✝⁵ : NormedAddCommGroup E'
inst✝⁴ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝³ : TopologicalSpace H'
N : Type u_7
inst✝² : TopologicalSpace N
inst✝¹ : ChartedSpace H' N
J : ModelWithCorners 𝕜 E' H'
inst✝ : SmoothManifoldWithCorners J N
x : M
y : N
h : (I.prod J).boundary (M × N) = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ :=
  Trans.trans
    (Trans.trans (Trans.trans rfl (boundary_eq_complement_interior (I.prod J)))
      (Eq.mpr (id (congrArg (fun _a => _aᶜ = (I.interior M ×ˢ J.interior N)ᶜ) (interior_prod J)))
        (Eq.refl (I.interior M ×ˢ J.interior N)ᶜ)))
    (Eq.mpr
      (id
        (congrArg (fun _a => _a = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)
          (compl_prod_eq_union (I.interior M) (J.interior N))))
      (Eq.refl ((I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)))
⊢ (I.prod J).boundary (M × N) = univ.prod (J.boundary N) ∪ (I.boundary M).prod univ
tactic: let h := calc (I.prod J).boundary (M × N)
    _ = ((I.prod J).interior (M × N))ᶜ := (I.prod J).boundary_eq_complement_interior
    _ = ((I.interior M) ×ˢ (J.interior N))ᶜ := by rw [ModelWithCorners.interior_prod]
    _ = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ := by rw [compl_prod_eq_union]
state_before: 𝕜 : 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_4
inst✝⁷ : TopologicalSpace M
inst✝⁶ : ChartedSpace H M
E' : Type u_5
inst✝⁵ : NormedAddCommGroup E'
inst✝⁴ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝³ : TopologicalSpace H'
N : Type u_7
inst✝² : TopologicalSpace N
inst✝¹ : ChartedSpace H' N
J : ModelWithCorners 𝕜 E' H'
inst✝ : SmoothManifoldWithCorners J N
x : M
y : N
h : (I.prod J).boundary (M × N) = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ :=
  Trans.trans
    (Trans.trans (Trans.trans rfl (boundary_eq_complement_interior (I.prod J)))
      (Eq.mpr (id (congrArg (fun _a => _aᶜ = (I.interior M ×ˢ J.interior N)ᶜ) (interior_prod J)))
        (Eq.refl (I.interior M ×ˢ J.interior N)ᶜ)))
    (Eq.mpr
      (id
        (congrArg (fun _a => _a = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)
          (compl_prod_eq_union (I.interior M) (J.interior N))))
      (Eq.refl ((I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)))
⊢ (I.prod J).boundary (M × N) = univ.prod (J.boundary N) ∪ (I.boundary M).prod univ
state_after: 𝕜 : 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_4
inst✝⁷ : TopologicalSpace M
inst✝⁶ : ChartedSpace H M
E' : Type u_5
inst✝⁵ : NormedAddCommGroup E'
inst✝⁴ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝³ : TopologicalSpace H'
N : Type u_7
inst✝² : TopologicalSpace N
inst✝¹ : ChartedSpace H' N
J : ModelWithCorners 𝕜 E' H'
inst✝ : SmoothManifoldWithCorners J N
x : M
y : N
h : (I.prod J).boundary (M × N) = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ :=
  Trans.trans
    (Trans.trans (Trans.trans rfl (boundary_eq_complement_interior (I.prod J)))
      (Eq.mpr (id (congrArg (fun _a => _aᶜ = (I.interior M ×ˢ J.interior N)ᶜ) (interior_prod J)))
        (Eq.refl (I.interior M ×ˢ J.interior N)ᶜ)))
    (Eq.mpr
      (id
        (congrArg (fun _a => _a = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)
          (compl_prod_eq_union (I.interior M) (J.interior N))))
      (Eq.refl ((I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)))
⊢ univ ×ˢ (J.interior N)ᶜ ∪ (I.interior M)ᶜ ×ˢ univ = univ.prod (J.interior N)ᶜ ∪ (I.interior M)ᶜ.prod univ
tactic: rw [h, I.boundary_eq_complement_interior, J.boundary_eq_complement_interior, union_comm]
state_before: 𝕜 : 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_4
inst✝⁷ : TopologicalSpace M
inst✝⁶ : ChartedSpace H M
E' : Type u_5
inst✝⁵ : NormedAddCommGroup E'
inst✝⁴ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝³ : TopologicalSpace H'
N : Type u_7
inst✝² : TopologicalSpace N
inst✝¹ : ChartedSpace H' N
J : ModelWithCorners 𝕜 E' H'
inst✝ : SmoothManifoldWithCorners J N
x : M
y : N
h : (I.prod J).boundary (M × N) = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ :=
  Trans.trans
    (Trans.trans (Trans.trans rfl (boundary_eq_complement_interior (I.prod J)))
      (Eq.mpr (id (congrArg (fun _a => _aᶜ = (I.interior M ×ˢ J.interior N)ᶜ) (interior_prod J)))
        (Eq.refl (I.interior M ×ˢ J.interior N)ᶜ)))
    (Eq.mpr
      (id
        (congrArg (fun _a => _a = (I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)
          (compl_prod_eq_union (I.interior M) (J.interior N))))
      (Eq.refl ((I.interior M)ᶜ ×ˢ univ ∪ univ ×ˢ (J.interior N)ᶜ)))
⊢ univ ×ˢ (J.interior N)ᶜ ∪ (I.interior M)ᶜ ×ˢ univ = univ.prod (J.interior N)ᶜ ∪ (I.interior M)ᶜ.prod univ
state_after: no goals
tactic: rfl