Theorem: FundamentalGroupoidFunctor.prodIso_inv
File: Mathlib/AlgebraicTopology/FundamentalGroupoid/Product.lean

Proof steps:
state_before: A B : TopCat
⊢ prodToProdTop A B ≫ (projLeft A B).prod' (projRight A B) = 𝟙 (CategoryTheory.Grpd.of (↑(π.obj A) × ↑(π.obj B)))
state_after: A B : TopCat
⊢ prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B) = 𝟭 (↑(π.obj A) × ↑(π.obj B))
tactic: change prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B) = 𝟭 _
state_before: A B : TopCat
⊢ prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B) = 𝟭 (↑(π.obj A) × ↑(π.obj B))
state_after: case h_obj
A B : TopCat
⊢ ∀ (X : ↑(π.obj A) × ↑(π.obj B)),
    (prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).obj X = (𝟭 (↑(π.obj A) × ↑(π.obj B))).obj X

case h_map
A B : TopCat
⊢ ∀ (X Y : ↑(π.obj A) × ↑(π.obj B)) (f : X ⟶ Y),
    HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map f) ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map f)
tactic: apply CategoryTheory.Functor.hext
state_before: case h_map
A B : TopCat
⊢ ∀ (X Y : ↑(π.obj A) × ↑(π.obj B)) (f : X ⟶ Y),
    HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map f) ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map f)
state_after: case h_map.mk.mk.mk
A B : TopCat
x₀ : ↑(π.obj A)
x₁ : ↑(π.obj B)
y₀ : ↑(π.obj A)
y₁ : ↑(π.obj B)
f₀ : (x₀, x₁).1 ⟶ (y₀, y₁).1
f₁ : (x₀, x₁).2 ⟶ (y₀, y₁).2
⊢ HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map (f₀, f₁))
    ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map (f₀, f₁))
tactic: rintro ⟨x₀, x₁⟩ ⟨y₀, y₁⟩ ⟨f₀, f₁⟩
state_before: case h_map.mk.mk.mk
A B : TopCat
x₀ : ↑(π.obj A)
x₁ : ↑(π.obj B)
y₀ : ↑(π.obj A)
y₁ : ↑(π.obj B)
f₀ : (x₀, x₁).1 ⟶ (y₀, y₁).1
f₁ : (x₀, x₁).2 ⟶ (y₀, y₁).2
⊢ HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map (f₀, f₁))
    ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map (f₀, f₁))
state_after: case h_map.mk.mk.mk
A B : TopCat
x₀ : ↑(π.obj A)
x₁ : ↑(π.obj B)
y₀ : ↑(π.obj A)
y₁ : ↑(π.obj B)
f₀ : (x₀, x₁).1 ⟶ (y₀, y₁).1
f₁ : (x₀, x₁).2 ⟶ (y₀, y₁).2
this :
  Path.Homotopic.projLeft ((prodToProdTop A B).map (f₀, f₁)) = f₀ ∧
    Path.Homotopic.projRight ((prodToProdTop A B).map (f₀, f₁)) = f₁
⊢ HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map (f₀, f₁))
    ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map (f₀, f₁))
tactic: have : Path.Homotopic.projLeft ((prodToProdTop A B).map (f₀, f₁)) = f₀ ∧
      Path.Homotopic.projRight ((prodToProdTop A B).map (f₀, f₁)) = f₁ :=
        And.intro (Path.Homotopic.projLeft_prod f₀ f₁) (Path.Homotopic.projRight_prod f₀ f₁)
state_before: case h_map.mk.mk.mk
A B : TopCat
x₀ : ↑(π.obj A)
x₁ : ↑(π.obj B)
y₀ : ↑(π.obj A)
y₁ : ↑(π.obj B)
f₀ : (x₀, x₁).1 ⟶ (y₀, y₁).1
f₁ : (x₀, x₁).2 ⟶ (y₀, y₁).2
this :
  Path.Homotopic.projLeft ((prodToProdTop A B).map (f₀, f₁)) = f₀ ∧
    Path.Homotopic.projRight ((prodToProdTop A B).map (f₀, f₁)) = f₁
⊢ HEq ((prodToProdTop A B ⋙ (projLeft A B).prod' (projRight A B)).map (f₀, f₁))
    ((𝟭 (↑(π.obj A) × ↑(π.obj B))).map (f₀, f₁))
state_after: no goals
tactic: simpa
state_before: A B : TopCat
⊢ (projLeft A B).prod' (projRight A B) ≫ prodToProdTop A B = 𝟙 (π.obj (TopCat.of (↑A × ↑B)))
state_after: A B : TopCat
⊢ (projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B = 𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))
tactic: change (projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B = 𝟭 _
state_before: A B : TopCat
⊢ (projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B = 𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))
state_after: case h_obj
A B : TopCat
⊢ ∀ (X : ↑(π.obj (TopCat.of (↑A × ↑B)))),
    ((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).obj X = (𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).obj X

case h_map
A B : TopCat
⊢ ∀ (X Y : ↑(π.obj (TopCat.of (↑A × ↑B)))) (f : X ⟶ Y),
    HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
tactic: apply CategoryTheory.Functor.hext
state_before: case h_map
A B : TopCat
⊢ ∀ (X Y : ↑(π.obj (TopCat.of (↑A × ↑B)))) (f : X ⟶ Y),
    HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
state_after: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
⊢ HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
tactic: rintro ⟨x₀, x₁⟩ ⟨y₀, y₁⟩ f
state_before: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
⊢ HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
state_after: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
this : Path.Homotopic.prod (Path.Homotopic.projLeft f) (Path.Homotopic.projRight f) = f
⊢ HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
tactic: have := Path.Homotopic.prod_projLeft_projRight f
state_before: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
this : Path.Homotopic.prod (Path.Homotopic.projLeft f) (Path.Homotopic.projRight f) = f
⊢ HEq (((projLeft A B).prod' (projRight A B) ⋙ prodToProdTop A B).map f) ((𝟭 ↑(π.obj (TopCat.of (↑A × ↑B)))).map f)
state_after: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
this : Path.Homotopic.prod (Path.Homotopic.projLeft f) (Path.Homotopic.projRight f) = f
⊢ (prodToProdTop A B).map (Path.Homotopic.projLeft f, Path.Homotopic.projRight f) = f
tactic: simp only [CategoryTheory.Functor.comp_obj, CategoryTheory.Functor.prod'_obj, prodToProdTop_obj,
      CategoryTheory.Functor.comp_map, CategoryTheory.Functor.prod'_map, projLeft_map,
      projRight_map, CategoryTheory.Functor.id_obj, CategoryTheory.Functor.id_map, heq_eq_eq]
state_before: case h_map.mk.mk.mk.mk
A B : TopCat
x₀ : ↑A
x₁ : ↑B
y₀ : ↑A
y₁ : ↑B
f : { as := (x₀, x₁) } ⟶ { as := (y₀, y₁) }
this : Path.Homotopic.prod (Path.Homotopic.projLeft f) (Path.Homotopic.projRight f) = f
⊢ (prodToProdTop A B).map (Path.Homotopic.projLeft f, Path.Homotopic.projRight f) = f
state_after: no goals
tactic: apply this