/-- The multicospan associated to a cover `S : J.Cover X` and a presheaf of the form `P ⋙ F`
is isomorphic to the composition of the multicospan associated to `S` and `P`,
composed with `F`. -/
def multicospanComp : (S.index (P ⋙ F)).multicospan ≅ (S.index P).multicospan ⋙ F :=
  NatIso.ofComponents
    (fun t =>
      match t with
      | WalkingMulticospan.left a => eqToIso rfl
      | WalkingMulticospan.right b => eqToIso rfl)
    (by
      rintro (a | b) (a | b) (f | f | f)
      

Proof state:
case left.left.id
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
A : Type u₂
inst✝⁴ : Category.{v₂, u₂} A
B : Type u₃
inst✝³ : Category.{v₃, u₃} B
J : GrothendieckTopology C
U : C
R : Presieve U
F G H : A ⥤ B
η : F ⟶ G
γ : G ⟶ H
inst✝² : HasSheafCompose J F
inst✝¹ : HasSheafCompose J G
inst✝ : HasSheafCompose J H
P : Cᵒᵖ ⥤ A
X : C
S : Cover J X
a : (index S (P ⋙ F)).L
⊢ (MulticospanIndex.multicospan (index S (P ⋙ F))).map (WalkingMulticospan.Hom.id (WalkingMulticospan.left a)) ≫
      ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.left a)).hom =
    ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.left a)).hom ≫
      (MulticospanIndex.multicospan (index S P) ⋙ F).map (WalkingMulticospan.Hom.id (WalkingMulticospan.left a))
case left.right.fst
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
A : Type u₂
inst✝⁴ : Category.{v₂, u₂} A
B : Type u₃
inst✝³ : Category.{v₃, u₃} B
J : GrothendieckTopology C
U : C
R : Presieve U
F G H : A ⥤ B
η : F ⟶ G
γ : G ⟶ H
inst✝² : HasSheafCompose J F
inst✝¹ : HasSheafCompose J G
inst✝ : HasSheafCompose J H
P : Cᵒᵖ ⥤ A
X : C
S : Cover J X
b : (index S (P ⋙ F)).R
⊢ (MulticospanIndex.multicospan (index S (P ⋙ F))).map (WalkingMulticospan.Hom.fst b) ≫
      ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.right b)).hom =
    ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.left (MulticospanIndex.fstTo (index S (P ⋙ F)) b))).hom ≫
      (MulticospanIndex.multicospan (index S P) ⋙ F).map (WalkingMulticospan.Hom.fst b)
case left.right.snd
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
A : Type u₂
inst✝⁴ : Category.{v₂, u₂} A
B : Type u₃
inst✝³ : Category.{v₃, u₃} B
J : GrothendieckTopology C
U : C
R : Presieve U
F G H : A ⥤ B
η : F ⟶ G
γ : G ⟶ H
inst✝² : HasSheafCompose J F
inst✝¹ : HasSheafCompose J G
inst✝ : HasSheafCompose J H
P : Cᵒᵖ ⥤ A
X : C
S : Cover J X
b : (index S (P ⋙ F)).R
⊢ (MulticospanIndex.multicospan (index S (P ⋙ F))).map (WalkingMulticospan.Hom.snd b) ≫
      ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.right b)).hom =
    ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.left (MulticospanIndex.sndTo (index S (P ⋙ F)) b))).hom ≫
      (MulticospanIndex.multicospan (index S P) ⋙ F).map (WalkingMulticospan.Hom.snd b)
case right.right.id
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
A : Type u₂
inst✝⁴ : Category.{v₂, u₂} A
B : Type u₃
inst✝³ : Category.{v₃, u₃} B
J : GrothendieckTopology C
U : C
R : Presieve U
F G H : A ⥤ B
η : F ⟶ G
γ : G ⟶ H
inst✝² : HasSheafCompose J F
inst✝¹ : HasSheafCompose J G
inst✝ : HasSheafCompose J H
P : Cᵒᵖ ⥤ A
X : C
S : Cover J X
b : (index S (P ⋙ F)).R
⊢ (MulticospanIndex.multicospan (index S (P ⋙ F))).map (WalkingMulticospan.Hom.id (WalkingMulticospan.right b)) ≫
      ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.right b)).hom =
    ((fun t =>
            match t with
            | WalkingMulticospan.left a =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.left a))
            | WalkingMulticospan.right b =>
              eqToIso
                (_ :
                  (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b) =
                    (MulticospanIndex.multicospan (index S (P ⋙ F))).obj (WalkingMulticospan.right b)))
          (WalkingMulticospan.right b)).hom ≫
      (MulticospanIndex.multicospan (index S P) ⋙ F).map (WalkingMulticospan.Hom.id (WalkingMulticospan.right b))

Next tactic:
all_goals aesop_cat