Theorem: TopCat.Sheaf.objSupIsoProdEqLocus_inv_eq_iff
File: Mathlib/Topology/Sheaves/SheafCondition/UniqueGluing.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
X : TopCat
F : Sheaf CommRingCat X
U V W UW VW : Opens ↑X
e : W ≤ U ⊔ V
x :
  ↥((RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.fst ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))).eqLocus
      (RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.snd ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))))
y : ↑(F.val.obj (op W))
h₁ : UW = U ⊓ W
h₂ : VW = V ⊓ W
⊢ (F.val.map (homOfLE e).op) ((F.objSupIsoProdEqLocus U V).inv x) = y ↔
    (F.val.map (homOfLE ⋯).op) (↑x).1 = (F.val.map (homOfLE ⋯).op) y ∧
      (F.val.map (homOfLE ⋯).op) (↑x).2 = (F.val.map (homOfLE ⋯).op) y
state_after: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
X : TopCat
F : Sheaf CommRingCat X
U V W : Opens ↑X
e : W ≤ U ⊔ V
x :
  ↥((RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.fst ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))).eqLocus
      (RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.snd ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))))
y : ↑(F.val.obj (op W))
⊢ (F.val.map (homOfLE e).op) ((F.objSupIsoProdEqLocus U V).inv x) = y ↔
    (F.val.map (homOfLE ⋯).op) (↑x).1 = (F.val.map (homOfLE ⋯).op) y ∧
      (F.val.map (homOfLE ⋯).op) (↑x).2 = (F.val.map (homOfLE ⋯).op) y
tactic: subst h₁ h₂
state_before: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
X : TopCat
F : Sheaf CommRingCat X
U V W : Opens ↑X
e : W ≤ U ⊔ V
x :
  ↥((RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.fst ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))).eqLocus
      (RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.snd ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))))
y : ↑(F.val.obj (op W))
⊢ (F.val.map (homOfLE e).op) ((F.objSupIsoProdEqLocus U V).inv x) = y ↔
    (F.val.map (homOfLE ⋯).op) (↑x).1 = (F.val.map (homOfLE ⋯).op) y ∧
      (F.val.map (homOfLE ⋯).op) (↑x).2 = (F.val.map (homOfLE ⋯).op) y
state_after: case mp
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
X : TopCat
F : Sheaf CommRingCat X
U V W : Opens ↑X
e : W ≤ U ⊔ V
x :
  ↥((RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.fst ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))).eqLocus
      (RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.snd ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))))
y : ↑(F.val.obj (op W))
⊢ (F.val.map (homOfLE e).op) ((F.objSupIsoProdEqLocus U V).inv x) = y →
    (F.val.map (homOfLE ⋯).op) (↑x).1 = (F.val.map (homOfLE ⋯).op) y ∧
      (F.val.map (homOfLE ⋯).op) (↑x).2 = (F.val.map (homOfLE ⋯).op) y

case mpr
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : ConcreteCategory C
X : TopCat
F : Sheaf CommRingCat X
U V W : Opens ↑X
e : W ≤ U ⊔ V
x :
  ↥((RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.fst ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))).eqLocus
      (RingHom.comp (F.val.map (homOfLE ⋯).op) (RingHom.snd ↑(F.val.obj (op U)) ↑(F.val.obj (op V)))))
y : ↑(F.val.obj (op W))
⊢ (F.val.map (homOfLE ⋯).op) (↑x).1 = (F.val.map (homOfLE ⋯).op) y ∧
      (F.val.map (homOfLE ⋯).op) (↑x).2 = (F.val.map (homOfLE ⋯).op) y →
    (F.val.map (homOfLE e).op) ((F.objSupIsoProdEqLocus U V).inv x) = y
tactic: constructor