Theorem: CategoryTheory.isIso_prod_iff
File: Mathlib/CategoryTheory/Products/Basic.lean

tactic: constructor
state_before: C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
⊢ IsIso f ↔ IsIso f.fst ∧ IsIso f.snd

tactic: rintro ⟨g, hfg, hgf⟩
state_before: case mp
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
⊢ IsIso f → IsIso f.fst ∧ IsIso f.snd

tactic: simp at hfg hgf
state_before: case mp.mk.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g : (Q, T) ⟶ (P, S)
hfg : f ≫ g = 𝟙 (P, S)
hgf : g ≫ f = 𝟙 (Q, T)
⊢ IsIso f.fst ∧ IsIso f.snd

tactic: rcases hfg with ⟨hfg₁, hfg₂⟩
state_before: case mp.mk.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g : (Q, T) ⟶ (P, S)
hfg : f.fst ≫ g.fst = 𝟙 P ∧ f.snd ≫ g.snd = 𝟙 S
hgf : g.fst ≫ f.fst = 𝟙 Q ∧ g.snd ≫ f.snd = 𝟙 T
⊢ IsIso f.fst ∧ IsIso f.snd

tactic: rcases hgf with ⟨hgf₁, hgf₂⟩
state_before: case mp.mk.intro.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g : (Q, T) ⟶ (P, S)
hgf : g.fst ≫ f.fst = 𝟙 Q ∧ g.snd ≫ f.snd = 𝟙 T
hfg₁ : f.fst ≫ g.fst = 𝟙 P
hfg₂ : f.snd ≫ g.snd = 𝟙 S
⊢ IsIso f.fst ∧ IsIso f.snd

tactic: exact ⟨⟨⟨g.1, hfg₁, hgf₁⟩⟩, ⟨⟨g.2, hfg₂, hgf₂⟩⟩⟩
state_before: case mp.mk.intro.intro.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g : (Q, T) ⟶ (P, S)
hfg₁ : f.fst ≫ g.fst = 𝟙 P
hfg₂ : f.snd ≫ g.snd = 𝟙 S
hgf₁ : g.fst ≫ f.fst = 𝟙 Q
hgf₂ : g.snd ≫ f.snd = 𝟙 T
⊢ IsIso f.fst ∧ IsIso f.snd

tactic: rintro ⟨⟨g₁, hfg₁, hgf₁⟩, ⟨g₂, hfg₂, hgf₂⟩⟩
state_before: case mpr
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
⊢ IsIso f.fst ∧ IsIso f.snd → IsIso f

tactic: dsimp at hfg₁ hgf₁ hfg₂ hgf₂
state_before: case mpr.intro.mk.intro.intro.mk.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g₁ : (Q, T).fst ⟶ (P, S).fst
hfg₁ : f.fst ≫ g₁ = 𝟙 (P, S).fst
hgf₁ : g₁ ≫ f.fst = 𝟙 (Q, T).fst
g₂ : (Q, T).snd ⟶ (P, S).snd
hfg₂ : f.snd ≫ g₂ = 𝟙 (P, S).snd
hgf₂ : g₂ ≫ f.snd = 𝟙 (Q, T).snd
⊢ IsIso f

tactic: refine' ⟨⟨(g₁, g₂), _, _⟩⟩
state_before: case mpr.intro.mk.intro.intro.mk.intro.intro
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g₁ : (Q, T).fst ⟶ (P, S).fst
hfg₁ : f.fst ≫ g₁ = 𝟙 P
hgf₁ : g₁ ≫ f.fst = 𝟙 Q
g₂ : (Q, T).snd ⟶ (P, S).snd
hfg₂ : f.snd ≫ g₂ = 𝟙 S
hgf₂ : g₂ ≫ f.snd = 𝟙 T
⊢ IsIso f

tactic: repeat { simp; constructor; assumption; assumption }
state_before: case mpr.intro.mk.intro.intro.mk.intro.intro.refine'_1
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g₁ : (Q, T).fst ⟶ (P, S).fst
hfg₁ : f.fst ≫ g₁ = 𝟙 P
hgf₁ : g₁ ≫ f.fst = 𝟙 Q
g₂ : (Q, T).snd ⟶ (P, S).snd
hfg₂ : f.snd ≫ g₂ = 𝟙 S
hgf₂ : g₂ ≫ f.snd = 𝟙 T
⊢ f ≫ (g₁, g₂) = 𝟙 (P, S)

case mpr.intro.mk.intro.intro.mk.intro.intro.refine'_2
C : Type u₁
inst✝¹ : Category C
D : Type u₂
inst✝ : Category D
P Q : C
S T : D
f : (P, S) ⟶ (Q, T)
g₁ : (Q, T).fst ⟶ (P, S).fst
hfg₁ : f.fst ≫ g₁ = 𝟙 P
hgf₁ : g₁ ≫ f.fst = 𝟙 Q
g₂ : (Q, T).snd ⟶ (P, S).snd
hfg₂ : f.snd ≫ g₂ = 𝟙 S
hgf₂ : g₂ ≫ f.snd = 𝟙 T
⊢ (g₁, g₂) ≫ f = 𝟙 (Q, T)