Theorem: CategoryTheory.Functor.Final.zigzag_of_eqvGen_quot_rel
File: Mathlib/CategoryTheory/Limits/Final.lean

tactic: induction t
state_before: C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ : (X : C) × (d ⟶ F.obj X)
t : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) f₁ f₂
⊢ Zigzag (StructuredArrow.mk f₁.snd) (StructuredArrow.mk f₂.snd)

tactic: case rel x y r =>
  obtain ⟨f, w⟩ := r
  fconstructor
  swap; fconstructor
  left; fconstructor
  exact StructuredArrow.homMk f
state_before: case rel
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ : (X : C) × (d ⟶ F.obj X)
a✝ : Types.Quot.Rel (F ⋙ coyoneda.obj d.op) x✝ y✝
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)

case refl
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ : (X : C) × (d ⟶ F.obj X)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk x✝.snd)

case symm
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ : (X : C) × (d ⟶ F.obj X)
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a_ih✝ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
⊢ Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk x✝.snd)

case trans
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ z✝ : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y✝ z✝
a_ih✝¹ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
a_ih✝ : Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk z✝.snd)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk z✝.snd)

tactic: case refl => fconstructor
state_before: case refl
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ : (X : C) × (d ⟶ F.obj X)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk x✝.snd)

case symm
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ : (X : C) × (d ⟶ F.obj X)
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a_ih✝ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
⊢ Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk x✝.snd)

case trans
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ z✝ : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y✝ z✝
a_ih✝¹ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
a_ih✝ : Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk z✝.snd)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk z✝.snd)

tactic: case symm x y _ ih =>
  apply zigzag_symmetric
  exact ih
state_before: case symm
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ : (X : C) × (d ⟶ F.obj X)
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a_ih✝ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
⊢ Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk x✝.snd)

case trans
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ z✝ : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y✝ z✝
a_ih✝¹ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
a_ih✝ : Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk z✝.snd)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk z✝.snd)

tactic: case trans x y z _ _ ih₁ ih₂ =>
  apply Relation.ReflTransGen.trans
  exact ih₁; exact ih₂
state_before: case trans
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ y✝ z✝ : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x✝ y✝
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y✝ z✝
a_ih✝¹ : Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk y✝.snd)
a_ih✝ : Zigzag (StructuredArrow.mk y✝.snd) (StructuredArrow.mk z✝.snd)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk z✝.snd)

tactic: obtain ⟨f, w⟩ := r
state_before: C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
r : Types.Quot.Rel (F ⋙ coyoneda.obj d.op) x y
⊢ Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)

tactic: fconstructor
state_before: case intro
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)

tactic: swap
state_before: case intro.b
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ StructuredArrow d F

case intro.a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Relation.ReflTransGen Zag (StructuredArrow.mk x.snd) ?intro.b

case intro.a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Zag ?intro.b (StructuredArrow.mk y.snd)

tactic: fconstructor
state_before: case intro.a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Relation.ReflTransGen Zag (StructuredArrow.mk x.snd) ?intro.b

case intro.b
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ StructuredArrow d F

case intro.a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Zag ?intro.b (StructuredArrow.mk y.snd)

tactic: left
state_before: case intro.a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Zag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)

tactic: fconstructor
state_before: case intro.a.h
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ Nonempty (StructuredArrow.mk x.snd ⟶ StructuredArrow.mk y.snd)

tactic: exact StructuredArrow.homMk f
state_before: case intro.a.h.val
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
f : x.fst ⟶ y.fst
w : y.snd = (F ⋙ coyoneda.obj d.op).map f x.snd
⊢ StructuredArrow.mk x.snd ⟶ StructuredArrow.mk y.snd

tactic: fconstructor
state_before: C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x✝ : (X : C) × (d ⟶ F.obj X)
⊢ Zigzag (StructuredArrow.mk x✝.snd) (StructuredArrow.mk x✝.snd)

tactic: apply zigzag_symmetric
state_before: C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
ih : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
⊢ Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk x.snd)

tactic: exact ih
state_before: case a
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y : (X : C) × (d ⟶ F.obj X)
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
ih : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
⊢ Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)

tactic: apply Relation.ReflTransGen.trans
state_before: C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y z : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y z
ih₁ : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
ih₂ : Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)
⊢ Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk z.snd)

tactic: exact ih₁
state_before: case hab
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y z : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y z
ih₁ : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
ih₂ : Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)
⊢ Relation.ReflTransGen Zag (StructuredArrow.mk x.snd) ?b

case hbc
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y z : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y z
ih₁ : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
ih₂ : Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)
⊢ Relation.ReflTransGen Zag ?b (StructuredArrow.mk z.snd)

case b
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y z : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y z
ih₁ : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
ih₂ : Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)
⊢ StructuredArrow d F

tactic: exact ih₂
state_before: case hbc
C : Type v
inst✝² : Category C
D : Type v
inst✝¹ : Category D
F✝ : C ⥤ D
inst✝ : Final F✝
F : C ⥤ D
d : D
f₁ f₂ x y z : (X : C) × (d ⟶ F.obj X)
a✝¹ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) x y
a✝ : EqvGen (Types.Quot.Rel (F ⋙ coyoneda.obj d.op)) y z
ih₁ : Zigzag (StructuredArrow.mk x.snd) (StructuredArrow.mk y.snd)
ih₂ : Zigzag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)
⊢ Relation.ReflTransGen Zag (StructuredArrow.mk y.snd) (StructuredArrow.mk z.snd)