Theory PseudonaturalTransformation

(*  Title:       PseudonaturalTransformation
    Author:      Eugene W. Stark <stark@cs.stonybrook.edu>, 2020
    Maintainer:  Eugene W. Stark <stark@cs.stonybrook.edu>
*)

section "Pseudonatural Transformations"

theory PseudonaturalTransformation
imports InternalEquivalence InternalAdjunction Pseudofunctor
begin

  subsection "Definition of Pseudonatural Transformation"

  text ‹
    Pseudonatural transformations are a generalization of natural transformations that is
    appropriate for pseudofunctors.  The ``components'' of a pseudonatural transformation τ›
    from a pseudofunctor F› to a pseudofunctor G› (both from bicategory C› to D›),
    are 1-cells «τ0 a : F0 a →D G0 a»› associated with the objects of C›.  Instead of
    ``naturality squares'' that commute on-the-nose, a pseudonatural transformation associates
    an invertible 2-cell «τ1 f : G f ⋆D τ0 a ⇒D τ0 a' ⋆D F f»› with each 1-cell «f : a →C a'»›
    of C›.  The 1-cells τ0 a› and 2-cells τ1 f› are subject to coherence conditions which
    express that they transform naturally across 2-cells of C› and behave sensibly with
    respect to objects and horizontal composition.

    In formalizing ordinary natural transformations, we found it convenient to treat them
    similarly to functors in that a natural transformation τ : C → D› maps arrows of C›
    to arrows of D›; the components τ a› at objects a› being merely special cases.
    However, it is not possible to take the same approach for pseudofunctors, because it is
    not possible to treat the components τ0 a› at objects a› as a special case of the
    components τ1 f› at 1-cells f›.  So we have to regard a pseudonatural transformation τ›
    as consisting of two separate mappings: a mapping τ0 from objects of C› to 1-cells
    of D› and a mapping τ1 from 1-cells of C› to invertible 2-cells of D›.

    Pseudonatural transformations are themselves a special case of the more general notion
    of ``lax natural transformations'' between pseudofunctors.  For a lax natural transformation
    τ›, the 2-cells τ1 f› are not required to be invertible.  This means that there is a
    distinction between a lax natural transformation with «τ1 f : G f ⋆D τ0 a ⇒D τ0 a' ⋆D F f»›
    and an ``op-lax'' natural transformation with «τ1 f : τ0 a' ⋆D F f ⇒D G f ⋆D τ0 a»›.
    There is some variation in the literature on which direction is considered ``lax'' and
    which is ``op-lax'' and this variation extends as well to the special case of pseudofunctors,
    though in that case it does not result in any essential difference in the notion,
    due to the assumed invertibility.  We have chosen the direction that agrees with
    Leinster cite"leinster-basic-bicategories", and with the ``nLab'' article
    cite"nlab-lax-natural-transformation" on lax natural transformations, but note that the
    ``nLab'' article cite"nlab-pseudonatural-transformation" on pseudonatural transformations
    seems to make the opposite choice.
  ›

  locale pseudonatural_transformation =
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    F: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF +
    G: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG
  for VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'c  'd"
  and ΦF :: "'c * 'c  'd"
  and G :: "'c  'd"
  and ΦG :: "'c * 'c  'd"
  and τ0 :: "'c  'd"
  and τ1 :: "'c  'd" +
  assumes map0_in_hhom: "C.obj a  «τ0 a : srcD (F a) D srcD (G a)»"
  and map1_in_vhom: "C.ide f  «τ1 f : G f D τ0 (srcC f) D τ0 (trgC f) D F f»"
  and ide_map0_obj: "C.obj a  D.ide (τ0 a)"
  and iso_map1_ide: "C.ide f  D.iso (τ1 f)"
  and naturality: "C.arr μ 
                     τ1 (C.cod μ) D (G μ D τ0 (srcC μ)) = (τ0 (trgC μ) D F μ) D τ1 (C.dom μ)"
  and respects_unit: "C.obj a 
                        (τ0 a D F.unit a) D 𝗋D-1[τ0 a] D 𝗅D[τ0 a] = τ1 a D (G.unit a D τ0 a)"
  and respects_hcomp:
        " C.ide f; C.ide g; srcC g = trgC f  
             (τ0 (trgC g) D ΦF (g, f)) D 𝖺D[τ0 (trgC g), F g, F f] D (τ1 g D F f) D
             D.inv 𝖺D[G g, τ0 (srcC g), F f] D (G g D τ1 f) D 𝖺D[G g, G f, τ0 (srcC f)]
               = τ1 (g C f) D (ΦG (g, f) D τ0 (srcC f))"
  begin

    lemma map0_in_hom [intro]:
    assumes "C.obj a"
    shows "«τ0 a : F.map0 a D G.map0 a»"
    and "«τ0 a : τ0 a D τ0 a»"
      using assms map0_in_hhom [of a]
       apply fastforce
      using assms ide_map0_obj [of a] by fast

    lemma map0_simps [simp]:
    assumes "C.obj a"
    shows "D.ide (τ0 a)"
    and "srcD (τ0 a) = F.map0 a" and "trgD (τ0 a) = G.map0 a"
      using assms map0_in_hom iso_map1_ide ide_map0_obj by auto

    lemma map1_in_hom [intro]:
    assumes "C.ide f"
    shows "«τ1 f : F.map0 (srcC f) D G.map0 (trgC f)»"
    and "«τ1 f : G f D τ0 (srcC f) D τ0 (trgC f) D F f»"
      using assms map1_in_vhom [of f] D.vconn_implies_hpar(1-2) by auto

    lemma map1_simps [simp]:
    assumes "C.ide f"
    shows "D.arr (τ1 f)"
    and "srcD (τ1 f) = F.map0 (srcC f)"
    and "trgD (τ1 f) = G.map0 (trgC f)"
    and "D.dom (τ1 f) = G f D τ0 (srcC f)"
    and "D.cod (τ1 f) = τ0 (trgC f) D F f"
      using assms map1_in_hom iso_map1_ide by auto

    lemma inv_naturality:
    assumes "C.arr μ"
    shows "(G μ D τ0 (srcC μ)) D D.inv (τ1 (C.dom μ)) =
           D.inv (τ1 (C.cod μ)) D (τ0 (trgC μ) D F μ)"
      using assms naturality iso_map1_ide D.invert_opposite_sides_of_square by simp

  end

  subsection "Identity Pseudonatural Transformation"

  locale identity_pseudonatural_transformation =
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    F: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF
  for VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'c  'd"
  and ΦF :: "'c * 'c  'd"
  begin

    abbreviation (input) map0
    where "map0 a  F.map0 a"

    abbreviation (input) map1
    where "map1 f  𝗅D-1[F f] D 𝗋D[F f]"

    sublocale pseudonatural_transformation
                VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF F ΦF map0 map1
    proof
      show 1: "a. C.obj a  D.ide (F.map0 a)"
        using F.map0_simps(1) by blast
      show "f. C.ide f  D.iso (map1 f)"
        by auto
      show "a. C.obj a  «F.map0 a : srcD (F a) D srcD (F a)»"
        by (metis C.obj_def' D.in_hhomI D.src.preserves_arr F.map0_def F.map0_simps(2)
            F.map0_simps(3) F.preserves_reflects_arr)
      show "f. C.ide f  «map1 f : F f D F.map0 (srcC f) D F.map0 (trgC f) D F f»"
        by simp
      show "μ. C.arr μ 
                  (map1 (C.cod μ)) D (F μ D F.map0 (srcC μ))
                    = (F.map0 (trgC μ) D F μ) D map1 (C.dom μ)"
        by (metis D.comp_assoc D.lunit'_naturality D.runit_naturality F.preserves_arr
            F.preserves_cod F.preserves_dom F.preserves_src F.preserves_trg)
      show "f g. C.ide f; C.ide g; srcC g = trgC f 
                    (F.map0 (trgC g) D ΦF (g, f)) D
                    𝖺D[F.map0 (trgC g), F g, F f] D
                    (𝗅D-1[F g] D 𝗋D[F g] D F f) D
                    D.inv 𝖺D[F g, F.map0 (srcC g), F f] D
                    (F g D 𝗅D-1[F f] D 𝗋D[F f]) D
                    𝖺D[F g, F f, F.map0 (srcC f)]
                      = (𝗅D-1[F (g C f)] D 𝗋D[F (g C f)]) D (ΦF (g, f) D F.map0 (srcC f))"
      proof -
        fix f g
        assume f: "C.ide f" and g: "C.ide g" and fg: "srcC g = trgC f"
        have "(F.map0 (trgC g) D ΦF (g, f)) D
              𝖺D[F.map0 (trgC g), F g, F f] D
              (𝗅D-1[F g] D 𝗋D[F g] D F f) D
              D.inv 𝖺D[F g, F.map0 (srcC g), F f] D
              (F g D 𝗅D-1[F f] D 𝗋D[F f]) D
              𝖺D[F g, F f, F.map0 (srcC f)]
                = (F.map0 (trgC g) D ΦF (g, f)) D
                  (𝖺D[F.map0 (trgC g), F g, F f] D
                  (𝗅D-1[F g] D F f)) D
                  (𝗋D[F g] D F f) D
                  (D.inv 𝖺D[F g, F.map0 (srcC g), F f] D
                  (F g D 𝗅D-1[F f])) D
                  (F g D 𝗋D[F f]) D
                  𝖺D[F g, F f, F.map0 (srcC f)]"
          using f g fg D.whisker_right [of "F f"] D.whisker_left [of "F g"] D.comp_assoc
          by simp
        also have "... = (F.map0 (trgC g) D ΦF (g, f)) D
                         𝗅D-1[F g D F f] D
                         ((𝗋D[F g] D F f) D
                         (𝗋D-1[F g] D F f)) D
                         𝗋D[F g D F f]"
        proof -
          have "D.inv 𝖺D[F g, F.map0 (srcC g), F f] D (F g D 𝗅D-1[F f]) = 𝗋D-1[F g] D F f"
          proof -
            have "D.inv 𝖺D[F g, F.map0 (srcC g), F f] D (F g D 𝗅D-1[F f]) =
                  D.inv ((F g D 𝗅D[F f]) D 𝖺D[F g, F.map0 (srcC g), F f])"
              using f g fg 1 D.inv_comp by auto
            also have "... = D.inv (𝗋D[F g] D F f)"
              using f g fg D.triangle [of "F f" "F g"] by simp
            also have "... = 𝗋D-1[F g] D F f"
              using f g fg by simp
            finally show ?thesis by blast
          qed
          moreover have "(F g D 𝗋D[F f]) D 𝖺D[F g, F f, F.map0 (srcC f)] = 𝗋D[F g D F f]"
            using f g fg D.runit_hcomp(1) by simp
          moreover have "𝖺D[F.map0 (trgC g), F g, F f] D (𝗅D-1[F g] D F f)
                           = 𝗅D-1[F g D F f]"
            using f g fg D.lunit_hcomp(4) by simp
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((F.map0 (trgC g) D ΦF (g, f)) D 𝗅D-1[F g D F f]) D 𝗋D[F g D F f]"
        proof -
          have "((𝗋D[F g] D F f) D (𝗋D-1[F g] D F f)) D 𝗋D[F g D F f] = 𝗋D[F g D F f]"
          proof -
            have "((𝗋D[F g] D F f) D (𝗋D-1[F g] D F f)) D 𝗋D[F g D F f] =
                   (𝗋D[F g] D 𝗋D-1[F g] D F f) D 𝗋D[F g D F f]"
              using f g fg D.whisker_right by simp
            also have "... = (F g D F f) D 𝗋D[F g D F f]"
              using f g fg D.comp_arr_inv' by simp
            also have "... = 𝗋D[F g D F f]"
              using f g fg D.comp_cod_arr by simp
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝗅D-1[F (g C f)] D ΦF (g, f) D 𝗋D[F g D F f]"
          using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC F.FF_def
                D.lunit'_naturality [of "ΦF (g, f)"] D.comp_assoc
          by simp
        also have "... = (𝗅D-1[F (g C f)] D 𝗋D[F (g C f)]) D (ΦF (g, f) D F.map0 (srcC f))"
          using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC F.FF_def
                D.runit_naturality [of "ΦF (g, f)"] D.comp_assoc
          by simp
        finally show "(F.map0 (trgC g) D ΦF (g, f)) D
                      𝖺D[F.map0 (trgC g), F g, F f] D
                      (𝗅D-1[F g] D 𝗋D[F g] D F f) D
                      D.inv 𝖺D[F g, F.map0 (srcC g), F f] D
                      (F g D 𝗅D-1[F f] D 𝗋D[F f]) D
                      𝖺D[F g, F f, F.map0 (srcC f)]
                        = (𝗅D-1[F (g C f)] D 𝗋D[F (g C f)]) D (ΦF (g, f) D F.map0 (srcC f))"
          by simp
      qed
      show "a. C.obj a 
                  (F.map0 a D F.unit a) D 𝗋D-1[F.map0 a] D 𝗅D[F.map0 a] =
                  map1 a D (F.unit a D F.map0 a)"
      proof -
        fix a
        assume a: "C.obj a"
        have "(F.map0 a D F.unit a) D 𝗋D-1[F.map0 a] D 𝗅D[F.map0 a] =
              (F.map0 a D F.unit a) D 𝗅D-1[F.map0 a] D 𝗋D[F.map0 a]"
          using a 1 D.unitor_coincidence by simp
        also have "... = ((F.map0 a D F.unit a) D 𝗅D-1[F.map0 a]) D 𝗋D[F.map0 a]"
          using D.comp_assoc by simp
        also have "... = 𝗅D-1[F a] D F.unit a D 𝗋D[F.map0 a]"
          using a 1 D.lunit'_naturality [of "F.unit a"] D.comp_assoc by simp
        also have "... = map1 a D (F.unit a D F.map0 a)"
          using a 1 D.runit_naturality [of "F.unit a"] D.comp_assoc by simp
        finally show "(F.map0 a D F.unit a) D 𝗋D-1[F.map0 a] D 𝗅D[F.map0 a] =
                      map1 a D (F.unit a D F.map0 a)"
          by blast
      qed
    qed

    lemma is_pseudonatural_transformation:
    shows "pseudonatural_transformation
             VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF F ΦF map0 map1"
      ..

  end

  subsection "Composite Pseudonatural Transformation"

  text ‹
    A pseudonatural transformation σ› from F› to G› and a pseudonatural transformation ρ›
    from G› to H› can be composed to obtain a pseudonatural transformation τ› from
    F› to H›.  The components at objects are composed via horizontal composition.
    Composing the components at 1-cells is straightforward, but is formally complicated by
    the need for associativities.  The additional complexity leads to somewhat lengthy
    proofs of the coherence conditions.  This issue only gets worse as we consider additional
    constructions on pseudonatural transformations.
  ›

  locale composite_pseudonatural_transformation =
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    F: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF +
    G: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG +
    H: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH +
    σ: pseudonatural_transformation
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG σ0 σ1 +
    ρ: pseudonatural_transformation
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG H ΦH ρ0 ρ1
  for VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'c  'd"
  and ΦF :: "'c * 'c  'd"
  and G :: "'c  'd"
  and ΦG :: "'c * 'c  'd"
  and H :: "'c  'd"
  and ΦH :: "'c * 'c  'd"
  and σ0 :: "'c  'd"
  and σ1 :: "'c  'd"
  and ρ0 :: "'c  'd"
  and ρ1 :: "'c  'd"
  begin

    definition map0
    where "map0 a = ρ0 a D σ0 a"

    definition map1
    where "map1 f = 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f] D
                    (ρ0 (trgC f) D σ1 f) D
                    𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)] D
                    (ρ1 f D σ0 (srcC f)) D
                    𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]"

    sublocale pseudonatural_transformation
      VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF H ΦH map0 map1
    proof
      show "a. C.obj a  D.ide (map0 a)"
        unfolding map0_def by fastforce
      show "a. C.obj a  «map0 a : srcD (F a) D srcD (H a)»"
        unfolding map0_def
        using ρ.map0_in_hhom σ.map0_in_hhom by blast
      show "f. C.ide f  «map1 f : H f D map0 (srcC f) D map0 (trgC f) D F f»"
        by (unfold map1_def map0_def, intro D.comp_in_homI) auto
      show "f. C.ide f  D.iso (map1 f)"
        unfolding map1_def
        using ρ.ide_map0_obj ρ.iso_map1_ide σ.ide_map0_obj σ.iso_map1_ide
        by (intro D.isos_compose) auto
      show "μ. C.arr μ  map1 (C.cod μ) D (H μ D map0 (srcC μ))
                               = (map0 (trgC μ) D F μ) D map1 (C.dom μ)"
      proof -
        fix μ
        assume μ: "C.arr μ"
        have "map1 (C.cod μ) D (H μ D map0 (srcC μ))
                = 𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.cod μ)] D
                  (ρ0 (trgC μ) D σ1 (C.cod μ)) D
                  𝖺D[ρ0 (trgC μ), G (C.cod μ), σ0 (srcC μ)] D
                  (ρ1 (C.cod μ) D σ0 (srcC μ)) D
                  𝖺D-1[H (C.cod μ), ρ0 (srcC μ), σ0 (srcC μ)] D
                  (H μ D ρ0 (srcC μ) D σ0 (srcC μ))"
          unfolding map1_def map0_def
          using μ D.comp_assoc by simp
        also have "... = 𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.cod μ)] D
                         (ρ0 (trgC μ) D σ1 (C.cod μ)) D
                         𝖺D[ρ0 (trgC μ), G (C.cod μ), σ0 (srcC μ)] D
                         ((ρ1 (C.cod μ) D σ0 (srcC μ)) D
                         ((H μ D ρ0 (srcC μ)) D σ0 (srcC μ))) D
                         𝖺D-1[H (C.dom μ), ρ0 (srcC μ), σ0 (srcC μ)]"
          using μ D.assoc'_naturality [of "H μ" "ρ0 (srcC μ)" "σ0 (srcC μ)"] D.comp_assoc by simp
        also have "... = 𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.cod μ)] D
                         (ρ0 (trgC μ) D σ1 (C.cod μ)) D
                         (𝖺D[ρ0 (trgC μ), G (C.cod μ), σ0 (srcC μ)] D
                         ((ρ0 (trgC μ) D G μ) D σ0 (srcC μ))) D
                         (ρ1 (C.dom μ) D σ0 (srcC μ)) D
                         𝖺D-1[H (C.dom μ), ρ0 (srcC μ), σ0 (srcC μ)]"
        proof -
          have "(ρ1 (C.cod μ) D σ0 (srcC μ)) D ((H μ D ρ0 (srcC μ)) D σ0 (srcC μ)) =
                ρ1 (C.cod μ) D (H μ D ρ0 (srcC μ)) D σ0 (srcC μ)"
            using μ D.whisker_right by simp
          also have "... = (ρ0 (trgC μ) D G μ) D ρ1 (C.dom μ) D σ0 (srcC μ)"
            using μ ρ.naturality by simp
          also have "... = ((ρ0 (trgC μ) D G μ) D σ0 (srcC μ)) D
                           (ρ1 (C.dom μ) D σ0 (srcC μ))"
            using μ D.whisker_right by simp
          finally have
              "(ρ1 (C.cod μ) D σ0 (srcC μ)) D ((H μ D ρ0 (srcC μ)) D σ0 (srcC μ)) =
               ((ρ0 (trgC μ) D G μ) D σ0 (srcC μ)) D (ρ1 (C.dom μ) D σ0 (srcC μ))"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.cod μ)] D
                         ((ρ0 (trgC μ) D σ1 (C.cod μ)) D
                         (ρ0 (trgC μ) D G μ D σ0 (srcC μ))) D
                         𝖺D[ρ0 (trgC μ), G (C.dom μ), σ0 (srcC μ)] D
                         (ρ1 (C.dom μ) D σ0 (srcC μ)) D
                         𝖺D-1[H (C.dom μ), ρ0 (srcC μ), σ0 (srcC μ)]"
          using μ D.assoc_naturality [of "ρ0 (trgC μ)" "G μ" "σ0 (srcC μ)"] D.comp_assoc
          by simp
        also have "... = (𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.cod μ)] D
                         (ρ0 (trgC μ) D σ0 (trgC μ) D F μ)) D
                         (ρ0 (trgC μ) D σ1 (C.dom μ)) D
                         𝖺D[ρ0 (trgC μ), G (C.dom μ), σ0 (srcC μ)] D
                         (ρ1 (C.dom μ) D σ0 (srcC μ)) D
                         𝖺D-1[H (C.dom μ), ρ0 (srcC μ), σ0 (srcC μ)]"
        proof -
          have "(ρ0 (trgC μ) D σ1 (C.cod μ)) D (ρ0 (trgC μ) D G μ D σ0 (srcC μ)) =
                ρ0 (trgC μ) D σ1 (C.cod μ) D (G μ D σ0 (srcC μ))"
            using μ D.whisker_left by simp
          also have "... = ρ0 (trgC μ) D (σ0 (trgC μ) D F μ) D σ1 (C.dom μ)"
            using μ σ.naturality by simp
          also have "... = (ρ0 (trgC μ) D σ0 (trgC μ) D F μ) D (ρ0 (trgC μ) D σ1 (C.dom μ))"
            using μ D.whisker_left by simp
          finally have "(ρ0 (trgC μ) D σ1 (C.cod μ)) D (ρ0 (trgC μ) D G μ D σ0 (srcC μ)) =
                        (ρ0 (trgC μ) D σ0 (trgC μ) D F μ) D (ρ0 (trgC μ) D σ1 (C.dom μ))"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((ρ0 (trgC μ) D σ0 (trgC μ)) D F μ) D
                         𝖺D-1[ρ0 (trgC μ), σ0 (trgC μ), F (C.dom μ)] D
                         (ρ0 (trgC μ) D σ1 (C.dom μ)) D
                         𝖺D[ρ0 (trgC μ), G (C.dom μ), σ0 (srcC μ)] D
                         (ρ1 (C.dom μ) D σ0 (srcC μ)) D
                         𝖺D-1[H (C.dom μ), ρ0 (srcC μ), σ0 (srcC μ)]"
          using μ D.assoc'_naturality [of "ρ0 (trgC μ)" "σ0 (trgC μ)" "F μ"] D.comp_assoc
          by simp
        also have "... = (map0 (trgC μ) D F μ) D map1 (C.dom μ)"
          unfolding map1_def map0_def
          using μ by simp
        finally show "map1 (C.cod μ) D (H μ D map0 (srcC μ)) =
                      (map0 (trgC μ) D F μ) D map1 (C.dom μ)"
          by blast
      qed
      show "a. C.obj a  (map0 a D F.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]
                               = map1 a D (H.unit a D map0 a)"
      proof -
        fix a
        assume a: "C.obj a"
        have "map1 a D (H.unit a D map0 a)
                = 𝖺D-1[ρ0 a, σ0 a, F a] D
                  (ρ0 a D σ1 a) D
                  𝖺D[ρ0 a, G a, σ0 a] D
                  (ρ1 a D σ0 a) D
                  𝖺D-1[H a, ρ0 a, σ0 a] D
                  (H.unit a D ρ0 a D σ0 a)"
          unfolding map1_def map0_def
          using a C.obj_simps D.comp_assoc by simp
        also have "... = 𝖺D-1[ρ0 a, σ0 a, F a] D
                         (ρ0 a D σ1 a) D
                         𝖺D[ρ0 a, G a, σ0 a] D
                         ((ρ1 a D σ0 a) D
                         ((H.unit a D ρ0 a) D σ0 a)) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
          using a C.obj_simps D.assoc'_naturality [of "H.unit a" "ρ0 a" "σ0 a"] D.comp_assoc
          by auto
        also have "... = 𝖺D-1[ρ0 a, σ0 a, F a] D
                         (ρ0 a D σ1 a) D
                         (𝖺D[ρ0 a, G a, σ0 a] D
                         ((ρ0 a D G.unit a) D σ0 a)) D
                         (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
        proof -
          have "(ρ1 a D σ0 a) D ((H.unit a D ρ0 a) D σ0 a)
                   = ρ1 a D (H.unit a D ρ0 a) D σ0 a"
            using a C.obj_simps D.whisker_right
            by (metis C.objE D.hcomp_simps(4) D.hseqI' D.ideD(1) D.ideD(3) D.seqI
                H.unit_simps(1) H.unit_simps(2) H.unit_simps(5)
                ρ.ide_map0_obj ρ.map0_simps(3) ρ.map1_simps(1) ρ.map1_simps(4) σ.ide_map0_obj)
          also have "... = (ρ0 a D G.unit a) D 𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a"
            using a C.obj_simps ρ.respects_unit D.comp_assoc by simp
          also have "... = ((ρ0 a D G.unit a) D σ0 a) D (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a)"
            using a C.obj_simps D.whisker_right
            by (metis C.objE D.hcomp_simps(4) D.hseqI' D.ideD(1) D.ideD(3) D.seqI D.trg_cod
                H.unit_simps(1-2,5) H.𝗂_simps(3,5) ρ.ide_map0_obj ρ.map0_simps(3)
                ρ.map1_simps(1,4) ρ.respects_unit σ.ide_map0_obj)
          finally have "(ρ1 a D σ0 a) D ((H.unit a D ρ0 a) D σ0 a) =
                        ((ρ0 a D G.unit a) D σ0 a) D (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[ρ0 a, σ0 a, F a] D
                         ((ρ0 a D σ1 a) D
                         (ρ0 a D G.unit a D σ0 a)) D
                         𝖺D[ρ0 a, G.map0 a, σ0 a] D
                         (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
          using a D.assoc_naturality [of "ρ0 a" "G.unit a" "σ0 a"] D.comp_assoc by auto
        also have "... = (𝖺D-1[ρ0 a, σ0 a, F a] D
                         (ρ0 a D σ0 a D F.unit a)) D
                         (ρ0 a D 𝗋D-1[σ0 a] D 𝗅D[σ0 a]) D
                         𝖺D[ρ0 a, G.map0 a, σ0 a] D
                         (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
        proof -
          have "(ρ0 a D σ1 a) D (ρ0 a D G.unit a D σ0 a)
                   = ρ0 a D σ1 a D (G.unit a D σ0 a)"
            using a D.whisker_left [of "ρ0 a" "σ1 a" "G.unit a D σ0 a"] by force
          also have "... = ρ0 a D (σ0 a D F.unit a) D 𝗋D-1[σ0 a] D 𝗅D[σ0 a]"
            using a σ.respects_unit by simp
          also have "... = (ρ0 a D σ0 a D F.unit a) D (ρ0 a D 𝗋D-1[σ0 a] D 𝗅D[σ0 a])"
            using a D.whisker_left C.obj_simps by fastforce
          finally have "(ρ0 a D σ1 a) D (ρ0 a D G.unit a D σ0 a) =
                        (ρ0 a D σ0 a D F.unit a) D (ρ0 a D 𝗋D-1[σ0 a] D 𝗅D[σ0 a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((ρ0 a D σ0 a) D F.unit a) D
                         𝖺D-1[ρ0 a, σ0 a, F.map0 a] D
                         (ρ0 a D 𝗋D-1[σ0 a] D 𝗅D[σ0 a]) D
                         𝖺D[ρ0 a, G.map0 a, σ0 a] D
                         (𝗋D-1[ρ0 a] D 𝗅D[ρ0 a] D σ0 a) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
          using a D.assoc'_naturality [of "ρ0 a" "σ0 a" "F.unit a"] D.comp_assoc
          by fastforce
        also have "... = ((ρ0 a D σ0 a) D F.unit a) D
                         (𝖺D-1[ρ0 a, σ0 a, F.map0 a] D
                         (ρ0 a D 𝗋D-1[σ0 a])) D
                         (ρ0 a D 𝗅D[σ0 a]) D
                         𝖺D[ρ0 a, G.map0 a, σ0 a] D
                         (𝗋D-1[ρ0 a] D σ0 a) D
                         (𝗅D[ρ0 a] D σ0 a) D
                         𝖺D-1[H.map0 a, ρ0 a, σ0 a]"
          using a D.whisker_left D.whisker_right D.comp_assoc by simp
        also have "... = ((ρ0 a D σ0 a) D F.unit a) D
                         𝗋D-1[ρ0 a D σ0 a] D
                         (𝗋D[ρ0 a] D σ0 a) D
                         ((𝖺D-1[ρ0 a, G.map0 a, σ0 a] D
                         𝖺D[ρ0 a, G.map0 a, σ0 a]) D
                         (𝗋D-1[ρ0 a] D σ0 a)) D
                         𝗅D[ρ0 a D σ0 a]"
          using a D.lunit_hcomp(3) [of "ρ0 a" "σ0 a"] D.runit_hcomp(2) [of "ρ0 a" "σ0 a"]
                D.triangle' [of "ρ0 a" "σ0 a"] D.comp_assoc
          by auto
       also have "... = ((ρ0 a D σ0 a) D F.unit a) D 𝗋D-1[ρ0 a D σ0 a] D 𝗅D[ρ0 a D σ0 a]"
       proof -
         have "𝖺D-1[ρ0 a, G.map0 a, σ0 a] D 𝖺D[ρ0 a, G.map0 a, σ0 a]
                 = (ρ0 a D G.map0 a) D σ0 a"
           using a D.comp_inv_arr'
           by (metis C.obj_def' D.comp_assoc_assoc'(2) G.map0_def G.map0_simps(1)
               G.preserves_trg G.weak_arrow_of_homs_axioms ρ.ide_map0_obj ρ.map0_simps(2)
               σ.ide_map0_obj σ.map0_simps(3) horizontal_homs.objE weak_arrow_of_homs_def)
         moreover have "((ρ0 a D G.map0 a) D σ0 a) D (𝗋D-1[ρ0 a] D σ0 a)
                          = (𝗋D-1[ρ0 a] D σ0 a)"
           using a D.comp_cod_arr D.whisker_right
           by (metis D.runit'_simps(1) D.runit'_simps(5) G.map0_def ρ.ide_map0_obj
               ρ.map0_simps(2) σ.ide_map0_obj)
         moreover have "(𝗋D[ρ0 a] D σ0 a) D (𝗋D-1[ρ0 a] D σ0 a) = ρ0 a D σ0 a"
           using a D.whisker_right D.comp_arr_inv' D.R.as_nat_iso.components_are_iso
           by (metis D.ideD(1) D.iso_runit D.runit_simps(5) ρ.ide_map0_obj σ.ide_map0_obj)
         moreover have "(ρ0 a D σ0 a) D 𝗅D[ρ0 a D σ0 a] = 𝗅D[ρ0 a D σ0 a]"
           using a D.comp_cod_arr a. C.obj a  D.ide (map0 a) map0_def by auto
         ultimately show ?thesis
           using D.comp_assoc by metis
       qed
       also have "... = (map0 a D F.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]"
         unfolding map0_def by simp
       finally show "(map0 a D F.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]
                       = map1 a D (H.unit a D map0 a)"
         by simp
     qed
     show "f g. C.ide f; C.ide g; srcC g = trgC f 
                    (map0 (trgC g) D ΦF (g, f)) D
                    𝖺D[map0 (trgC g), F g, F f] D
                    (map1 g D F f) D
                    D.inv 𝖺D[H g, map0 (srcC g), F f] D
                    (H g D map1 f) D 𝖺D[H g, H f, map0 (srcC f)]
                      = map1 (g C f) D (ΦH (g, f) D map0 (srcC f))"
     proof -
       fix f g
       assume f: "C.ide f" and g: "C.ide g" and fg: "srcC g = trgC f"
       have "(map0 (trgC g) D ΦF (g, f)) D
             𝖺D[map0 (trgC g), F g, F f] D
             (map1 g D F f) D
             D.inv 𝖺D[H g, map0 (srcC g), F f] D
             (H g D map1 f) D 𝖺D[H g, H f, map0 (srcC f)]
               = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                 𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                 (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D
                 (ρ0 (trgC g) D σ1 g) D
                  𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D
                  (ρ1 g D σ0 (srcC g)) D
                  𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g)]
                     D F f) D
                 𝖺D-1[H g, ρ0 (srcC g) D σ0 (srcC g), F f] D
                 (H g D 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f] D
                         (ρ0 (trgC f) D σ1 f) D
                         𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)] D
                         (ρ1 f D σ0 (srcC f)) D
                         𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
               𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
         unfolding map0_def map1_def
         using f g fg by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        ((ρ1 g D σ0 (srcC g)) D F f) D
                        ((𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g)] D F f) D
                        𝖺D-1[H g, ρ0 (srcC g) D σ0 (srcC g), F f]) D
                        (H g D 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f]) D
                        (H g D ρ0 (trgC f) D σ1 f) D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
         using f g fg D.whisker_left D.whisker_right D.comp_assoc by fastforce
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        (((ρ1 g D σ0 (srcC g)) D F f) D
                        𝖺D-1[H g D ρ0 (srcC g), σ0 (srcC g), F f]) D
                        𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g) D F f] D
                        (H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f]) D
                        (H g D 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f]) D
                        (H g D ρ0 (trgC f) D σ1 f) D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
         using f g fg D.pentagon' D.comp_assoc
               D.invert_side_of_triangle(2)
                 [of "𝖺D-1[H g D ρ0 (srcC g), σ0 (srcC g), F f] D
                        𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g) D F f]"
                     "(𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g)] D F f) D
                        𝖺D-1[H g, ρ0 (srcC g) D σ0 (srcC g), F f]"
                     "H g D 𝖺D-1[ρ0 (srcC g), σ0 (srcC g), F f]"]
         by force
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        (ρ1 g D σ0 (srcC g) D F f) D
                        𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g) D F f] D
                        (((H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f]) D
                        (H g D 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f])) D
                        (H g D ρ0 (trgC f) D σ1 f)) D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
        proof -
         have "((ρ1 g D σ0 (srcC g)) D F f) D 𝖺D-1[H g D ρ0 (srcC g), σ0 (srcC g), F f]
                 = 𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D (ρ1 g D σ0 (srcC g) D F f)"
           using f g fg D.assoc'_naturality [of "ρ1 g" "σ0 (srcC g)" "F f"] by simp
         thus ?thesis
            using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        (ρ1 g D σ0 (srcC g) D F f) D
                        (𝖺D-1[H g, ρ0 (srcC g), σ0 (srcC g) D F f] D
                        (H g D ρ0 (trgC f) D σ1 f)) D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
      proof -
         have "((H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f]) D
               (H g D 𝖺D-1[ρ0 (trgC f), σ0 (trgC f), F f])) D
               (H g D ρ0 (trgC f) D σ1 f)
                 = H g D ρ0 (trgC f) D σ1 f"
         proof -
           have "(H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f]) D
                 (H g D 𝖺D-1[ρ0 (srcC g), σ0 (srcC g), F f])
                   = H g D ρ0 (srcC g) D σ0 (srcC g) D F f"
           proof -
             have "(H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f]) D
                   (H g D 𝖺D-1[ρ0 (srcC g), σ0 (srcC g), F f])
                     = H g D 𝖺D[ρ0 (srcC g), σ0 (srcC g), F f] D
                       𝖺D-1[ρ0 (srcC g), σ0 (srcC g), F f]"
               using f g fg D.whisker_left by simp
             also have "... = H g D ρ0 (srcC g) D σ0 (srcC g) D F f"
               using f g fg D.comp_arr_inv' by simp
             finally show ?thesis by simp
           qed
           moreover have "(H g D ρ0 (srcC g) D σ0 (srcC g) D F f) D
                          (H g D ρ0 (trgC f) D σ1 f)
                            = (H g D ρ0 (trgC f) D σ1 f)"
             using f g fg D.comp_cod_arr by simp
           ultimately show ?thesis
             using fg by simp
         qed
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ1 g D σ0 (srcC g) D F f) D
                        ((H g D ρ0 (trgC f)) D σ1 f)) D
                        𝖺D-1[H g, ρ0 (srcC g), G f D σ0 (srcC f)] D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
         using f g fg D.assoc'_naturality [of "H g" "ρ0 (srcC g)" "σ1 f"] D.comp_assoc by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        (ρ1 g D G f D σ0 (srcC f)) D
                        (𝖺D-1[H g, ρ0 (srcC g), G f D σ0 (srcC f)] D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)])) D
                        (H g D ρ1 f D σ0 (srcC f)) D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
       proof -
         have "(ρ1 g D σ0 (srcC g) D F f) D ((H g D ρ0 (trgC f)) D σ1 f) =
               ((ρ0 (trgC g) D G g) D σ1 f) D (ρ1 g D G f D σ0 (srcC f))"
           using f g fg D.interchange D.comp_arr_dom D.comp_cod_arr
           by (metis C.ideD(1) ρ.map1_simps(1,5) ρ.naturality σ.map1_simps(1,4)
               σ.naturality C.ideD(2,3))
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        (ρ1 g D G f D σ0 (srcC f)) D
                        ((𝖺D-1[H g, ρ0 (srcC g), G f D σ0 (srcC f)] D
                        (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)])) D
                        𝖺D[H g, ρ0 (trgC f) D G f, σ0 (srcC f)]) D
                        ((H g D ρ1 f) D σ0 (srcC f)) D
                        𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
         using f g fg D.comp_assoc D.hcomp_reassoc(2) by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        ((ρ1 g D G f D σ0 (srcC f)) D
                        𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)]) D
                        (𝖺D-1[H g, ρ0 (trgC f), G f] D σ0 (srcC f)) D
                        ((H g D ρ1 f) D σ0 (srcC f)) D
                        𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
       proof -  
         have "(𝖺D-1[H g, ρ0 (srcC g), G f D σ0 (srcC f)] D
               (H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)])) D
               𝖺D[H g, ρ0 (trgC f) D G f, σ0 (srcC f)]
                 = 𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)] D
                   (𝖺D-1[H g, ρ0 (trgC f), G f] D σ0 (srcC f))"
         proof -
           have "((H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                 𝖺D[H g, ρ0 (trgC f) D G f, σ0 (srcC f)]) D
                 (𝖺D[H g, ρ0 (trgC f), G f] D σ0 (srcC f))
                   = 𝖺D[H g, ρ0 (trgC f), G f D σ0 (srcC f)] D
                     𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)]"
             using f g fg D.pentagon D.comp_assoc by simp
           moreover have "D.seq 𝖺D[H g, ρ0 (trgC f), G f D σ0 (srcC f)]
                                𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)]"
             using f g fg
             by (intro D.seqI) auto
           ultimately show ?thesis
             using f g fg D.comp_assoc
                   D.invert_opposite_sides_of_square
                     [of "𝖺D[H g, ρ0 (trgC f), G f D σ0 (srcC f)]"
                         "𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)]"
                         "(H g D 𝖺D[ρ0 (trgC f), G f, σ0 (srcC f)]) D
                            𝖺D[H g, ρ0 (trgC f) D G f, σ0 (srcC f)]"
                         "𝖺D[H g, ρ0 (trgC f), G f] D σ0 (srcC f)"]
             by fastforce
         qed
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (((ρ1 g D G f) D σ0 (srcC f)) D
                        (𝖺D-1[H g, ρ0 (trgC f), G f] D σ0 (srcC f)) D
                        ((H g D ρ1 f) D σ0 (srcC f))) D
                        𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
       proof -
         have "(ρ1 g D G f D σ0 (srcC f)) D 𝖺D[H g D ρ0 (trgC f), G f, σ0 (srcC f)] =
               𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D ((ρ1 g D G f) D σ0 (srcC f))"
           using f g fg D.assoc_naturality [of "ρ1 g" "G f" "σ0 (srcC f)"] by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        ((ΦH (g, f) D ρ0 (srcC f)) D σ0 (srcC f)) D
                        ((𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f)) D
                        𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                        (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]) D
                        𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)])"
       proof -
         have "((ρ1 g D G f) D σ0 (srcC f)) D
                 (𝖺D-1[H g, ρ0 (trgC f), G f] D σ0 (srcC f)) D
                 ((H g D ρ1 f) D σ0 (srcC f)) =
               (ρ1 g D G f) D 𝖺D-1[H g, ρ0 (trgC f), G f] D (H g D ρ1 f) D σ0 (srcC f)"
           using f g fg D.whisker_right by simp
         also have "... = 𝖺D-1[ρ0 (trgC g), G g, G f] D (ρ0 (trgC g) D D.inv (ΦG (g, f))) D
                          ρ1 (g C f) D
                          (ΦH (g, f) D ρ0 (srcC f)) D 𝖺D-1[H g, H f, ρ0 (srcC f)]
                            D σ0 (srcC f)"
         proof -
           have "((ρ0 (trgC g) D ΦG (g, f)) D 𝖺D[ρ0 (trgC g), G g, G f] D
                 ((ρ1 g D G f) D 𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f))) D
                 𝖺D[H g, H f, ρ0 (srcC f)]
                   = ρ1 (g C f) D (ΦH (g, f) D ρ0 (srcC f))"
             using f g fg ρ.respects_hcomp D.comp_assoc by simp
           moreover have "D.seq (ρ1 (g C f)) (ΦH (g, f) D ρ0 (srcC f))"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC by auto
           ultimately
           have "(ρ0 (trgC g) D ΦG (g, f)) D 𝖺D[ρ0 (trgC g), G g, G f] D
                 ((ρ1 g D G f) D 𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f))
                   = (ρ1 (g C f) D (ΦH (g, f) D ρ0 (srcC f))) D 𝖺D-1[H g, H f, ρ0 (srcC f)]"
             using f g fg D.invert_side_of_triangle(2) by simp
           moreover have "D.seq (ρ1 (g C f) D (ΦH (g, f) D ρ0 (srcC f)))
                                𝖺D-1[H g, H f, ρ0 (srcC f)]"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def by auto
           ultimately
           have "𝖺D[ρ0 (trgC g), G g, G f] D
                 ((ρ1 g D G f) D 𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f))
                   = (ρ0 (trgC g) D D.inv (ΦG (g, f))) D
                     (ρ1 (g C f) D
                     (ΦH (g, f) D ρ0 (srcC f))) D 𝖺D-1[H g, H f, ρ0 (srcC f)]"
             using f g fg
                   D.invert_side_of_triangle(1)
                     [of "(ρ1 (g C f) D (ΦH (g, f) D ρ0 (srcC f))) D 𝖺D-1[H g, H f, ρ0 (srcC f)]"
                         "ρ0 (trgC g) D ΦG (g, f)"
                         "𝖺D[ρ0 (trgC g), G g, G f] D ((ρ1 g D G f) D
                          𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f))"]
             by simp
           hence "(ρ1 g D G f) D 𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f)
                    = 𝖺D-1[ρ0 (trgC g), G g, G f] D (ρ0 (trgC g) D D.inv (ΦG (g, f))) D
                      (ρ1 (g C f) D
                      (ΦH (g, f) D ρ0 (srcC f))) D 𝖺D-1[H g, H f, ρ0 (srcC f)]"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
                   D.invert_side_of_triangle(1)
             by simp
           hence "(ρ1 g D G f) D 𝖺D-1[H g, ρ0 (srcC g), G f] D (H g D ρ1 f)
                    = 𝖺D-1[ρ0 (trgC g), G g, G f] D (ρ0 (trgC g) D D.inv (ΦG (g, f))) D
                      ρ1 (g C f) D
                      (ΦH (g, f) D ρ0 (srcC f)) D 𝖺D-1[H g, H f, ρ0 (srcC f)]"
             using D.comp_assoc by simp
           thus ?thesis
             using fg by simp
         qed
         also have "... = (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                          ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                          (ρ1 (g C f) D σ0 (srcC f)) D
                          ((ΦH (g, f) D ρ0 (srcC f)) D σ0 (srcC f)) D
                          (𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f))"
           using f g fg D.whisker_right C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                 H.FF_def G.FF_def
           by force
         finally have "((ρ1 g D G f) D σ0 (srcC f)) D
                       (𝖺D-1[H g, ρ0 (trgC f), G f] D σ0 (srcC f)) D
                       ((H g D ρ1 f) D σ0 (srcC f))
                         = (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                           ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                           (ρ1 (g C f) D σ0 (srcC f)) D
                           ((ΦH (g, f) D ρ0 (srcC f)) D σ0 (srcC f)) D
                           (𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f))"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        ((ΦH (g, f) D ρ0 (srcC f)) D σ0 (srcC f)) D
                        𝖺D-1[H g D H f, ρ0 (srcC f), σ0 (srcC f)]"
       proof -
         have "((𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f)) D
               𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
               (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)])) D
               𝖺D[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]
                 = 𝖺D-1[H g D H f, ρ0 (srcC f), σ0 (srcC f)]"
         proof -
           have "(𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f)) D
                 𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                 (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)])
                   = 𝖺D-1[H g D H f, ρ0 (srcC f), σ0 (srcC f)] D
                     𝖺D-1[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"
             using f g fg D.pentagon' D.comp_assoc by simp
           moreover have "D.seq (𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f))
                                (𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                                  (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)]))"
             using f g fg by auto
           ultimately show ?thesis
             using f g fg D.comp_assoc
                   D.invert_side_of_triangle(2)
                     [of "(𝖺D-1[H g, H f, ρ0 (srcC f)] D σ0 (srcC f)) D
                            𝖺D-1[H g, H f D ρ0 (srcC f), σ0 (srcC f)] D
                            (H g D 𝖺D-1[H f, ρ0 (srcC f), σ0 (srcC f)])"
                         "𝖺D-1[H g D H f, ρ0 (srcC f), σ0 (srcC f)]"
                         "𝖺D-1[H g, H f, ρ0 (srcC f) D σ0 (srcC f)]"]
             by simp
         qed
         thus ?thesis
           using D.comp_assoc by simp
       qed              
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        ((ρ0 (trgC g) D σ1 g) D F f) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.assoc'_naturality [of "ΦH (g, f)" "ρ0 (srcC f)" "σ0 (srcC f)"]
         by fastforce
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        𝖺D-1[ρ0 (trgC g), σ0 (trgC g) D F g, F f] D
                        (ρ0 (trgC g) D σ1 g D F f) D
                        (𝖺D[ρ0 (trgC g), G g D σ0 (srcC g), F f] D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f) D
                        𝖺D-1[ρ0 (trgC g) D G g, σ0 (srcC g), F f]) D
                        ((ρ0 (trgC g) D G g) D σ1 f) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.hcomp_reassoc(1) D.comp_assoc by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        𝖺D-1[ρ0 (trgC g), σ0 (trgC g) D F g, F f] D
                        (ρ0 (trgC g) D σ1 g D F f) D
                        (ρ0 (trgC g) D 𝖺D-1[G g, σ0 (srcC g), F f]) D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g) D F f] D
                        ((ρ0 (trgC g) D G g) D σ1 f)) D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.comp_assoc D.pentagon
               D.invert_opposite_sides_of_square
                 [of "ρ0 (trgC g) D 𝖺D[G g, σ0 (srcC g), F f]"
                     "𝖺D[ρ0 (trgC g), G g D σ0 (srcC g), F f] D
                        (𝖺D[ρ0 (trgC g), G g, σ0 (srcC g)] D F f)"
                     "𝖺D[ρ0 (trgC g), G g, σ0 (srcC g) D F f]"
                     "𝖺D[ρ0 (trgC g) D G g, σ0 (srcC g), F f]"]
         by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        𝖺D-1[ρ0 (trgC g), σ0 (trgC g) D F g, F f] D
                        ((ρ0 (trgC g) D σ1 g D F f) D
                        (ρ0 (trgC g) D 𝖺D-1[G g, σ0 (srcC g), F f]) D
                        (ρ0 (trgC g) D G g D σ1 f)) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.assoc_naturality [of "ρ0 (trgC g)" "G g" "σ1 f"] D.comp_assoc by simp
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        (𝖺D[ρ0 (trgC g) D σ0 (trgC g), F g, F f] D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                        𝖺D-1[ρ0 (trgC g), σ0 (trgC g) D F g, F f] D
                        (ρ0 (trgC g) D 𝖺D-1[σ0 (trgC g), F g, F f])) D
                        (ρ0 (trgC g) D σ0 (trgC g) D D.inv (ΦF (g, f))) D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                        (ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)]) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
       proof -
         have "(ρ0 (trgC g) D σ1 g D F f) D
               (ρ0 (trgC g) D 𝖺D-1[G g, σ0 (srcC g), F f]) D
               (ρ0 (trgC g) D G g D σ1 f)
                 = ρ0 (trgC g) D (σ1 g D F f) D 𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)"
           using f g fg D.whisker_left by simp
         also have "... = ρ0 (trgC g) D
                             𝖺D-1[σ0 (trgC g), F g, F f] D
                             (σ0 (trgC g) D D.inv (ΦF (g, f))) D
                             σ1 (g C f) D
                             (ΦG (g, f) D σ0 (srcC f)) D
                             𝖺D-1[G g, G f, σ0 (srcC f)]"
         proof -
           have "((σ0 (trgC g) D ΦF (g, f)) D
                 𝖺D[σ0 (trgC g), F g, F f] D
                 (σ1 g D F f) D 𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)) D
                 𝖺D[G g, G f, σ0 (srcC f)]
                   = σ1 (g C f) D (ΦG (g, f) D σ0 (srcC f))"
             using f g fg σ.respects_hcomp D.comp_assoc by simp
           hence "(σ0 (trgC g) D ΦF (g, f)) D
                  𝖺D[σ0 (trgC g), F g, F f] D
                  (σ1 g D F f) D 𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)
                    = (σ1 (g C f) D (ΦG (g, f) D σ0 (srcC f))) D 𝖺D-1[G g, G f, σ0 (srcC f)]"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC D.invert_side_of_triangle(2)
             by simp
           hence "𝖺D[σ0 (trgC g), F g, F f] D
                  (σ1 g D F f) D 𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)
                    = (σ0 (trgC g) D D.inv (ΦF (g, f))) D
                      (σ1 (g C f) D (ΦG (g, f) D σ0 (srcC f))) D 𝖺D-1[G g, G f, σ0 (srcC f)]"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC G.FF_def
                   D.invert_side_of_triangle(1)
                     [of "(σ1 (g C f) D (ΦG (g, f) D σ0 (srcC f))) D 𝖺D-1[G g, G f, σ0 (srcC f)]"
                         "σ0 (trgC g) D ΦF (g, f)"
                         "𝖺D[σ0 (trgC g), F g, F f] D (σ1 g D F f) D
                            𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)"]
             by simp
           hence "(σ1 g D F f) D 𝖺D-1[G g, σ0 (srcC g), F f] D (G g D σ1 f)
                    = 𝖺D-1[σ0 (trgC g), F g, F f] D (σ0 (trgC g) D D.inv (ΦF (g, f))) D
                      (σ1 (g C f) D (ΦG (g, f) D σ0 (srcC f))) D 𝖺D-1[G g, G f, σ0 (srcC f)]"
             using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC G.FF_def F.FF_def
                   D.invert_side_of_triangle(1)
             by simp
           thus ?thesis
             using D.comp_assoc by simp
         qed
         also have "... = (ρ0 (trgC g) D 𝖺D-1[σ0 (trgC g), F g, F f]) D
                          (ρ0 (trgC g) D σ0 (trgC g) D D.inv (ΦF (g, f))) D
                          (ρ0 (trgC g) D σ1 (g C f)) D
                          (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                          (ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)])"
            using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC F.FF_def G.FF_def
                  D.whisker_left
           by force
         finally have "(ρ0 (trgC g) D σ1 g D F f) D
                       (ρ0 (trgC g) D 𝖺D-1[G g, σ0 (srcC g), F f]) D
                       (ρ0 (trgC g) D G g D σ1 f)
                         = (ρ0 (trgC g) D 𝖺D-1[σ0 (trgC g), F g, F f]) D
                           (ρ0 (trgC g) D σ0 (trgC g) D D.inv (ΦF (g, f))) D
                           (ρ0 (trgC g) D σ1 (g C f)) D
                           (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                           (ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)])"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = ((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        (𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g D F f] D
                        (ρ0 (trgC g) D σ0 (trgC g) D D.inv (ΦF (g, f)))) D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                        (ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)]) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.pentagon' D.comp_assoc
               D.invert_side_of_triangle(1)
                 [of "(𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g] D F f) D
                      𝖺D-1[ρ0 (trgC g), σ0 (trgC g) D F g, F f] D
                      (ρ0 (trgC g) D 𝖺D-1[σ0 (trgC g), F g, F f])"
                     "𝖺D-1[ρ0 (trgC g) D σ0 (trgC g), F g, F f]"
                     "𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F g D F f]" ]
         by simp
       also have "... = ((((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                        ((ρ0 (trgC g) D σ0 (trgC g)) D D.inv (ΦF (g, f)))) D
                        𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)]) D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                        (ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)]) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
           using f g fg D.assoc'_naturality [of "ρ0 (trgC g)" "σ0 (trgC g)" "D.inv (ΦF (g, f))"]
                 D.comp_assoc
           by simp
       also have "... = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)] D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        (ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)]) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)] D
                        (𝖺D-1[ρ0 (trgC g), G g, G f] D σ0 (srcC f))) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
       proof -
         have "(((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
               ((ρ0 (trgC g) D σ0 (trgC g)) D D.inv (ΦF (g, f)))) D
               𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)]
                 = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)]"
         proof -
           have "((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                 ((ρ0 (trgC g) D σ0 (trgC g)) D D.inv (ΦF (g, f)))
                   = (ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f) D D.inv (ΦF (g, f))"
             using f g fg D.whisker_left C.VV.arr_charSbC by simp
           also have "... = (ρ0 (trgC g) D σ0 (trgC g)) D F (g C f)"
             using f g fg D.comp_arr_inv' F.cmp_components_are_iso by simp
           finally have "((ρ0 (trgC g) D σ0 (trgC g)) D ΦF (g, f)) D
                         ((ρ0 (trgC g) D σ0 (trgC g)) D D.inv (ΦF (g, f)))
                           = (ρ0 (trgC g) D σ0 (trgC g)) D F (g C f)"
             by blast
           moreover have "((ρ0 (trgC g) D σ0 (trgC g)) D F (g C f)) D
                          𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)]
                            = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)]"
             using f g fg D.comp_cod_arr by simp
           ultimately show ?thesis by simp
         qed
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)] D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        ((ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
                        𝖺D[ρ0 (trgC g), G g D G f, σ0 (srcC f)]) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f)) D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
         using f g fg D.pentagon D.comp_assoc
               D.invert_side_of_triangle(1)
                 [of "𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)]"
                     "ρ0 (trgC g) D 𝖺D[G g, G f, σ0 (srcC f)]"
                     "𝖺D[ρ0 (trgC g), G g D G f, σ0 (srcC f)] D
               (𝖺D[ρ0 (trgC g), G g, G f] D σ0 (srcC f))"]
               D.invert_side_of_triangle(2)
                 [of "(ρ0 (trgC g) D 𝖺D-1[G g, G f, σ0 (srcC f)]) D
                        𝖺D[ρ0 (trgC g), G g, G f D σ0 (srcC f)] D
                        𝖺D[ρ0 (trgC g) D G g, G f, σ0 (srcC f)]"
                     "𝖺D[ρ0 (trgC g), G g D G f, σ0 (srcC f)]"
                     "𝖺D[ρ0 (trgC g), G g, G f] D σ0 (srcC f)"]
         by simp
       also have "... = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)] D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        𝖺D[ρ0 (trgC g), G (g C f), σ0 (srcC f)] D
                        ((((ρ0 (trgC g) D ΦG (g, f)) D σ0 (srcC f)) D
                        ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f))) D
                        (ρ1 (g C f) D σ0 (srcC f))) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
        proof -
         have "(ρ0 (trgC g) D ΦG (g, f) D σ0 (srcC f)) D
               𝖺D[ρ0 (trgC g), G g D G f, σ0 (srcC f)]
                 = 𝖺D[ρ0 (trgC g), G (g C f), σ0 (srcC f)] D
                   ((ρ0 (trgC g) D ΦG (g, f)) D σ0 (srcC f))"
           using f g fg D.assoc_naturality [of "ρ0 (trgC g)" "ΦG (g, f)" "σ0 (srcC f)"]
           by fastforce
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = 𝖺D-1[ρ0 (trgC g), σ0 (trgC g), F (g C f)] D
                        (ρ0 (trgC g) D σ1 (g C f)) D
                        𝖺D[ρ0 (trgC g), G (g C f), σ0 (srcC f)] D
                        (ρ1 (g C f) D σ0 (srcC f)) D
                        𝖺D-1[H (g C f), ρ0 (srcC f), σ0 (srcC f)] D
                        (ΦH (g, f) D ρ0 (srcC f) D σ0 (srcC f))"
       proof -
         have "(((ρ0 (trgC g) D ΦG (g, f)) D σ0 (srcC f)) D
               ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f))) D
               (ρ1 (g C f) D σ0 (srcC f))
                 = ρ1 (g C f) D σ0 (srcC f)"
         proof -
           have "((ρ0 (trgC g) D ΦG (g, f)) D σ0 (srcC f)) D
                 ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f))
                   = (ρ0 (trgC g) D ΦG (g, f)) D
                     (ρ0 (trgC g) D D.inv (ΦG (g, f)))
                        D σ0 (srcC f)"
             using f g fg C.VV.arr_charSbC D.whisker_right by simp
           also have "... = (ρ0 (trgC g) D ΦG (g, f) D D.inv (ΦG (g, f))) D σ0 (srcC f)"
             using f g fg C.VV.arr_charSbC D.whisker_left [of "ρ0 (trgC g)"] by simp
           also have "... = (ρ0 (trgC g) D G (g C f)) D σ0 (srcC f)"
             using f g fg D.comp_arr_inv' G.cmp_components_are_iso G.cmp_simps(5) by auto
           finally have "((ρ0 (trgC g) D ΦG (g, f)) D σ0 (srcC f)) D
                         ((ρ0 (trgC g) D D.inv (ΦG (g, f))) D σ0 (srcC f))
                           = (ρ0 (trgC g) D G (g C f)) D σ0 (srcC f)"
             by blast
           moreover have "((ρ0 (trgC g) D G (g C f)) D σ0 (srcC f)) D
                          (ρ1 (g C f) D σ0 (srcC f))
                            = ρ1 (g C f) D σ0 (srcC f)"
             using f g fg D.comp_cod_arr by simp
           ultimately show ?thesis by simp
         qed
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = map1 (g C f) D (ΦH (g, f) D map0 (srcC f))"
         unfolding map0_def map1_def
         using f g fg D.comp_assoc by simp
       finally show "(map0 (trgC g) D ΦF (g, f)) D
                     𝖺D[map0 (trgC g), F g, F f] D
                     (map1 g D F f) D
                     D.inv 𝖺D[H g, map0 (srcC g), F f] D
                     (H g D map1 f) D
                     𝖺D[H g, H f, map0 (srcC f)]
                       = map1 (g C f) D (ΦH (g, f) D map0 (srcC f))"
         using D.comp_assoc by simp
     qed
   qed

   lemma is_pseudonatural_transformation:
   shows "pseudonatural_transformation
            VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF H ΦH map0 map1"
     ..

  end

  subsection "Whiskering of Pseudonatural Transformations"

  text ‹
    Similarly to ordinary natural transformations, pseudonatural transformations can be whiskered
    with pseudofunctors on the left and the right.
  ›

  locale pseudonatural_transformation_whisker_right =
    B: bicategory VB HB 𝖺B 𝗂B srcB trgB +
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    τ.F: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF +
    τ.G: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG +
    H: pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC H ΦH +
    τ: pseudonatural_transformation
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
  for VB :: "'b comp"                   (infixr "B" 55)
  and HB :: "'b comp"                   (infixr "B" 53)
  and 𝖺B :: "'b  'b  'b  'b"       ("𝖺B[_, _, _]")
  and 𝗂B :: "'b  'b"                   ("𝗂B[_]")
  and srcB :: "'b  'b"
  and trgB :: "'b  'b"
  and VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'c  'd"
  and ΦF :: "'c * 'c  'd"
  and G :: "'c  'd"
  and ΦG :: "'c * 'c  'd"
  and H :: "'b  'c"
  and ΦH :: "'b * 'b  'c"
  and τ0 :: "'c  'd"
  and τ1 :: "'c  'd"
  begin

    interpretation FoH: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH F ΦF
      ..
    interpretation GoH: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH G ΦG
      ..

    definition map0
    where "map0 a = τ0 (H.map0 a)"

    definition map1
    where "map1 f = τ1 (H f)"

    sublocale pseudonatural_transformation VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          F o H FoH.cmp G o H GoH.cmp map0 map1
    proof
      show "a. B.obj a  D.ide (map0 a)"
        using map0_def by simp
      show "a. B.obj a  «map0 a : srcD ((F  H) a) D srcD ((G  H) a)»"
        using map0_def τ.map0_in_hhom B.obj_simps C.obj_simps by simp
      show "f. B.ide f  D.iso (map1 f)"
        using map1_def τ.iso_map1_ide by simp
      show "f. B.ide f 
                   «map1 f : (G  H) f D map0 (srcB f) D map0 (trgB f) D (F  H) f»"
        using map0_def map1_def by auto
      show "μ. B.arr μ 
                   map1 (B.cod μ) D ((G  H) μ D map0 (srcB μ)) =
                   (map0 (trgB μ) D (F  H) μ) D map1 (B.dom μ)"
        unfolding map0_def map1_def
        using τ.naturality by force
      show "a. B.obj a 
                  (map0 a D FoH.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]
                     = map1 a D (GoH.unit a D map0 a)"
      proof -
        fix a
        assume a: "B.obj a"
        have "map1 a D (GoH.unit a D map0 a) =
              τ1 (H a) D (G (H.unit a) D τ.G.unit (H.map0 a) D τ0 (H.map0 a))"
          unfolding map0_def map1_def
          using a GoH.unit_char' by simp
        also have "... = (τ1 (H a) D (G (H.unit a) D τ0 (H.map0 a))) D
                         (τ.G.unit (H.map0 a) D τ0 (H.map0 a))"
          using a D.whisker_right D.comp_assoc by simp
        also have "... = (τ0 (H.map0 a) D F (H.unit a)) D τ1 (H.map0 a) D
                         (τ.G.unit (H.map0 a) D τ0 (H.map0 a))"
          using a τ.naturality [of "H.unit a"] D.comp_assoc by simp
        also have "... = ((τ0 (H.map0 a) D F (H.unit a)) D
                          (τ0 (H.map0 a) D τ.F.unit (H.map0 a))) D
                         𝗋D-1[τ0 (H.map0 a)] D 𝗅D[τ0 (H.map0 a)]"
          using a τ.respects_unit D.comp_assoc by simp
        also have "... = (τ0 (H.map0 a) D F (H.unit a) D τ.F.unit (H.map0 a)) D
                         𝗋D-1[τ0 (H.map0 a)] D 𝗅D[τ0 (H.map0 a)]"
          using a D.whisker_left by simp
        also have "... = (map0 a D FoH.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]"
          unfolding map0_def map1_def
          using a FoH.unit_char' by simp
        finally show "(map0 a D FoH.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]
                        = map1 a D (GoH.unit a D map0 a)"
          by simp
      qed
      show "f g. B.ide f; B.ide g; srcB g = trgB f 
                    (map0 (trgB g) D FoH.cmp (g, f)) D
                    𝖺D[map0 (trgB g), (F  H) g, (F  H) f] D
                    (map1 g D (F  H) f) D
                    D.inv 𝖺D[(G  H) g, map0 (srcB g), (F  H) f] D
                    ((G  H) g D map1 f) D
                    𝖺D[(G  H) g, (G  H) f, map0 (srcB f)]
                      = map1 (g B f) D (GoH.cmp (g, f) D map0 (srcB f))"
      proof -
        fix f g
        assume f: "B.ide f" and g: "B.ide g" and fg: "srcB g = trgB f"
        have "map1 (g B f) D (GoH.cmp (g, f) D map0 (srcB f))
                = τ1 (H (g B f)) D
                  (G (H (g B f)) D G (ΦH (g, f)) D ΦG (H g, H f) D τ0 (srcC (H f)))"
          unfolding map0_def map1_def
          using f g fg GoH.cmp_def B.VV.arr_charSbC B.VV.dom_charSbC by simp
        also have "... = (τ1 (H (g B f)) D
                         (G (H (g B f)) D τ0 (srcC (H f)))) D
                         (G (ΦH (g, f)) D τ0 (srcC (H f))) D
                         (ΦG (H g, H f) D τ0 (srcC (H f)))"
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC H.FF_def
                C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC D.whisker_right
                D.comp_assoc
          by simp
        also have "... = (τ0 (trgC (H g)) D F (H (g B f))) D
                         (τ1 (H (g B f)) D
                         (G (ΦH (g, f)) D τ0 (srcC (H f)))) D
                         (ΦG (H g, H f) D τ0 (srcC (H f)))"
          using f g fg τ.naturality [of "H (g B f)"] D.comp_assoc by auto
        also have "... = (τ0 (trgC (H g)) D F (H (g B f))) D
                         (τ0 (trgC (H g)) D F (ΦH (g, f))) D
                         τ1 (H g C H f) D
                         (ΦG (H g, H f) D τ0 (srcC (H f)))"
          using f g fg τ.naturality [of "ΦH (g, f)"] D.comp_assoc by fastforce
        also have "... = (τ0 (trgC (H g)) D F (H (g B f))) D
                         (τ0 (trgC (H g)) D F (ΦH (g, f))) D
                         (τ0 (trgC (H g)) D ΦF (H g, H f)) D
                         𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                         (τ1 (H g) D F (H f)) D
                         D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                         (G (H g) D τ1 (H f)) D
                         𝖺D[G (H g), G (H f), τ0 (srcC (H f))] D
                         (D.inv (ΦG (H g, H f) D τ0 (srcC (H f))) D
                         (ΦG (H g, H f) D τ0 (srcC (H f))))"
        proof -
          have "τ1 (H g C H f) = (τ0 (trgC (H g)) D ΦF (H g, H f)) D
                                 𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                                 (τ1 (H g) D F (H f)) D
                                 D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                                 (G (H g) D τ1 (H f)) D
                                 𝖺D[G (H g), G (H f), τ0 (srcC (H f))] D
                                 D.inv (ΦG (H g, H f) D τ0 (srcC (H f)))"
          proof -
            have "τ1 (H g C H f) D (ΦG (H g, H f) D τ0 (srcC (H f)))
                    = (τ0 (trgC (H g)) D ΦF (H g, H f)) D
                      𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                      (τ1 (H g) D F (H f)) D
                      D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                      (G (H g) D τ1 (H f)) D
                      𝖺D[G (H g), G (H f), τ0 (srcC (H f))]"
              using f g fg τ.respects_hcomp [of "H f" "H g"] by simp
            moreover have "D.seq (τ0 (trgC (H g)) D ΦF (H g, H f))
                                 (𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                                 (τ1 (H g) D F (H f)) D
                                 D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                                 (G (H g) D τ1 (H f)) D
                                 𝖺D[G (H g), G (H f), τ0 (srcC (H f))])"
              using f g fg C.obj_simps C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC τ.F.FF_def
              by simp
            moreover have "D.iso (ΦG (H g, H f) D τ0 (srcC (H f)))"
              using f g fg τ.G.cmp_components_are_iso [of "H g" "H f"] by simp
            ultimately
            have "τ1 (H g C H f) = ((τ0 (trgC (H g)) D ΦF (H g, H f)) D
                                   𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                                   (τ1 (H g) D F (H f)) D
                                   D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                                   (G (H g) D τ1 (H f)) D
                                   𝖺D[G (H g), G (H f), τ0 (srcC (H f))]) D
                                   D.inv (ΦG (H g, H f) D τ0 (srcC (H f)))"
            using D.invert_side_of_triangle(2) by blast
            thus ?thesis
              using D.comp_assoc by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0 (trgC (H g)) D F (H (g B f))) D
                         (τ0 (trgC (H g)) D F (ΦH (g, f))) D
                         (τ0 (trgC (H g)) D ΦF (H g, H f)) D
                         𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                         (τ1 (H g) D F (H f)) D
                         D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                         (G (H g) D τ1 (H f)) D
                         𝖺D[G (H g), G (H f), τ0 (srcC (H f))]"
        proof -
          have "(D.inv (ΦG (H g, H f) D τ0 (srcC (H f))) D
                (ΦG (H g, H f) D τ0 (srcC (H f))))
                  = (G (H g) D G (H f)) D τ0 (srcC (H f))"
          proof -
            have "(D.inv (ΦG (H g, H f) D τ0 (srcC (H f))) D
                  (ΦG (H g, H f) D τ0 (srcC (H f))))
                    = (D.inv (ΦG (H g, H f)) D τ0 (srcC (H f))) D
                      (ΦG (H g, H f) D τ0 (srcC (H f)))"
              using f g fg by simp
            also have "... = D.inv (ΦG (H g, H f)) D ΦG (H g, H f) D τ0 (srcC (H f))"
              using f g fg D.whisker_right C.VV.arr_charSbC by simp
            also have "... = (G (H g) D G (H f)) D τ0 (srcC (H f))"
              using f g fg D.comp_inv_arr' τ.G.cmp_components_are_iso by simp
            finally show ?thesis by blast
          qed
          moreover have "𝖺D[G (H g), G (H f), τ0 (srcC (H f))] D ...
                           = 𝖺D[G (H g), G (H f), τ0 (srcC (H f))]"
            using f g fg D.comp_arr_dom by simp
          ultimately show ?thesis by simp
        qed
        also have "... = (τ0 (trgC (H g)) D F (H (g B f)) D
                                            F (ΦH (g, f)) D
                                            ΦF (H g, H f)) D
                         𝖺D[τ0 (trgC (H g)), F (H g), F (H f)] D
                         (τ1 (H g) D F (H f)) D
                         D.inv 𝖺D[G (H g), τ0 (srcC (H g)), F (H f)] D
                         (G (H g) D τ1 (H f)) D
                         𝖺D[G (H g), G (H f), τ0 (srcC (H f))]"
          using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC H.FF_def
                D.whisker_left C.VV.arr_charSbC B.VV.arr_charSbC D.comp_assoc
          by auto
        also have "... = (map0 (trgB g) D FoH.cmp (g, f)) D
                         𝖺D[map0 (trgB g), (F  H) g, (F  H) f] D
                         (map1 g D (F  H) f) D
                         D.inv 𝖺D[(G  H) g, map0 (srcB g), (F  H) f] D
                         ((G  H) g D map1 f) D
                         𝖺D[(G  H) g, (G  H) f, map0 (srcB f)]"
          unfolding map0_def map1_def
          using f g fg FoH.cmp_def B.VV.arr_charSbC B.VV.dom_charSbC by simp
        finally show "(map0 (trgB g) D FoH.cmp (g, f)) D
                      𝖺D[map0 (trgB g), (F  H) g, (F  H) f] D
                      (map1 g D (F  H) f) D
                      D.inv 𝖺D[(G  H) g, map0 (srcB g), (F  H) f] D
                      ((G  H) g D map1 f) D
                      𝖺D[(G  H) g, (G  H) f, map0 (srcB f)]
                        = map1 (g B f) D (GoH.cmp (g, f) D map0 (srcB f))"
          by simp
      qed
    qed

    lemma is_pseudonatural_transformation:
    shows "pseudonatural_transformation VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          (F o H) FoH.cmp (G o H) GoH.cmp map0 map1"
      ..

  end

  locale pseudonatural_transformation_whisker_left =
    B: bicategory VB HB 𝖺B 𝗂B srcB trgB +
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    τ.F: pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF +
    τ.G: pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG +
    H: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH +
    τ: pseudonatural_transformation
         VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
  for VB :: "'b comp"                   (infixr "B" 55)
  and HB :: "'b comp"                   (infixr "B" 53)
  and 𝖺B :: "'b  'b  'b  'b"       ("𝖺B[_, _, _]")
  and 𝗂B :: "'b  'b"                   ("𝗂B[_]")
  and srcB :: "'b  'b"
  and trgB :: "'b  'b"
  and VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'b  'c"
  and ΦF :: "'b * 'b  'c"
  and G :: "'b  'c"
  and ΦG :: "'b * 'b  'c"
  and H :: "'c  'd"
  and ΦH :: "'c * 'c  'd"
  and τ0 :: "'b  'c"
  and τ1 :: "'b  'c"
  begin

    interpretation HoF: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF H ΦH
      ..
    interpretation HoG: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG H ΦH
      ..

    definition map0
    where "map0 a = H (τ0 a)"

    definition map1
    where "map1 f = D.inv (ΦH (τ0 (trgB f), F f)) D H (τ1 f) D ΦH (G f, τ0 (srcB f))"

    sublocale pseudonatural_transformation VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                HoF.map HoF.cmp HoG.map HoG.cmp map0 map1
    proof
      show "a. B.obj a  D.ide (map0 a)"
        using map0_def by simp
      show "f. B.ide f  D.iso (map1 f)"
      proof -
        fix f
        assume f: "B.ide f"
        have "D.seq (H (τ1 f)) (ΦH (G f, τ0 (srcB f)))"
          using f by (intro D.seqI) auto
        moreover have "D.seq (D.inv (ΦH (τ0 (trgB f), F f)))
                             (H (τ1 f) D ΦH (G f, τ0 (srcB f)))"
          using f τ.map1_in_hom [of f] calculation by (intro D.seqI) auto
        ultimately show "D.iso (map1 f)"
          using f map1_def H.preserves_iso τ.iso_map1_ide H.cmp_components_are_iso
                C.VV.arr_charSbC D.isos_compose
          by auto
      qed
      show "a. B.obj a  «map0 a : srcD ((H  F) a) D srcD ((H  G) a)»"
        using map0_def by fastforce
      show "f. B.ide f 
                   «map1 f : (H  G) f D map0 (srcB f) D map0 (trgB f) D (H  F) f»"
        using map0_def map1_def by fastforce
      show "μ. B.arr μ 
                   map1 (B.cod μ) D ((H  G) μ D map0 (srcB μ))
                     = (map0 (trgB μ) D (H  F) μ) D map1 (B.dom μ)"
      proof -
        fix μ
        assume μ: "B.arr μ"
        have "(map0 (trgB μ) D (H  F) μ) D map1 (B.dom μ)
                = (H (τ0 (trgB μ)) D (H  F) μ) D
                  D.inv (ΦH (τ0 (trgB (B.dom μ)), F (B.dom μ))) D
                  H (τ1 (B.dom μ)) D ΦH (G (B.dom μ), τ0 (srcB (B.dom μ)))"
          unfolding map0_def map1_def
          using μ by simp
        also have "... = ((H (τ0 (trgB μ)) D H (F μ)) D
                         D.inv (ΦH (τ0 (trgB μ), F (B.dom μ)))) D
                H (τ1 (B.dom μ)) D ΦH (G (B.dom μ), τ0 (srcB μ))"
          using μ D.comp_assoc by simp
        also have "... = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D
                         (H (τ0 (trgB μ) C F μ) D
                         H (τ1 (B.dom μ))) D
                         ΦH (G (B.dom μ), τ0 (srcB (B.dom μ)))"
        proof -
          have "ΦH (τ0 (trgB μ), F (B.cod μ)) D (H (τ0 (trgB μ)) D H (F μ))
                  = H (τ0 (trgB μ) C F μ) D ΦH (τ0 (trgB μ), F (B.dom μ))"
            using μ H.Φ.naturality [of "(τ0 (trgB μ), F μ)"]
                  C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
            by simp
          moreover have "D.seq (ΦH (τ0 (trgB μ), F (B.cod μ))) (H (τ0 (trgB μ)) D H (F μ))"
            using μ
            by (intro D.seqI D.hseqI') auto
          moreover have "D.iso (ΦH (τ0 (trgB μ), F (B.cod μ)))"
            using μ H.cmp_components_are_iso by simp
          moreover have "D.iso (ΦH (τ0 (trgB μ), F (B.dom μ)))"
            using μ H.cmp_components_are_iso by simp
          ultimately
          have "(H (τ0 (trgB μ)) D H (F μ)) D D.inv (ΦH (τ0 (trgB μ), F (B.dom μ)))
                = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D H (τ0 (trgB μ) C F μ)"
            using μ H.cmp_components_are_iso C.VV.arr_charSbC D.invert_opposite_sides_of_square
            by blast
          thus ?thesis
            using μ D.comp_assoc by simp
        qed
        also have "... = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D
                         H ((τ0 (trgB μ) C F μ) C τ1 (B.dom μ)) D
                         ΦH (G (B.dom μ), τ0 (srcB (B.dom μ)))"
          using μ by simp
        also have "... = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D
                         H (τ1 (B.cod μ) C (G μ C τ0 (srcB μ))) D
                         ΦH (G (B.dom μ), τ0 (srcB (B.dom μ)))"
          using μ τ.naturality by simp
        also have "... = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D
                         H (τ1 (B.cod μ)) D
                         H (G μ C τ0 (srcB μ)) D
                         ΦH (G (B.dom μ), τ0 (srcB (B.dom μ)))"
          using μ D.comp_assoc by simp
        also have "... = D.inv (ΦH (τ0 (trgB μ), F (B.cod μ))) D
                         H (τ1 (B.cod μ)) D
                         ΦH (G (B.cod μ), τ0 (srcB (B.cod μ))) D
                         (H (G μ) D H (τ0 (srcB μ)))"
          using μ H.Φ.naturality [of "(G μ, τ0 (srcB μ))"]
                C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
          by force
        also have "... = map1 (B.cod μ) D ((H  G) μ D map0 (srcB μ))"
          unfolding map0_def map1_def
          using μ D.comp_assoc by simp
        finally show "map1 (B.cod μ) D ((H  G) μ D map0 (srcB μ))
                        = (map0 (trgB μ) D (H  F) μ) D map1 (B.dom μ)"
          by simp
      qed
      show "a. B.obj a  (map0 a D HoF.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]
                               = map1 a D (HoG.unit a D map0 a)"
      proof -
        fix a
        assume a: "B.obj a"
        have "map1 a D (HoG.unit a D map0 a)
                = D.inv (ΦH (τ0 a, F a)) D
                  H (τ1 a) D
                  ΦH (G a, τ0 a) D
                  (H (τ.G.unit a) D H.unit (τ.G.map0 a) D H (τ0 a))"
          unfolding map0_def map1_def
          using a HoG.unit_char' D.comp_assoc by auto
        also have "... = D.inv (ΦH (τ0 a, F a)) D
                         H (τ1 a) D
                         (ΦH (G a, τ0 a) D
                         (H (τ.G.unit a) D H (τ0 a))) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
          using a D.whisker_right D.comp_assoc by simp
        also have "... = D.inv (ΦH (τ0 a, F a)) D
                         (H (τ1 a) D
                         H (τ.G.unit a C τ0 a)) D
                         ΦH (τ.G.map0 a, τ0 a) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
          using a H.Φ.naturality [of "(τ.G.unit a, τ0 a)"] D.comp_assoc
                C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
          by auto
        also have "... = D.inv (ΦH (τ0 a, F a)) D
                         H (τ1 a C (τ.G.unit a C τ0 a)) D
                         ΦH (τ.G.map0 a, τ0 a) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
        proof -
          have "C.arr (τ1 a C (τ.G.unit a C τ0 a))"
            using a by force
         hence "H (τ1 a) D H (τ.G.unit a C τ0 a) = H (τ1 a C (τ.G.unit a C τ0 a))"
            using a by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = D.inv (ΦH (τ0 a, F a)) D
                         H ((τ0 a C τ.F.unit a) C 𝗋C-1[τ0 a] C 𝗅C[τ0 a]) D
                         ΦH (τ.G.map0 a, τ0 a) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
          using a τ.respects_unit by simp
        also have "... = (D.inv (ΦH (τ0 a, F a)) D
                         H (τ0 a C τ.F.unit a)) D
                         H (𝗋C-1[τ0 a]) D
                         H (𝗅C[τ0 a]) D
                         ΦH (τ.G.map0 a, τ0 a) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
          using a D.comp_assoc B.obj_simps by simp
        also have "... = (H (τ0 a) D H (τ.F.unit a)) D
                         (D.inv (ΦH (τ0 a, τ.F.map0 a)) D
                         H (𝗋C-1[τ0 a])) D
                         H (𝗅C[τ0 a]) D
                         ΦH (τ.G.map0 a, τ0 a) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
        proof -
          have "D.inv (ΦH (τ0 a, F a)) D H (τ0 a C τ.F.unit a)
                  = (H (τ0 a) D H (τ.F.unit a)) D D.inv (ΦH (τ0 a, τ.F.map0 a))"
          proof -
            have "D.seq (H (τ0 a C τ.F.unit a)) (ΦH (τ0 a, τ.F.map0 a))"
              using a C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC C.obj_simps by auto
            moreover have "D.iso (ΦH (τ0 a, F a))  D.iso (ΦH (τ0 a, τ.F.map0 a))"
            proof -
              have "C.ide (F a)  srcC (τ0 a) = trgC (F a)  srcC (τ0 a) = trgC (τ.F.map0 a)"
                using a by auto
              moreover have "C.ide (τ.F.map0 a)"
              proof -
                (* TODO: I still haven't been able to configure the simps to do this. *)
                have "C.obj (τ.F.map0 a)"
                  using a by simp
                thus ?thesis by auto
              qed
              ultimately show ?thesis
                using a H.cmp_components_are_iso B.obj_simps by auto
            qed
            ultimately show ?thesis
              using a H.Φ.naturality [of "(τ0 a, τ.F.unit a)"]
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
                    D.invert_opposite_sides_of_square
                      [of "ΦH (τ0 a, F a)" "H (τ0 a) D H (τ.F.unit a)"
                          "H (τ0 a C τ.F.unit a)" "ΦH (τ0 a, τ.F.map0 a)"]
              by auto
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 a) D H (τ.F.unit a)) D
                         (H (τ0 a) D H.unit (τ.F.map0 a)) D
                         𝗋D-1[H (τ0 a)] D
                         (H (𝗅C[τ0 a]) D
                         ΦH (τ.G.map0 a, τ0 a)) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
        proof -
          have "D.inv (ΦH (τ0 a, τ.F.map0 a)) D H (𝗋C-1[τ0 a])
                  = (H (τ0 a) D H.unit (τ.F.map0 a)) D 𝗋D-1[H (τ0 a)]"
            using a H.preserves_runit(2) [of "τ0 a"] D.comp_assoc
            by (metis C.ideD(1) C.runit'_simps(1) C.src.preserves_ide C.trg_src
                D.invert_side_of_triangle(1) τ.F.map0_def H.cmp_components_are_iso
                H.preserves_reflects_arr τ.ide_map0_obj τ.map0_simps(2))
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 a) D H (τ.F.unit a)) D
                         (H (τ0 a) D H.unit (τ.F.map0 a)) D
                         𝗋D-1[H (τ0 a)] D
                         𝗅D[H (τ0 a)] D
                         (D.inv (H.unit (τ.G.map0 a)) D H (τ0 a)) D
                         (H.unit (τ.G.map0 a) D H (τ0 a))"
        proof -
          have "H (𝗅C[τ0 a]) D ΦH (τ.G.map0 a, τ0 a)
                  = 𝗅D[H (τ0 a)] D (D.inv (H.unit (τ.G.map0 a)) D H (τ0 a)) D
                    D.inv (ΦH (τ.G.map0 a, τ0 a)) D ΦH (τ.G.map0 a, τ0 a)"
            using a H.preserves_lunit(1) D.comp_assoc by auto
          also have "... = 𝗅D[H (τ0 a)] D (D.inv (H.unit (τ.G.map0 a)) D H (τ0 a))"
          proof - 
            have "D.inv (ΦH (τ.G.map0 a, τ0 a)) D ΦH (τ.G.map0 a, τ0 a)
                    = H (τ.G.map0 a) D H (τ0 a)"
              using a H.cmp_components_are_iso D.comp_inv_arr'
              by (metis C.isomorphic_implies_hpar(1) τ.G.map0_simps(2) τ.G.weakly_preserves_objects
                  H.cmp_simps(4) τ.ide_map0_obj τ.map0_simps(3))
            moreover have "(D.inv (H.unit (τ.G.map0 a)) D H (τ0 a)) D
                           (H (τ.G.map0 a) D H (τ0 a))
                             = (D.inv (H.unit (τ.G.map0 a)) D H (τ0 a))"
              using a H.unit_char(2) D.comp_arr_dom
              by (metis D.arr_inv D.dom_inv D.whisker_right τ.G.map0_simps(1) H.unit_simps(5)
                  H.preserves_ide τ.ide_map0_obj)
            ultimately show ?thesis by simp
          qed
          finally have "H (𝗅C[τ0 a]) D ΦH (τ.G.map0 a, τ0 a)
                          = 𝗅D[H (τ0 a)] D (D.inv (H.unit (τ.G.map0 a)) D H (τ0 a))"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((H (τ0 a) D H (τ.F.unit a)) D
                         (H (τ0 a) D H.unit (τ.F.map0 a))) D
                         𝗋D-1[H (τ0 a)] D
                         𝗅D[H (τ0 a)]"
        proof -
          have "(D.inv (H.unit (τ.G.map0 a)) D H (τ0 a)) D
                (H.unit (τ.G.map0 a) D H (τ0 a))
                  = D.inv (H.unit (τ.G.map0 a)) D H.unit (τ.G.map0 a) D H (τ0 a)"
            using a D.whisker_right H.unit_char(2) by simp
          also have "... = H.map0 (τ.G.map0 a) D H (τ0 a)"
            using a H.unit_char(1-2) [of "τ.G.map0 a"] D.comp_inv_arr' by simp
          finally have "(D.inv (H.unit (τ.G.map0 a)) D H (τ0 a)) D
                        (H.unit (τ.G.map0 a) D H (τ0 a))
                          = H.map0 (τ.G.map0 a) D H (τ0 a)"
            by blast
          moreover have "𝗅D[H (τ0 a)] D (H.map0 (τ.G.map0 a) D H (τ0 a)) = 𝗅D[H (τ0 a)]"
            using a D.comp_arr_dom [of "𝗅D[H (τ0 a)]" "H.map0 (τ.G.map0 a) D H (τ0 a)"]
            by auto
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 a) D HoF.unit a) D 𝗋D-1[H (τ0 a)] D 𝗅D[H (τ0 a)]"
          using a HoF.unit_char' D.whisker_left [of "H (τ0 a)"] by simp
        also have "... = (map0 a D HoF.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a]"
          unfolding map0_def by simp
        finally show "(map0 a D HoF.unit a) D 𝗋D-1[map0 a] D 𝗅D[map0 a] =
                      map1 a D (HoG.unit a D map0 a)"
          by simp
      qed
      show "f g. B.ide f; B.ide g; srcB g = trgB f 
                    (map0 (trgB g) D HoF.cmp (g, f)) D
                    𝖺D[map0 (trgB g), (H  F) g, (H  F) f] D
                    (map1 g D (H  F) f) D
                    D.inv 𝖺D[(H  G) g, map0 (srcB g), (H  F) f] D
                    ((H  G) g D map1 f) D 𝖺D[(H  G) g, (H  G) f, map0 (srcB f)]
                      = map1 (g B f) D (HoG.cmp (g, f) D map0 (srcB f))"
      proof -
        fix f g 
        assume f: "B.ide f" and g: "B.ide g" and fg: "srcB g = trgB f"
        have "map1 (g B f) D (HoG.cmp (g, f) D map0 (srcB f))
                = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                  H (τ1 (g B f)) D
                  ΦH (G (g B f), τ0 (srcB f)) D
                  (H (G (g B f)) D
                  H (ΦG (g, f)) D
                  ΦH (G g, G f) D H (τ0 (srcB f)))"
          unfolding map0_def map1_def HoG.cmp_def
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC D.comp_assoc by simp
        also have "... = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         H (τ1 (g B f)) D
                         ΦH (G (g B f), τ0 (srcB f)) D
                         ((H (G (g B f)) D H (τ0 (srcB f))) D
                         (H (ΦG (g, f)) D H (τ0 (srcB f)))) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC
                C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC τ.G.FF_def
                D.comp_assoc D.whisker_right
          by auto
        also have "... = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         H (τ1 (g B f)) D
                         (ΦH (G (g B f), τ0 (srcB f)) D
                         (H (ΦG (g, f)) D H (τ0 (srcB f)))) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "(H (G (g B f)) D H (τ0 (srcB f))) D (H (ΦG (g, f)) D H (τ0 (srcB f)))
                  = H (G (g B f)) D H (ΦG (g, f)) D H (τ0 (srcB f))"
            using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC D.whisker_right
            by simp
          also have "... = H (ΦG (g, f)) D H (τ0 (srcB f))"
            using f g fg D.comp_cod_arr [of "H (ΦG (g, f))" "H (G (g B f))"]
                  B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC
            by simp
          finally have "(H (G (g B f)) D H (τ0 (srcB f))) D
                        (H (ΦG (g, f)) D H (τ0 (srcB f)))
                          = H (ΦG (g, f)) D H (τ0 (srcB f))"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         (H (τ1 (g B f)) D
                         H (ΦG (g, f) C τ0 (srcB f))) D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
          using f g fg H.Φ.naturality [of "(ΦG (g, f), τ0 (srcB f))"]
                B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC τ.G.FF_def
                C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
                D.comp_assoc
          by simp
        also have "... = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         H (τ1 (g B f) C (ΦG (g, f) C τ0 (srcB f))) D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC D.comp_assoc by simp
        also have "... = D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         H ((τ0 (trgB g) C ΦF (g, f)) C
                            𝖺C[τ0 (trgB g), F g, F f] C
                            (τ1 g C F f) C
                            𝖺C-1[G g, τ0 (srcB g), F f] C
                            (G g C τ1 f) C
                            𝖺C[G g, G f, τ0 (srcB f)]) D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
          using f g fg τ.respects_hcomp by simp
        also have "... = (D.inv (ΦH (τ0 (trgB g), F (g B f))) D
                         H (τ0 (trgB g) C ΦF (g, f))) D
                         H 𝖺C[τ0 (trgB g), F g, F f] D
                         H (τ1 g C F f) D
                         H (𝖺C-1[G g, τ0 (srcB g), F f]) D
                         H (G g C τ1 f) D
                         H 𝖺C[G g, G f, τ0 (srcB f)] D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC τ.F.FF_def D.comp_assoc
          by simp
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (D.inv (ΦH (τ0 (trgB g), F g C F f)) D
                         H 𝖺C[τ0 (trgB g), F g, F f]) D
                         H (τ1 g C F f) D
                         H (𝖺C-1[G g, τ0 (srcB g), F f]) D
                         H (G g C τ1 f) D
                         H 𝖺C[G g, G f, τ0 (srcB f)] D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (τ0 (trgB g), F (g B f))) D H (τ0 (trgB g) C ΦF (g, f))
                  = (H (τ0 (trgB g)) D H (ΦF (g, f))) D D.inv (ΦH (τ0 (trgB g), F g C F f))"
          proof -
            have "ΦH (τ0 (trgB g), F (g B f)) D (H (τ0 (trgB g)) D H (ΦF (g, f))) =
                  H (τ0 (trgB g) C ΦF (g, f)) D ΦH (τ0 (trgB g), F g C F f)"
              using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC τ.F.FF_def H.FF_def
                    H.Φ.naturality [of "(τ0 (trgB g), ΦF (g, f))"]
              by auto
            moreover have "D.seq (ΦH (τ0 (trgB g), F (g B f))) (H (τ0 (trgB g)) D H (ΦF (g, f)))"
              using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
              by auto
            moreover have "D.iso (ΦH (τ0 (trgB g), F (g B f))) 
                           D.iso (ΦH (τ0 (trgB g), F g C F f))"
              using f g fg H.cmp_components_are_iso by simp
            ultimately show ?thesis
            using f g fg D.invert_opposite_sides_of_square by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (D.inv (ΦH (τ0 (trgB g) C F g, F f)) D
                         H (τ1 g C F f)) D
                         H (𝖺C-1[G g, τ0 (srcB g), F f]) D
                         H (G g C τ1 f) D
                         H 𝖺C[G g, G f, τ0 (srcB f)] D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (τ0 (trgB g), F g C F f)) D H 𝖺C[τ0 (trgB g), F g, F f]
                  = (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                    𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                    (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                    D.inv (ΦH (τ0 (trgB g) C F g, F f))"
          proof -
            have "D.inv (ΦH (τ0 (trgB g), F g C F f)) D H 𝖺C[τ0 (trgB g), F g, F f]
                    = ((D.inv (ΦH (τ0 (trgB g), F g C F f)) D
                      ΦH (τ0 (trgB g), F g C F f)) D
                      (H (τ0 (trgB g)) D ΦH (F g, F f))) D
                      𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                      (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                      D.inv (ΦH (τ0 (trgB g) C F g, F f))"
              using f g fg H.preserves_assoc(1) D.comp_assoc by simp
            also have "... = ((H (τ0 (trgB g)) D H (F g C F f)) D
                             (H (τ0 (trgB g)) D ΦH (F g, F f))) D
                             𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                             (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                             D.inv (ΦH (τ0 (trgB g) C F g, F f))"
              using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC
                    H.FF_def D.comp_assoc D.comp_inv_arr' H.cmp_components_are_iso
              by simp
            also have "... = (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                             𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                             (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                             D.inv (ΦH (τ0 (trgB g) C F g, F f))"
              using f g fg C.VV.arr_charSbC H.cmp_simps(5) D.comp_cod_arr D.comp_assoc by auto
            finally show ?thesis by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (D.inv (ΦH (G g C τ0 (srcB g), F f)) D
                         H (𝖺C-1[G g, τ0 (srcB g), F f])) D
                         H (G g C τ1 f) D
                         H 𝖺C[G g, G f, τ0 (srcB f)] D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (τ0 (trgB g) C F g, F f)) D H (τ1 g C F f)
                  = (H (τ1 g) D H (F f)) D D.inv (ΦH (G g C τ0 (srcB g), F f))"
          proof -
            have "ΦH (τ0 (trgB g) C F g, F f) D (H (τ1 g) D H (F f))
                    = H (τ1 g C F f) D ΦH (G g C τ0 (srcB g), F f)"
              using f g fg H.Φ.naturality [of "(τ1 g, F f)"]
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
              by simp
            moreover have "D.seq (ΦH (τ0 (trgB g) C F g, F f))
                                 (H (τ1 g) D H (F f))"
              using f g fg by fastforce
            moreover have "D.iso (ΦH (τ0 (trgB g) C F g, F f)) 
                           D.iso (ΦH (G g C τ0 (srcB g), F f))"
              using f g fg H.cmp_components_are_iso by simp
            ultimately show ?thesis
              using f g fg D.invert_opposite_sides_of_square by metis
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (ΦH (G g, τ0 (srcB g)) D H (F f)) D
                         𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                         (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                         (D.inv (ΦH (G g, τ0 (srcB g) C F f)) D
                         H (G g C τ1 f)) D
                         H 𝖺C[G g, G f, τ0 (srcB f)] D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (G g C τ0 (srcB g), F f)) D H (𝖺C-1[G g, τ0 (srcB g), F f])
                  = (ΦH (G g, τ0 (srcB g)) D H (F f)) D
                    𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                    (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                    D.inv (ΦH (G g, τ0 (srcB g) C F f))"
          proof -
            have "D.inv (ΦH (G g C τ0 (srcB g), F f)) D H (𝖺C-1[G g, τ0 (srcB g), F f])
                    = ((D.inv (ΦH (G g C τ0 (srcB g), F f)) D
                      ΦH (G g C τ0 (srcB g), F f)) D
                      (ΦH (G g, τ0 (srcB g)) D H (F f))) D
                      𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                      (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                      D.inv (ΦH (G g, τ0 (srcB g) C F f))"
              using f g fg H.preserves_assoc(2) D.comp_assoc by simp
            also have "... = (ΦH (G g, τ0 (srcB g)) D H (F f)) D
                             𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                             (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                             D.inv (ΦH (G g, τ0 (srcB g) C F f))"
            proof -
              have "D.inv (ΦH (G g C τ0 (srcB g), F f)) D ΦH (G g C τ0 (srcB g), F f)
                      = H (G g C τ0 (srcB g)) D H (F f)"
                using f g fg H.cmp_components_are_iso D.comp_inv_arr' H.FF_def
                      C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                by simp
              moreover have "(H (G g C τ0 (srcB g)) D H (F f)) D (ΦH (G g, τ0 (srcB g)) D H (F f))
                               = (ΦH (G g, τ0 (srcB g)) D H (F f))"
                using f g fg D.comp_cod_arr C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                by simp
              ultimately show ?thesis by simp
            qed
            finally show ?thesis by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (ΦH (G g, τ0 (srcB g)) D H (F f)) D
                         𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                         (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                         (H (G g) D H (τ1 f)) D
                         (D.inv (ΦH (G g, G f C τ0 (srcB f))) D
                         H 𝖺C[G g, G f, τ0 (srcB f)]) D
                         ΦH (G g C G f, τ0 (srcB f)) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (G g, τ0 (srcB g) C F f)) D H (G g C τ1 f)
                  = (H (G g) D H (τ1 f)) D D.inv (ΦH (G g, G f C τ0 (srcB f)))"
          proof -
            have "ΦH (G g, τ0 (trgB f) C F f) D (H (G g) D H (τ1 f))
                    = H (G g C τ1 f) D ΦH (G g, G f C τ0 (srcB f))"
              using f g fg H.Φ.naturality [of "(G g, τ1 f)"]
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
              by simp
            thus ?thesis
              using f g fg H.cmp_components_are_iso
                    C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                    D.invert_opposite_sides_of_square
                      [of "ΦH (G g, τ0 (trgB f) C F f)" "H (G g) D H (τ1 f)"
                          "H (G g C τ1 f)" "ΦH (G g, G f C τ0 (srcB f))"]
              by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (ΦH (G g, τ0 (srcB g)) D H (F f)) D
                         𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                         (H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                         (H (G g) D H (τ1 f)) D
                         (H (G g) D ΦH (G f, τ0 (srcB f))) D
                         𝖺D[H (G g), H (G f), H (τ0 (srcB f))] D
                         (D.inv (ΦH (G g, G f)) D H (τ0 (srcB f))) D
                         (D.inv (ΦH (G g C G f, τ0 (srcB f))) D
                         ΦH (G g C G f, τ0 (srcB f))) D
                         (ΦH (G g, G f) D H (τ0 (srcB f)))"
        proof -
          have "D.inv (ΦH (G g, G f C τ0 (srcB f))) D H 𝖺C[G g, G f, τ0 (srcB f)]
                  = (H (G g) D ΦH (G f, τ0 (srcB f))) D
                    𝖺D[H (G g), H (G f), H (τ0 (srcB f))] D
                    (D.inv (ΦH (G g, G f)) D H (τ0 (srcB f))) D
                    D.inv (ΦH (G g C G f, τ0 (srcB f)))"
          proof -
            have "D.inv (ΦH (G g, G f C τ0 (srcB f))) D H 𝖺C[G g, G f, τ0 (srcB f)]
                    = ((D.inv (ΦH (G g, G f C τ0 (srcB f))) D
                      ΦH (G g, G f C τ0 (srcB f))) D
                      (H (G g) D ΦH (G f, τ0 (srcB f)))) D
                      𝖺D[H (G g), H (G f), H (τ0 (srcB f))] D
                      (D.inv (ΦH (G g, G f)) D H (τ0 (srcB f))) D
                      D.inv (ΦH (G g C G f, τ0 (srcB f)))"
              using f g fg H.preserves_assoc(1)
                    H.cmp_components_are_iso C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                    D.comp_assoc
              by simp
            moreover have "D.inv (ΦH (G g, G f C τ0 (srcB f))) D
                           ΦH (G g, G f C τ0 (srcB f))
                             = H (G g) D H (G f C τ0 (srcB f))"
              using f g fg H.cmp_components_are_iso C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                    D.comp_inv_arr' H.FF_def
              by simp
            moreover have "(H (G g) D H (G f C τ0 (srcB f))) D
                           (H (G g) D ΦH (G f, τ0 (srcB f)))
                             = H (G g) D ΦH (G f, τ0 (srcB f))"
              using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
                    D.whisker_left D.comp_cod_arr
              by simp
            ultimately show ?thesis by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f))) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         ((D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (ΦH (G g, τ0 (srcB g)) D H (F f))) D
                         𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                         ((H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                         (H (G g) D H (τ1 f)) D
                         (H (G g) D ΦH (G f, τ0 (srcB f)))) D
                         𝖺D[H (G g), H (G f), H (τ0 (srcB f))]"
        proof - 
          have "𝖺D[H (G g), H (G f), H (τ0 (srcB f))] D
                (D.inv (ΦH (G g, G f)) D H (τ0 (srcB f))) D
                (D.inv (ΦH (G g C G f, τ0 (srcB f))) D
                ΦH (G g C G f, τ0 (srcB f))) D
                (ΦH (G g, G f) D H (τ0 (srcB f)))
                  = 𝖺D[H (G g), H (G f), H (τ0 (srcB f))]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.whisker_right [of "H (τ0 (srcB f))" "D.inv (ΦH (G g, G f))" "ΦH (G g, G f)"]
                  D.comp_inv_arr' C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC H.FF_def
                  H.cmp_components_are_iso
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (H (τ0 (trgB g)) D H (F (g B f)) D
                         H (ΦF (g, f)) D
                         ΦH (F g, F f)) D
                         𝖺D[H (τ0 (trgB g)), H (F g), H (F f)] D
                         (D.inv (ΦH (τ0 (trgB g), F g)) D
                         H (τ1 g) D
                         ΦH (G g, τ0 (srcB g)) D H (F f)) D
                         𝖺D-1[H (G g), H (τ0 (srcB g)), H (F f)] D
                         (H (G g) D D.inv (ΦH (τ0 (srcB g), F f)) D
                         H (τ1 f) D
                         ΦH (G f, τ0 (srcB f))) D
                         𝖺D[H (G g), H (G f), H (τ0 (srcB f))]"
        proof -
          have "(H (G g) D D.inv (ΦH (τ0 (srcB g), F f))) D
                (H (G g) D H (τ1 f)) D
                (H (G g) D ΦH (G f, τ0 (srcB f)))
                  = H (G g) D
                      D.inv (ΦH (τ0 (srcB g), F f)) D H (τ1 f) D ΦH (G f, τ0 (srcB f))"
            using f g fg C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC D.whisker_left
                  H.cmp_components_are_iso
            by simp
          moreover have "(H (τ0 (trgB g)) D H (ΦF (g, f))) D
                         (H (τ0 (trgB g)) D ΦH (F g, F f))
                           = H (τ0 (trgB g)) D
                               H (F (g B f)) D H (ΦF (g, f)) D ΦH (F g, F f)"
          proof -
            have "(H (τ0 (trgB g)) D H (ΦF (g, f))) D (H (τ0 (trgB g)) D ΦH (F g, F f))
                    = H (τ0 (trgB g)) D H (ΦF (g, f)) D ΦH (F g, F f)"
            proof -
              have "D.arr (H (ΦF (g, f)) D ΦH (F g, F f))"
                using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC τ.F.FF_def
                by (intro D.seqI) auto
              thus ?thesis
                using f g fg D.whisker_left C.VV.arr_charSbC by simp
            qed
            also have "... = H (τ0 (trgB g)) D
                               (H (F (g B f) C ΦF (g, f))) D ΦH (F g, F f)"
              using f g fg C.comp_cod_arr B.VV.arr_charSbC τ.F.cmp_simps(5) by auto
            also have "... = H (τ0 (trgB g)) D
                               (H (F (g B f)) D H (ΦF (g, f))) D ΦH (F g, F f)"
              using f g fg B.VV.arr_charSbC τ.F.cmp_simps(5) by auto
            also have "... = H (τ0 (trgB g)) D
                               H (F (g B f)) D H (ΦF (g, f)) D ΦH (F g, F f)"
              using D.comp_assoc by simp
            finally show ?thesis by simp
          qed
          moreover have "(D.inv (ΦH (τ0 (trgB g), F g)) D H (F f)) D
                         (H (τ1 g) D H (F f)) D
                         (ΦH (G g, τ0 (srcB g)) D H (F f))
                           = D.inv (ΦH (τ0 (trgB g), F g)) D
                             H (τ1 g) D ΦH (G g, τ0 (srcB g)) D H (F f)"
            using f g fg D.whisker_right C.VV.arr_charSbC C.VV.dom_charSbC C.VV.cod_charSbC
            by simp
          ultimately show ?thesis
            by simp
        qed
        also have "... = (map0 (trgB g) D HoF.cmp (g, f)) D
                         𝖺D[map0 (trgB g), (H  F) g, (H  F) f] D
                         (map1 g D (H  F) f) D
                         D.inv 𝖺D[(H  G) g, map0 (srcB g), (H  F) f] D
                         ((H  G) g D map1 f) D 𝖺D[(H  G) g, (H  G) f, map0 (srcB f)]"
          unfolding map0_def map1_def HoF.cmp_def
          using f g fg B.VV.arr_charSbC B.VV.dom_charSbC B.VV.cod_charSbC by simp
        finally show "(map0 (trgB g) D HoF.cmp (g, f)) D
                      𝖺D[map0 (trgB g), (H  F) g, (H  F) f] D
                      (map1 g D (H  F) f) D
                      D.inv 𝖺D[(H  G) g, map0 (srcB g), (H  F) f] D
                      ((H  G) g D map1 f) D 𝖺D[(H  G) g, (H  G) f, map0 (srcB f)]
                        = map1 (g B f) D (HoG.cmp (g, f) D map0 (srcB f))"
          by simp
      qed
    qed

    lemma is_pseudonatural_transformation:
    shows "pseudonatural_transformation VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
             HoF.map HoF.cmp HoG.map HoG.cmp map0 map1"
      ..

  end

  subsection "Pseudonatural Equivalences"

  text ‹
    A \emph{pseudonatural equivalence} is a pseudonatural transformation whose components
    at objects are equivalence maps.  Pseudonatural equivalences between pseudofunctors
    generalize natural isomorphisms between ordinary functors.
  ›

  locale pseudonatural_equivalence =
    pseudonatural_transformation +
  assumes components_are_equivalences: "C.obj a  D.equivalence_map (τ0 a)"

  subsubsection "Identity Transformations are Pseudonatural Equivalences"

  sublocale identity_pseudonatural_transformation 
            pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
              F ΦF F ΦF map0 map1
    by unfold_locales (simp add: D.obj_is_equivalence_map)

  subsubsection "Composition of Pseudonatural Equivalences"

  locale composite_pseudonatural_equivalence =
    composite_pseudonatural_transformation +
    σ: pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
         F ΦF G ΦG σ0 σ1 +
    ρ: pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
         G ΦG H ΦH ρ0 ρ1
  begin

    sublocale pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
                F ΦF H ΦH map0 map1
      apply unfold_locales
      by (metis D.equivalence_maps_compose D.hcomp_in_hhomE ρ.components_are_equivalences
          σ.components_are_equivalences map0_def map0_in_hom(1))

    lemma is_pseudonatural_equivalence:
    shows "pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
             F ΦF H ΦH map0 map1"
      ..

  end

  locale pseudonatural_equivalence_whisker_right =
    pseudonatural_transformation_whisker_right +
    τ: pseudonatural_equivalence
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
  begin

    interpretation FoH: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH F ΦF
      ..
    interpretation GoH: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD H ΦH G ΦG
      ..

    sublocale pseudonatural_equivalence VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          F o H FoH.cmp G o H GoH.cmp map0 map1
      using map0_def τ.components_are_equivalences
      by unfold_locales simp

    lemma is_pseudonatural_equivalence:
    shows "pseudonatural_equivalence VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          (F o H) FoH.cmp (G o H) GoH.cmp map0 map1"
      ..

  end

  locale pseudonatural_equivalence_whisker_left =
    pseudonatural_transformation_whisker_left +
    τ: pseudonatural_equivalence
         VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
  begin

    interpretation HoF: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF H ΦH
      ..
    interpretation HoG: composite_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB
                          VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG H ΦH
      ..

    sublocale pseudonatural_equivalence VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          H o F HoF.cmp H o G HoG.cmp map0 map1
      using map0_def τ.components_are_equivalences H.preserves_equivalence_maps
      by unfold_locales simp

    lemma is_pseudonatural_equivalence:
    shows "pseudonatural_equivalence VB HB 𝖺B 𝗂B srcB trgB VD HD 𝖺D 𝗂D srcD trgD
                          (H o F) HoF.cmp (H o G) HoG.cmp map0 map1"
      ..

  end

  subsubsection "Converse of a Pseudonatural Equivalence"

  text ‹
    It is easy to see that natural isomorphism between ordinary functors is a symmetric
    relation because a unique inverse to a natural isomorphism is obtained merely by inverting
    the components.  However the situation is more difficult for pseudonatural equivalences
    because they do not have unique inverses.  Instead, we have to choose a quasi-inverse for
    each of the components.  In order to satisfy the required coherence conditions,
    it is necessary for these quasi-inverses to be part of chosen adjoint equivalences.
    Some long calculations to establish the coherence conditions seem unavoidable.
    The purpose of this section is to carry out the construction, given a pseudonatural
    equivalence, of a ``converse'' pseudonatural equivalence in the opposite direction.
  ›

  locale converse_pseudonatural_equivalence =
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    F: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF +
    G: pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG +
    τ: pseudonatural_equivalence
  begin

    abbreviation (input) F0
    where "F0  F.map0"

    abbreviation (input) G0
    where "G0  G.map0"

    definition map0
    where "map0 a = (SOME g. η ε. adjoint_equivalence_in_bicategory
                                     VD HD 𝖺D 𝗂D srcD trgD (τ0 a) g η ε)"

    abbreviation (input) τ0'
    where "τ0'  map0"

    definition unit
    where "unit a = (SOME η. ε. adjoint_equivalence_in_bicategory
                                   VD HD 𝖺D 𝗂D srcD trgD (τ0 a) (τ0' a) η ε)"

    abbreviation (input) η
    where "η  unit"

    definition counit
    where "counit a = (SOME ε. adjoint_equivalence_in_bicategory
                                 VD HD 𝖺D 𝗂D srcD trgD (τ0 a) (τ0' a) (η a) ε)"

    abbreviation (input) ε
    where "ε  counit"

    lemma chosen_adjoint_equivalence:
    assumes "C.obj a"
    shows "adjoint_equivalence_in_bicategory VD HD 𝖺D 𝗂D srcD trgD (τ0 a) (τ0' a) (η a) (ε a)"
      using assms τ.components_are_equivalences map0_def unit_def counit_def
            D.obj_is_equivalence_map D.equivalence_map_extends_to_adjoint_equivalence
            someI_ex [of "λg. η ε. adjoint_equivalence_in_bicategory
                                      VD HD 𝖺D 𝗂D srcD trgD (τ0 a) g η ε"]
            someI_ex [of "λη. ε. adjoint_equivalence_in_bicategory
                                    VD HD 𝖺D 𝗂D srcD trgD (τ0 a) (τ0' a) η ε"]
            someI_ex [of "λε. adjoint_equivalence_in_bicategory
                                    VD HD 𝖺D 𝗂D srcD trgD (τ0 a) (τ0' a) (η a) ε"]
      by simp

    lemma map0_in_hhom [intro]:
    assumes "C.obj a"
    shows "«τ0' a : G0 a D F0 a»"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show ?thesis
        using assms τ.map0_in_hhom [of a] antipar by auto
    qed

    lemma map0_simps [simp]:
    assumes "C.obj a"
    shows "D.ide (τ0' a)" and "srcD (τ0' a) = G0 a" and "trgD (τ0' a) = F0 a"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "D.ide (τ0' a)"
        by simp
      show "srcD (τ0' a) = G0 a"
        using assms map0_in_hhom by blast
      show "trgD (τ0' a) = F0 a"
        using assms map0_in_hhom by blast
    qed

    lemma equivalence_map_map0 [simp]:
    assumes "C.obj a"
    shows "D.equivalence_map (τ0' a)"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "D.equivalence_map (τ0' a)"
        using D.equivalence_map_def adjoint_equivalence_in_bicategory_axioms
              dual_equivalence
        by blast
    qed

    lemma unit_in_hom [intro]:
    assumes "C.obj a"
    shows "«η a : F0 a D F0 a»"
    and "«η a : F0 a D τ0' a D τ0 a»"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "«η a : F0 a D F0 a»"
        using assms unit_in_hom antipar(1) by auto
      show "«η a : F0 a D τ0' a D τ0 a»"
        using assms unit_in_hom antipar(1) by auto
    qed

    lemma unit_simps [simp]:
    assumes "C.obj a"
    shows "D.iso (η a)" and "D.arr (η a)"
    and "srcD (η a) = F0 a" and "trgD (η a) = F0 a"
    and "D.dom (η a) = F0 a" and "D.cod (η a) = τ0' a D τ0 a"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "D.iso (η a)" and "D.arr (η a)"
      and "srcD (η a) = F0 a" and "trgD (η a) = F0 a"
      and "D.dom (η a) = F0 a" and "D.cod (η a) = τ0' a D τ0 a"
        using assms by auto
    qed

    lemma iso_unit:
    assumes "C.obj a"
    shows "D.iso (η a)"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show ?thesis by simp
    qed

    lemma counit_in_hom [intro]:
    assumes "C.obj a"
    shows "«ε a : G0 a D G0 a»"
    and "«ε a : τ0 a D τ0' a D G0 a»"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "«ε a : G0 a D G0 a»"
        using assms counit_in_hom antipar(2) by auto
      show " «ε a : τ0 a D τ0' a D G0 a»"
        using assms counit_in_hom antipar(2) by simp
    qed

    lemma counit_simps [simp]:
    assumes "C.obj a"
    shows "D.iso (ε a)" and "D.arr (ε a)"
    and "srcD (ε a) = G0 a" and "trgD (ε a) = G0 a"
    and "D.dom (ε a) = τ0 a D τ0' a" and "D.cod (ε a) = G0 a"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "D.iso (ε a)" and "D.arr (ε a)"
      and "srcD (ε a) = G0 a" and "trgD (ε a) = G0 a"
      and "D.dom (ε a) = τ0 a D τ0' a" and "D.cod (ε a) = G0 a"
        using assms by auto
    qed

    lemma iso_counit:
    assumes "C.obj a"
    shows "D.iso (ε a)"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show ?thesis by simp
    qed

    lemma quasi_inverts_components:
    assumes "C.obj a"
    shows "D.isomorphic (τ0' a D τ0 a) (F0 a)"
    and "D.isomorphic (τ0 a D τ0' a) (G0 a)"
    and "D.quasi_inverses (τ0 a) (τ0' a)"
    proof -
      interpret adjoint_equivalence_in_bicategory
                  VD HD 𝖺D 𝗂D srcD trgD τ0 a τ0' a η a ε a
        using assms chosen_adjoint_equivalence by simp
      show "D.isomorphic (τ0' a D τ0 a) (F0 a)"
        using assms D.isomorphic_def D.isomorphic_symmetric unit_is_iso by blast
      show "D.isomorphic (τ0 a D τ0' a) (G0 a)"
        using assms D.isomorphic_def counit_is_iso by blast
      show "D.quasi_inverses (τ0 a) (τ0' a)"
        using D.quasi_inverses_def equivalence_in_bicategory_axioms by auto
    qed

    definition map1
    where "map1 f = (τ0' (trgC f) D 𝗋D[G f]) D
                    (τ0' (trgC f) D G f D ε (srcC f)) D
                    (τ0' (trgC f) D 𝖺D[G f, τ0 (srcC f), τ0' (srcC f)]) D
                    𝖺D[τ0' (trgC f), G f D τ0 (srcC f), τ0' (srcC f)] D
                    ((τ0' (trgC f) D D.inv (τ1 f)) D τ0' (srcC f)) D
                    (𝖺D[τ0' (trgC f), τ0 (trgC f), F f] D τ0' (srcC f)) D
                    ((η (trgC f) D F f) D τ0' (srcC f)) D
                    (𝗅D-1[F f] D τ0' (srcC f))"

    abbreviation (input) τ1'
    where "τ1'  map1"

    lemma map1_in_hom [intro]:
    assumes "C.ide f"
    shows "«τ1' f : G0 (srcC f) D F0 (trgC f)»"
    and "«τ1' f : F f D τ0' (srcC f) D τ0' (trgC f) D G f»"
    proof -
      show "«τ1' f : F f D τ0' (srcC f) D τ0' (trgC f) D G f»"
        using assms τ.iso_map1_ide τ.map1_in_vhom
        by (unfold map1_def, intro D.comp_in_homI) auto
      thus "«τ1' f : G0 (srcC f) D F0 (trgC f)»"
        using assms D.vconn_implies_hpar(1-2) by auto
    qed

    lemma map1_simps [simp]:
    assumes "C.ide f"
    shows "D.arr (τ1' f)"
    and "srcD (τ1' f) = G0 (srcC f)" and "trgD (τ1' f) = F0 (trgC f)"
    and "D.dom (τ1' f) = F f D τ0' (srcC f)" and "D.cod (τ1' f) = τ0' (trgC f) D G f"
      using assms map1_in_hom by auto
    
    lemma iso_map1_ide:
    assumes "C.ide f"
    shows "D.iso (τ1' f)"
    proof -
      interpret src: adjoint_equivalence_in_bicategory VD HD 𝖺D 𝗂D srcD trgD
                        τ0 (srcC f) τ0' (srcC f) η (srcC f) ε (srcC f)
        using assms chosen_adjoint_equivalence by simp
      interpret trg: adjoint_equivalence_in_bicategory VD HD 𝖺D 𝗂D srcD trgD
                        τ0 (trgC f) τ0' (trgC f) η (trgC f) ε (trgC f)

        using assms chosen_adjoint_equivalence by simp
      show ?thesis
        unfolding map1_def
        using assms τ.iso_map1_ide
        by (intro D.isos_compose) auto
    qed

    interpretation EV: self_evaluation_map VD HD 𝖺D 𝗂D srcD trgD ..
    notation EV.eval ("_")

    sublocale pseudonatural_equivalence
                     VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG F ΦF τ0' τ1'
    proof
      show "a. C.obj a  D.ide (τ0' a)"
        using map0_simps(1) by simp
      show "f. C.ide f  D.iso (τ1' f)"
        using iso_map1_ide by simp
      show "a. C.obj a  «τ0' a : srcD (G a) D srcD (F a)»"
        by fastforce
      show "f. C.ide f  «τ1' f : F f D τ0' (srcC f) D τ0' (trgC f) D G f»"
        by auto
      show "a. C.obj a  D.equivalence_map (τ0' a)"
        by simp
      show "μ. C.arr μ  τ1' (C.cod μ) D (F μ D τ0' (srcC μ))
                               = (τ0' (trgC μ) D G μ) D τ1' (C.dom μ)"
      proof -
        fix μ
        assume μ: "C.arr μ"
        let ?a = "srcC μ"
        let ?b = "trgC μ"
        let ?f = "C.dom μ"
        let ?g = "C.cod μ"
        have "τ1' (C.cod μ) D (F μ D τ0' ?a)
                       = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?g D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?g] D τ0' ?a) D
                         ((η ?b D F ?g) D τ0' ?a) D
                         (𝗅D-1[F ?g] D τ0' ?a) D
                         (F μ D τ0' ?a)"
          unfolding map1_def
          using μ D.comp_assoc by simp
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?g D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?g] D τ0' ?a) D
                         (((η ?b D F ?g) D τ0' ?a) D
                         ((trgD (F μ) D F μ) D τ0' ?a)) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
          using μ D.whisker_right D.lunit'_naturality [of "F μ"] D.comp_assoc
                D.whisker_right [of "τ0' ?a" "trgD (F μ) D F μ" "𝗅D-1[F ?f]"]
          by simp
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?g D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                         ((𝖺D[τ0' ?b, τ0 ?b, F ?g] D τ0' ?a) D
                         (((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a)) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "((η ?b D F ?g) D τ0' ?a) D ((trgD (F μ) D F μ) D τ0' ?a)
                  = (((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a) D ((η ?b D F ?f) D τ0' ?a)"
          proof -
            have "((η ?b D F ?g) D τ0' ?a) D ((trgD (F μ) D F μ) D τ0' ?a)
                    = (η ?b D F ?g) D (trgD (F μ) D F μ) D τ0' ?a"
              using μ D.whisker_right D.obj_simps by simp
            also have "... = (η ?b D F μ) D τ0' ?a"
              using μ D.interchange [of "η ?b" "trgD (F μ)" "F ?g" "F μ"]
                    D.comp_arr_dom D.comp_cod_arr
              by simp
            also have "... = ((τ0' ?b D τ0 ?b) D F μ) D (η ?b D F ?f) D τ0' ?a"
              using μ D.interchange [of "τ0' ?b D τ0 ?b" "η ?b" "F μ" "F ?f"]
                    D.comp_arr_dom D.comp_cod_arr
              by simp
            also have "... = (((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a) D ((η ?b D F ?f) D τ0' ?a)"
              using μ D.whisker_right by simp
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?g D τ0 ?a, τ0' ?a] D
                         (((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                         ((τ0' ?b D τ0 ?b D F μ) D τ0' ?a)) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "(𝖺D[τ0' ?b, τ0 ?b, F ?g] D τ0' ?a) D (((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a)
                  = 𝖺D[τ0' ?b, τ0 ?b, F ?g] D ((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a"
            using μ D.whisker_right by simp
          also have "... = (τ0' ?b D τ0 ?b D F μ) D 𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a"
            using μ D.assoc_naturality [of "τ0' ?b" "τ0 ?b" "F μ"] by simp
          also have "... = ((τ0' ?b D τ0 ?b D F μ) D τ0' ?a) D
                           (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a)"
            using μ D.whisker_right by simp
          finally have "(𝖺D[τ0' ?b, τ0 ?b, F ?g] D τ0' ?a) D
                        (((τ0' ?b D τ0 ?b) D F μ) D τ0' ?a)
                          = ((τ0' ?b D τ0 ?b D F μ) D τ0' ?a) D
                            (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         (𝖺D[τ0' ?b, G ?g D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D (G μ D τ0 ?a)) D τ0' ?a)) D
                         ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                ((τ0' ?b D τ0 ?b D F μ) D τ0' ?a)
                  = (τ0' ?b D D.inv (τ1 ?g)) D (τ0' ?b D τ0 ?b D F μ) D τ0' ?a"
            using μ τ.iso_map1_ide D.whisker_right by simp
          also have "... = (τ0' ?b D D.inv (τ1 ?g) D (τ0 ?b D F μ)) D τ0' ?a"
            using μ τ.iso_map1_ide D.whisker_left by simp
          also have "... = (τ0' ?b D (G μ D τ0 ?a) D D.inv (τ1 ?f)) D τ0' ?a"
            using μ τ.iso_map1_ide τ.naturality
                  D.invert_opposite_sides_of_square
                    [of "τ1 ?g" "G μ D τ0 ?a" "τ0 ?b D F μ" "τ1 ?f"]
            by simp
          also have "... = (τ0' ?b D (G μ D τ0 ?a)) D (τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a"
            using μ τ.iso_map1_ide D.whisker_left by simp
          also have "... = ((τ0' ?b D (G μ D τ0 ?a)) D τ0' ?a) D
                           ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a)"
            using μ τ.iso_map1_ide D.whisker_right by simp
          finally have "((τ0' ?b D D.inv (τ1 ?g)) D τ0' ?a) D
                        ((τ0' ?b D τ0 ?b D F μ) D τ0' ?a)
                          = ((τ0' ?b D (G μ D τ0 ?a)) D τ0' ?a) D
                            ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G ?g D ε ?a) D
                         ((τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                         (τ0' ?b D (G μ D τ0 ?a) D τ0' ?a)) D
                         𝖺D[τ0' ?b, G ?f D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
          using μ D.assoc_naturality [of "τ0' ?b" "G μ D τ0 ?a" "τ0' ?a"] D.comp_assoc
          by simp
        also have "... = (τ0' ?b D 𝗋D[G ?g]) D
                         ((τ0' ?b D G ?g D ε ?a) D
                         (τ0' ?b D G μ D τ0 ?a D τ0' ?a)) D
                         (τ0' ?b D 𝖺D[G ?f, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?f D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "(τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                (τ0' ?b D (G μ D τ0 ?a) D τ0' ?a)
                  = τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a] D ((G μ D τ0 ?a) D τ0' ?a)"
            using μ D.whisker_left by simp
          also have "... = τ0' ?b D (G μ D τ0 ?a D τ0' ?a) D 𝖺D[G ?f, τ0 ?a, τ0' ?a]"
            using μ D.assoc_naturality [of "G μ" "τ0 ?a" "τ0' ?a"] by simp
          also have "... = (τ0' ?b D G μ D τ0 ?a D τ0' ?a) D
                           (τ0' ?b D 𝖺D[G ?f, τ0 ?a, τ0' ?a])"
            using μ D.whisker_left by simp
          finally have "(τ0' ?b D 𝖺D[G ?g, τ0 ?a, τ0' ?a]) D
                        (τ0' ?b D (G μ D τ0 ?a) D τ0' ?a)
                          = (τ0' ?b D G μ D τ0 ?a D τ0' ?a) D
                            (τ0' ?b D 𝖺D[G ?f, τ0 ?a, τ0' ?a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((τ0' ?b D 𝗋D[G ?g]) D
                         (τ0' ?b D G μ D G0 ?a)) D
                         (τ0' ?b D G ?f D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?f, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?f D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "(τ0' ?b D G ?g D ε ?a) D (τ0' ?b D G μ D τ0 ?a D τ0' ?a)
                  = τ0' ?b D (G ?g D ε ?a) D (G μ D τ0 ?a D τ0' ?a)"
            using μ D.whisker_left by simp
          also have "... = τ0' ?b D G μ D ε ?a"
            using μ D.interchange [of "G ?g" "G μ" "ε ?a" "τ0 ?a D τ0' ?a"]
                  D.comp_arr_dom D.comp_cod_arr
            by simp
          also have "... = τ0' ?b D (G μ D G0 ?a) D (G ?f D ε ?a)"
            using μ D.interchange [of "G μ" "G ?f" "G0 ?a" "ε ?a"]
                  D.comp_arr_dom D.comp_cod_arr
            by simp
          also have "... = (τ0' ?b D G μ D G0 ?a) D (τ0' ?b D G ?f D ε ?a)"
            using μ D.whisker_left D.obj_simps by auto
          finally have "(τ0' ?b D G ?g D ε ?a) D (τ0' ?b D G μ D τ0 ?a D τ0' ?a)
                          = (τ0' ?b D G μ D G0 ?a) D (τ0' ?b D G ?f D ε ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?b D G μ) D
                         (τ0' ?b D 𝗋D[G ?f]) D
                         (τ0' ?b D G ?f D ε ?a) D
                         (τ0' ?b D 𝖺D[G ?f, τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?b, G ?f D τ0 ?a, τ0' ?a] D
                         ((τ0' ?b D D.inv (τ1 ?f)) D τ0' ?a) D
                         (𝖺D[τ0' ?b, τ0 ?b, F ?f] D τ0' ?a) D
                         ((η ?b D F ?f) D τ0' ?a) D
                         (𝗅D-1[F ?f] D τ0' ?a)"
        proof -
          have "(τ0' ?b D 𝗋D[G ?g]) D (τ0' ?b D G μ D G0 ?a)
                  = τ0' ?b D 𝗋D[G ?g] D (G μ D G0 ?a)"
            using μ D.whisker_left D.obj_simps by simp
          also have "... = τ0' ?b D G μ D 𝗋D[G ?f]"
            using μ D.runit_naturality [of "G μ"] by simp
          also have "... = (τ0' ?b D G μ) D (τ0' ?b D 𝗋D[G ?f])"
            using μ D.whisker_left by simp
          finally have "(τ0' ?b D 𝗋D[G ?g]) D (τ0' ?b D G μ D G0 ?a)
                          = (τ0' ?b D G μ) D (τ0' ?b D 𝗋D[G ?f])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?b D G μ) D τ1' ?f"
          unfolding map1_def
          using μ D.comp_assoc by simp
        finally show "τ1' ?g D (F μ D τ0' ?a) = (τ0' ?b D G μ) D τ1' ?f"
          by blast
      qed
      show "a. C.obj a 
                  (τ0' a D G.unit a) D 𝗋D-1[τ0' a] D 𝗅D[τ0' a] = τ1' a D (F.unit a D τ0' a)"
      proof -
        fix a
        assume "C.obj a"
        hence a: "C.obj a  C.arr a  C.ide a  srcC a = a  trgC a = a"
          by auto
        have 1: "D.ide (F0 a)"
          using a F.map0_simps(1) by blast
        have 2: "D.ide (G0 a)"
          using a G.map0_simps(1) by blast
        have "τ1' a D (F.unit a D τ0' a)
                       = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         (τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G a D τ0 a, τ0' a] D
                         ((τ0' a D D.inv (τ1 a)) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F a] D τ0' a) D
                         ((η a D F a) D τ0' a) D
                         (𝗅D-1[F a] D τ0' a) D
                         (F.unit a D τ0' a)"
          unfolding map1_def
          using a D.comp_assoc by simp
        also have "... = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         (τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G a D τ0 a, τ0' a] D
                         ((τ0' a D D.inv (τ1 a)) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F a] D τ0' a) D
                         (((η a D F a) D τ0' a) D
                         ((F0 a D F.unit a) D τ0' a)) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(𝗅D-1[F a] D τ0' a) D (F.unit a D τ0' a) = 𝗅D-1[F a] D F.unit a D τ0' a"
            using a D.whisker_right by simp
          also have "... = (F0 a D F.unit a) D 𝗅D-1[F0 a] D τ0' a"
            using a D.lunit'_naturality [of "F.unit a"] by simp
          also have "... = ((F0 a D F.unit a) D τ0' a) D (𝗅D-1[F0 a] D τ0' a)"
            using a 1 D.whisker_right by simp
          finally have "(𝗅D-1[F a] D τ0' a) D (F.unit a D τ0' a) =
                        ((F0 a D F.unit a) D τ0' a) D (𝗅D-1[F0 a] D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         (τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G a D τ0 a, τ0' a] D
                         ((τ0' a D D.inv (τ1 a)) D τ0' a) D
                         ((𝖺D[τ0' a, τ0 a, F a] D τ0' a) D
                         (((τ0' a D τ0 a) D F.unit a) D τ0' a)) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "((η a D F a) D τ0' a) D ((F0 a D F.unit a) D τ0' a)
                  = (η a D F a) D (F0 a D F.unit a) D τ0' a"
            using a 1 D.whisker_right by simp
          also have "... = (η a D F.unit a) D τ0' a"
            using a D.interchange [of "η a" "F0 a" "F a" "F.unit a"]
                  D.comp_cod_arr D.comp_arr_dom
            by simp
          also have "... = ((τ0' a D τ0 a) D F.unit a) D (η a D F0 a) D τ0' a"
            using a D.interchange [of "τ0' a D τ0 a" "η a" "F.unit a" "F0 a"]
                  D.comp_cod_arr D.comp_arr_dom
            by simp
          also have "... = (((τ0' a D τ0 a) D F.unit a) D τ0' a) D ((η a D F0 a) D τ0' a)"
            using a 1 D.whisker_right by simp
          finally have "((η a D F a) D τ0' a) D ((F0 a D F.unit a) D τ0' a)
                          = (((τ0' a D τ0 a) D F.unit a) D τ0' a) D ((η a D F0 a) D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         (τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G a D τ0 a, τ0' a] D
                         (((τ0' a D D.inv (τ1 a)) D τ0' a) D
                         ((τ0' a D τ0 a D F.unit a) D τ0' a)) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(𝖺D[τ0' a, τ0 a, F a] D τ0' a) D (((τ0' a D τ0 a) D F.unit a) D τ0' a)
                  = 𝖺D[τ0' a, τ0 a, F a] D ((τ0' a D τ0 a) D F.unit a) D τ0' a"
            using a D.whisker_right by simp
          also have "... = (τ0' a D τ0 a D F.unit a) D 𝖺D[τ0' a, τ0 a, F0 a] D τ0' a"
            using a D.assoc_naturality [of "τ0' a" "τ0 a" "F.unit a"] by simp
          also have "... = ((τ0' a D τ0 a D F.unit a) D τ0' a) D
                             (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a)"
            using a 1 D.whisker_right by simp
          finally have "(𝖺D[τ0' a, τ0 a, F a] D τ0' a) D
                        (((τ0' a D τ0 a) D F.unit a) D τ0' a)
                          = ((τ0' a D τ0 a D F.unit a) D τ0' a) D
                            (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         (τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         (𝖺D[τ0' a, G a D τ0 a, τ0' a] D
                         ((τ0' a D G.unit a D τ0 a) D τ0' a)) D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                         ((τ0' a D 𝗋D[τ0 a]) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "((τ0' a D D.inv (τ1 a)) D τ0' a) D ((τ0' a D τ0 a D F.unit a) D τ0' a)
                  = (τ0' a D D.inv (τ1 a)) D (τ0' a D τ0 a D F.unit a) D τ0' a"
            using a τ.iso_map1_ide D.whisker_right by simp
          also have "... = (τ0' a D D.inv (τ1 a) D (τ0 a D F.unit a)) D τ0' a"
            using a τ.iso_map1_ide D.whisker_left by simp
          also have "... = (τ0' a D (G.unit a D τ0 a) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]) D τ0' a"
          proof -
            have "(τ0 a D F.unit a) D 𝗋D-1[τ0 a] D 𝗅D[τ0 a] = τ1 a D (G.unit a D τ0 a)"
              using a τ.respects_unit by simp
            hence "D.inv (τ1 a) D (τ0 a D F.unit a) D 𝗋D-1[τ0 a] D 𝗅D[τ0 a]
                     = G.unit a D τ0 a"
              using a τ.iso_map1_ide D.invert_side_of_triangle(1) by simp
            hence "D.inv (τ1 a) D (τ0 a D F.unit a) D 𝗋D-1[τ0 a]
                     = (G.unit a D τ0 a) D 𝗅D-1[τ0 a]"
              using a D.iso_lunit D.invert_side_of_triangle(2) D.comp_assoc by simp
            hence "D.inv (τ1 a) D (τ0 a D F.unit a)
                     = (G.unit a D τ0 a) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]"
              using a D.iso_runit D.comp_assoc
                    D.invert_side_of_triangle(2)
                      [of "(G.unit a D τ0 a) D 𝗅D-1[τ0 a]" "D.inv (τ1 a) D (τ0 a D F.unit a)"
                          "𝗋D-1[τ0 a]"]
              by simp
            thus ?thesis by simp
          qed
          also have "... = (τ0' a D G.unit a D τ0 a) D
                           (τ0' a D 𝗅D-1[τ0 a]) D
                           (τ0' a D 𝗋D[τ0 a]) D τ0' a"
            using a D.whisker_left by simp
          also have "... = ((τ0' a D G.unit a D τ0 a) D τ0' a) D
                           ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                           ((τ0' a D 𝗋D[τ0 a]) D τ0' a)"
            using a D.whisker_right by simp
          finally have "((τ0' a D D.inv (τ1 a)) D τ0' a) D
                        ((τ0' a D τ0 a D F.unit a) D τ0' a)
                          = ((τ0' a D G.unit a D τ0 a) D τ0' a) D
                            ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                            ((τ0' a D 𝗋D[τ0 a]) D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D 𝗋D[G a]) D
                         (τ0' a D G a D ε a) D
                         ((τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                         (τ0' a D (G.unit a D τ0 a) D τ0' a)) D
                         𝖺D[τ0' a, G0 a D τ0 a, τ0' a] D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                         ((τ0' a D 𝗋D[τ0 a]) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
          using a D.assoc_naturality [of "τ0' a" "G.unit a D τ0 a" "τ0' a"] D.comp_assoc
          by simp
        also have "... = (τ0' a D 𝗋D[G a]) D
                         ((τ0' a D G a D ε a) D
                         (τ0' a D G.unit a D τ0 a D τ0' a)) D
                         (τ0' a D 𝖺D[G0 a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G0 a D τ0 a, τ0' a] D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                         ((τ0' a D 𝗋D[τ0 a]) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D (τ0' a D (G.unit a D τ0 a) D τ0' a)
                  = τ0' a D 𝖺D[G a, τ0 a, τ0' a] D ((G.unit a D τ0 a) D τ0' a)"
            using a D.whisker_left by simp
          also have "... = τ0' a D (G.unit a D τ0 a D τ0' a) D 𝖺D[G0 a, τ0 a, τ0' a]"
            using a D.assoc_naturality [of "G.unit a" "τ0 a" "τ0' a"] by simp
          also have "... = (τ0' a D G.unit a D τ0 a D τ0' a) D
                           (τ0' a D 𝖺D[G0 a, τ0 a, τ0' a])"
            using a 2 D.whisker_left [of "τ0' a"] by simp
          finally have "(τ0' a D 𝖺D[G a, τ0 a, τ0' a]) D
                        (τ0' a D (G.unit a D τ0 a) D τ0' a)
                          = (τ0' a D G.unit a D τ0 a D τ0' a) D
                            (τ0' a D 𝖺D[G0 a, τ0 a, τ0' a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((τ0' a D 𝗋D[G a]) D
                         (τ0' a D G.unit a D G0 a)) D
                         (τ0' a D G0 a D ε a) D
                         (τ0' a D 𝖺D[G0 a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G0 a D τ0 a, τ0' a] D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                         ((τ0' a D 𝗋D[τ0 a]) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(τ0' a D G a D ε a) D (τ0' a D G.unit a D τ0 a D τ0' a)
                  = τ0' a D G.unit a D ε a"
            using a D.whisker_left D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "G a" "G.unit a" "ε a" "τ0 a D τ0' a"]
            by simp
          also have "... = (τ0' a D G.unit a D G0 a) D (τ0' a D G0 a D ε a)"
            using a 2 D.whisker_left D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "G.unit a" "G0 a" "G0 a" "ε a"]
            by simp
          finally have "(τ0' a D G a D ε a) D (τ0' a D G.unit a D τ0 a D τ0' a)
                          = (τ0' a D G.unit a D G0 a) D (τ0' a D G0 a D ε a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D G0 a D ε a) D
                         ((τ0' a D 𝖺D[G0 a, τ0 a, τ0' a]) D
                         𝖺D[τ0' a, G0 a D τ0 a, τ0' a]) D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a) D
                         (((τ0' a D 𝗋D[τ0 a]) D τ0' a) D
                         (𝖺D[τ0' a, τ0 a, F0 a] D τ0' a)) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(τ0' a D 𝗋D[G a]) D (τ0' a D G.unit a D G0 a)
                  = τ0' a D 𝗋D[G a] D (G.unit a D G0 a)"
            using a 2 D.whisker_left by simp
          also have "... = τ0' a D G.unit a D 𝗋D[G0 a]"
            using a D.runit_naturality [of "G.unit a"] by simp
          also have "... = (τ0' a D G.unit a) D (τ0' a D 𝗋D[G0 a])"
            using a 2 D.whisker_left by simp
          finally have "(τ0' a D 𝗋D[G a]) D (τ0' a D G.unit a D G0 a)
                          = (τ0' a D G.unit a) D (τ0' a D 𝗋D[G0 a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D G0 a D ε a) D
                         (τ0' a D 𝖺D[G0 a, τ0 a, τ0' a]) D
                         (𝖺D[τ0' a, G0 a D τ0 a, τ0' a] D
                         ((τ0' a D 𝗅D-1[τ0 a]) D τ0' a)) D
                         (𝗋D[τ0' a D τ0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
          using a 1 D.whisker_right D.runit_hcomp(1) D.comp_assoc by simp
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D G0 a D ε a) D
                         ((τ0' a D 𝖺D[G0 a, τ0 a, τ0' a]) D
                         (τ0' a D 𝗅D-1[τ0 a] D τ0' a)) D
                         𝖺D[τ0' a, τ0 a, τ0' a] D
                         (𝗋D[τ0' a D τ0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
          using a D.assoc_naturality [of "τ0' a" "𝗅D-1[τ0 a]" "τ0' a"] D.comp_assoc by simp
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         ((τ0' a D G0 a D ε a) D
                         (τ0' a D 𝗅D-1[τ0 a D τ0' a])) D
                         𝖺D[τ0' a, τ0 a, τ0' a] D
                         (𝗋D[τ0' a D τ0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
          using a 2 D.whisker_left D.lunit_hcomp(4) D.comp_assoc by simp
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D 𝗅D-1[G0 a]) D
                         (τ0' a D ε a) D
                         𝖺D[τ0' a, τ0 a, τ0' a] D
                         ((𝗋D[τ0' a D τ0 a] D τ0' a) D
                         ((η a D F0 a) D τ0' a)) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(τ0' a D G0 a D ε a) D (τ0' a D 𝗅D-1[τ0 a D τ0' a])
                  = τ0' a D (G0 a D ε a) D 𝗅D-1[τ0 a D τ0' a]"
            using a 2 D.whisker_left by simp
          also have "... = τ0' a D 𝗅D-1[G0 a] D ε a"
            using a D.lunit'_naturality [of "ε a"] by simp
          also have "... = (τ0' a D 𝗅D-1[G0 a]) D (τ0' a D ε a)"
            using a 2 D.whisker_left by simp
          finally have "(τ0' a D G0 a D ε a) D (τ0' a D 𝗅D-1[τ0 a D τ0' a])
                          = (τ0' a D 𝗅D-1[G0 a]) D (τ0' a D ε a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D G.unit a) D
                         (τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D 𝗅D-1[G0 a]) D
                         ((τ0' a D ε a) D
                         𝖺D[τ0' a, τ0 a, τ0' a] D
                         (η a D τ0' a)) D
                         (𝗋D[F0 a] D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          have "(𝗋D[τ0' a D τ0 a] D τ0' a) D ((η a D F0 a) D τ0' a)
                  = 𝗋D[τ0' a D τ0 a] D (η a D F0 a) D τ0' a"
            using a 1 D.whisker_right by simp
          also have "... = η a D 𝗋D[F0 a] D τ0' a"
            using a D.runit_naturality [of "η a"] by simp
          also have "... = (η a D τ0' a) D (𝗋D[F0 a] D τ0' a)"
            using a 1 D.whisker_right by simp
          finally have "(𝗋D[τ0' a D τ0 a] D τ0' a) D ((η a D F0 a) D τ0' a)
                          = (η a D τ0' a) D (𝗋D[F0 a] D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D G.unit a) D
                         ((τ0' a D 𝗋D[G0 a]) D
                         (τ0' a D 𝗅D-1[G0 a]) D
                         𝗋D-1[τ0' a]) D
                         𝗅D[τ0' a] D
                         (𝗋D[F0 a] D τ0' a) D
                         (𝗅D-1[F0 a] D τ0' a)"
        proof -
          interpret adjoint_equivalence_in_bicategory VD HD 𝖺D 𝗂D srcD trgD
                      τ0 a τ0' a η a ε a
            using a chosen_adjoint_equivalence by simp
          have "(τ0' a D ε a) D 𝖺D[τ0' a, τ0 a, τ0' a] D (η a D τ0' a)
                  = 𝗋D-1[τ0' a] D 𝗅D[τ0' a]"
            using triangle_right by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' a D G.unit a) D 𝗋D-1[τ0' a] D 𝗅D[τ0' a]"
        proof -
          have "𝗅D[τ0' a] D (𝗋D[F0 a] D τ0' a) D (𝗅D-1[F0 a] D τ0' a) = 𝗅D[τ0' a]"
          proof -
            have "D.seq 𝗋D[F0 a] 𝗅D-1[F0 a]"
              using a 1 by auto
            thus ?thesis
              using a D.unitor_coincidence [of "F0 a"] D.comp_arr_dom D.whisker_right
              by (metis D.comp_arr_inv' D.iso_runit D.lunit_simps(1,4)
                  D.objE D.runit_simps(5) F.map0_simps(1) map0_simps(1,3))
          qed
          moreover have "(τ0' a D 𝗋D[G0 a]) D (τ0' a D 𝗅D-1[G0 a]) D 𝗋D-1[τ0' a]
                           = 𝗋D-1[τ0' a]"
          proof -
            have "(τ0' a D 𝗋D[G0 a]) D (τ0' a D 𝗅D-1[G0 a]) D 𝗋D-1[τ0' a] =
                  ((τ0' a D 𝗅D[G0 a]) D (τ0' a D 𝗅D-1[G0 a])) D 𝗋D-1[τ0' a]"
              using a D.unitor_coincidence D.comp_assoc by simp
            also have "... = (τ0' a D 𝗅D[G0 a] D 𝗅D-1[G0 a]) D 𝗋D-1[τ0' a]"
              using a 2 D.whisker_left by simp
            also have "... = (τ0' a D G0 a) D 𝗋D-1[τ0' a]"
              using a 2 D.comp_arr_inv' by simp
            also have "... = 𝗋D-1[τ0' a]"
              using a 2 D.comp_cod_arr by simp
            finally show ?thesis by blast
          qed
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        finally show "(τ0' a D G.unit a) D 𝗋D-1[τ0' a] D 𝗅D[τ0' a]
                         = τ1' a D (F.unit a D τ0' a)"
          by simp
      qed
      show "f g. C.ide f; C.ide g; srcC g = trgC f 
                     (τ0' (trgC g) D ΦG (g, f)) D
                     𝖺D[τ0' (trgC g), G g, G f] D
                     (τ1' g D G f) D
                     D.inv 𝖺D[F g, τ0' (srcC g), G f] D
                     (F g D τ1' f) D
                     𝖺D[F g, F f, τ0' (srcC f)]
                       = τ1' (g C f) D (ΦF (g, f) D τ0' (srcC f))"
      proof -
        fix f g
        assume f: "C.ide f" and g: "C.ide g" and fg: "srcC g = trgC f"
        let ?a = "srcC f"
        let ?b = "trgC f"
        let ?c = "trgC g"
        (*
         * TODO: The following are extremely problematic.
         * I don't think all the cases are used, but they don't get discovered by auto
         * and sledgehammer doesn't find them, either.  Note that the same issue occurred
         * for the previous subgoal, where I needed D.ide (F0 a) and D.ide (G0 a).
         *)
        have *: "D.ide (G0 ?a)  D.ide (G0 ?b)  D.ide (G0 ?b)  D.ide (G0 ?c)"
          using f g C.ideD(1) G.map0_simps(1) by blast
        have **: "D.ide (F0 ?a)  D.ide (F0 ?b)  D.ide (F0 ?b)  D.ide (F0 ?c)"
          using f g C.ideD(1) F.map0_simps(1) by blast
        have "(τ0' ?c D ΦG (g, f)) D
              𝖺D[τ0' ?c, G g, G f] D
              (τ1' g D G f) D
              D.inv 𝖺D[F g, τ0' (srcC g), G f] D
              (F g D τ1' f) D
              𝖺D[F g, F f, τ0' ?a]
                        = (τ0' ?c D ΦG (g, f)) D
                          𝖺D[τ0' ?c, G g, G f] D
                          ((τ0' ?c D 𝗋D[G g]) D
                           (τ0' ?c D G g D ε ?b) D
                           (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                           𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D
                           ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D
                           (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D
                           ((η ?c D F g) D τ0' ?b) D
                           (𝗅D-1[F g] D τ0' ?b)
                              D G f) D
                           D.inv 𝖺D[F g, τ0' ?b, G f] D
                           (F g D (τ0' ?b D 𝗋D[G f]) D
                                   (τ0' ?b D G f D ε ?a) D
                                   (τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                                   𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a] D
                                   ((τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                                   (𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                                   ((η ?b D F f) D τ0' ?a) D
                                   (𝗅D-1[F f] D τ0' ?a)) D
                         𝖺D[F g, F f, τ0' ?a]"
          unfolding map1_def
          using f g fg D.comp_assoc by simp
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         (((𝗅D-1[F g] D τ0' ?b) D G f) D
                         𝖺D-1[F g, τ0' ?b, G f]) D
                         (F g D τ0' ?b D 𝗋D[G f]) D
                         (F g D τ0' ?b D G f D ε ?a) D
                         (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D 𝗋D[G g]) D
                (τ0' ?c D G g D ε ?b) D
                (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D
                ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D
                (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D
                ((η ?c D F g) D τ0' ?b) D
                (𝗅D-1[F g] D τ0' ?b)
                   D G f
                  = ((τ0' ?c D 𝗋D[G g]) D G f) D
                    ((τ0' ?c D G g D ε ?b) D G f) D
                    ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                    (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                    (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                    ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                    (((η ?c D F g) D τ0' ?b) D G f) D
                    ((𝗅D-1[F g] D τ0' ?b) D G f)"
          proof -
            have 1: "D.arr ((τ0' ?c D 𝗋D[G g]) D
                            (τ0' ?c D G g D ε ?b) D
                            (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                            𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D
                            ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D
                            (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D
                            ((η ?c D F g) D τ0' ?b) D
                            (𝗅D-1[F g] D τ0' ?b))"
              using f g fg τ.iso_map1_ide by auto
            thus ?thesis
              using f g fg D.whisker_right [of "G f"]
              by (metis D.seqE G.preserves_ide)
          qed
          moreover have "F g D (τ0' ?b D 𝗋D[G f]) D
                                (τ0' ?b D G f D ε ?a) D
                                (τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                                𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a] D
                                ((τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                                (𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                                ((η ?b D F f) D τ0' ?a) D
                                (𝗅D-1[F f] D τ0' ?a)
                           = (F g D τ0' ?b D 𝗋D[G f]) D
                             (F g D τ0' ?b D G f D ε ?a) D
                             (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                             (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                             (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                             (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                             (F g D (η ?b D F f) D τ0' ?a) D
                             (F g D 𝗅D-1[F f] D τ0' ?a)"
          proof -
            have 1: "D.arr ((τ0' ?b D 𝗋D[G f]) D
                            (τ0' ?b D G f D ε ?a) D
                            (τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a] D
                            ((τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                            (𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                            ((η ?b D F f) D τ0' ?a) D
                            (𝗅D-1[F f] D τ0' ?a))"
              using f g fg τ.iso_map1_ide map1_def map1_simps(1) by presburger
            thus ?thesis
              using f g fg D.whisker_left [of "F g"]
              by (metis D.seqE F.preserves_ide)
          qed
          ultimately show ?thesis
            using f g fg D.comp_assoc by simp
        qed
        (*
         * Move 𝗅D-1[F g] and 𝗅D-1[F f] to the bottom, followed by η ?c and D.inv (τ1 g).
         * Move ε ?b down across D.inv (τ1 g) to meet η ?b, where they can be canceled.
         *)
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((𝗅D-1[F g] D τ0' ?b D G f) D
                         (F g D τ0' ?b D 𝗋D[G f])) D
                         (F g D τ0' ?b D G f D ε ?a) D
                         (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((𝗅D-1[F g] D τ0' ?b) D G f) D 𝖺D-1[F g, τ0' ?b, G f]
                  = 𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D (𝗅D-1[F g] D τ0' ?b D G f)"
            using f g fg D.assoc'_naturality [of "𝗅D-1[F g]" "τ0' ?b" "G f"] by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((𝗅D-1[F g] D τ0' ?b D G f D G0 ?a) D
                         (F g D τ0' ?b D G f D ε ?a)) D
                         (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D τ0' ?b D G f) D (F g D τ0' ?b D 𝗋D[G f])
                  = 𝗅D-1[F g] D τ0' ?b D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "τ0' ?b D G f" "τ0' ?b D 𝗋D[G f]"]
            by simp
          also have "... = ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                           (𝗅D-1[F g] D τ0' ?b D G f D G0 ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "τ0' ?b D 𝗋D[G f]"
                                    "τ0' ?b D G f D G0 ?a"]
            by simp
          finally have "(𝗅D-1[F g] D τ0' ?b D G f) D (F g D τ0' ?b D 𝗋D[G f])
                          = ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                            (𝗅D-1[F g] D τ0' ?b D G f D G0 ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((𝗅D-1[F g] D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                         (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D τ0' ?b D G f D G0 ?a) D (F g D τ0' ?b D G f D ε ?a)
                  = 𝗅D-1[F g] D τ0' ?b D G f D ε ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "τ0' ?b D G f D G0 ?a"
                                    "τ0' ?b D G f D ε ?a"]
            by simp
          also have "... = ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                             (𝗅D-1[F g] D τ0' ?b D G f D τ0 ?a D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]"
                                    "τ0' ?b D G f D ε ?a"
                                    "τ0' ?b D G f D τ0 ?a D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D τ0' ?b D G f D G0 ?a) D
                        (F g D τ0' ?b D G f D ε ?a)
                          = ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                            (𝗅D-1[F g] D τ0' ?b D G f D τ0 ?a D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((𝗅D-1[F g] D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])
                  = 𝗅D-1[F g] D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "τ0' ?b D G f D τ0 ?a D τ0' ?a"
                                    "τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           (𝗅D-1[F g] D τ0' ?b D (G f D τ0 ?a) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"
                                    "τ0' ?b D (G f D τ0 ?a) D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                        (F g D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])
                          = ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            (𝗅D-1[F g] D τ0' ?b D (G f D τ0 ?a) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((𝗅D-1[F g] D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                         (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])
                  = 𝗅D-1[F g] D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "τ0' ?b D (G f D τ0 ?a) D τ0' ?a"
                                    "𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                           (𝗅D-1[F g] D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"
                                    "(τ0' ?b D (G f D τ0 ?a)) D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                        (F g D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])
                          = ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                            (𝗅D-1[F g] D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((𝗅D-1[F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                         (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)) D
                         (F g D (η ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
         proof -
          have "(𝗅D-1[F g] D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                  = 𝗅D-1[F g] D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "(τ0' ?b D (G f D τ0 ?a)) D τ0' ?a"
                                    "(τ0' ?b D D.inv (τ1 f)) D τ0' ?a"]
            by simp
          also have "... = ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                           (𝗅D-1[F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "(τ0' ?b D D.inv (τ1 f)) D τ0' ?a"
                                    "(τ0' ?b D τ0 ?b D F f) D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                        (F g D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                          = ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                            (𝗅D-1[F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((𝗅D-1[F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                         (F g D (η ?b D F f) D τ0' ?a)) D
                         (F g D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                  = 𝗅D-1[F g] D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "(τ0' ?b D τ0 ?b D F f) D τ0' ?a"
                                    "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"]
            by simp
          also have "... = ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                           (𝗅D-1[F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
                                    "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                        (F g D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                          = ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                            (𝗅D-1[F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f] D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         ((𝗅D-1[F g] D (F0 ?b D F f) D τ0' ?a) D
                         (F g D 𝗅D-1[F f] D τ0' ?a)) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                (F g D (η ?b D F f) D τ0' ?a)
                  = 𝗅D-1[F g] D (η ?b D F f) D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"
                                    "(η ?b D F f) D τ0' ?a"]
            by simp
          also have "... = ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                           (𝗅D-1[F g] D (F0 ?b D F f) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "(η ?b D F f) D τ0' ?a"
                                    "(F0 ?b D F f) D τ0' ?a"]
            by simp
          finally have "(𝗅D-1[F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        (F g D (η ?b D F f) D τ0' ?a)
                          = ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                            (𝗅D-1[F g] D (F0 ?b D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D-1[F g] down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         ((((η ?c D F g) D τ0' ?b) D G f) D
                         𝖺D-1[F0 ?c D F g, τ0' ?b, G f]) D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f]) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝗅D-1[F g] D (F0 ?b D F f) D τ0' ?a) D (F g D 𝗅D-1[F f] D τ0' ?a)
                  = 𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F g]" "F g" "(F0 ?b D F f) D τ0' ?a" "𝗅D-1[F f] D τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         ((((η ?c D F g) D τ0' ?b D G f)) D
                         ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f])) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(((η ?c D F g) D τ0' ?b) D G f) D 𝖺D-1[F0 ?c D F g, τ0' ?b, G f]
                  = 𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                    ((η ?c D F g) D τ0' ?b D G f)"
            using f g fg D.assoc'_naturality [of "η ?c D F g" "τ0' ?b" "G f"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((η ?c D F g) D τ0' ?b D G f D G0 ?a) D
                         ((F0 ?c D F g) D τ0' ?b D G f D ε ?a)) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D τ0' ?b D G f) D ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f])
                  = (η ?c D F g) D τ0' ?b D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g"
                                    "τ0' ?b D G f" "τ0' ?b D 𝗋D[G f]"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                           ((η ?c D F g) D τ0' ?b D G f D G0 ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "τ0' ?b D 𝗋D[G f]" "τ0' ?b D G f D G0 ?a"]
            by simp
          finally have "((η ?c D F g) D τ0' ?b D G f) D
                        ((F0 ?c D F g) D τ0' ?b D 𝗋D[G f])
                          = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                            ((η ?c D F g) D τ0' ?b D G f D G0 ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((η ?c D F g) D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                         ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D τ0' ?b D G f D G0 ?a) D
                ((F0 ?c D F g) D τ0' ?b D G f D ε ?a)
                  = (η ?c D F g) D τ0' ?b D G f D ε ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g" "τ0' ?b D G f D G0 ?a"
                                    "τ0' ?b D G f D ε ?a"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                           ((η ?c D F g) D τ0' ?b D G f D τ0 ?a D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "τ0' ?b D G f D ε ?a" "τ0' ?b D G f D τ0 ?a D τ0' ?a"]
            by simp
          finally have "((η ?c D F g) D τ0' ?b D G f D G0 ?a) D
                        ((F0 ?c D F g) D τ0' ?b D G f D ε ?a)
                          = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                            ((η ?c D F g) D τ0' ?b D G f D τ0 ?a D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((η ?c D F g) D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])
                  = (η ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g" "τ0' ?b D G f D τ0 ?a D τ0' ?a"
                                    "τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                             ((η ?c D F g) D τ0' ?b D (G f D τ0 ?a) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]"
                                    "τ0' ?b D (G f D τ0 ?a) D τ0' ?a"]
            by simp
          finally have "((η ?c D F g) D τ0' ?b D G f D τ0 ?a D τ0' ?a) D
                        ((F0 ?c D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])
                          = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            ((η ?c D F g) D τ0' ?b D (G f D τ0 ?a) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (((η ?c D F g) D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                         ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])
                  = (η ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g" "τ0' ?b D (G f D τ0 ?a) D τ0' ?a"
                                    "𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                           ((η ?c D F g) D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]"
                                    "(τ0' ?b D (G f D τ0 ?a)) D τ0' ?a"]
            by simp
          finally have "((η ?c D F g) D τ0' ?b D (G f D τ0 ?a) D τ0' ?a) D
                        ((F0 ?c D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a])
                          = (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                            ((η ?c D F g) D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (((η ?c D F g) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                         ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                  = (η ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g"
                                    "(τ0' ?b D (G f D τ0 ?a)) D τ0' ?a"
                                    "(τ0' ?b D D.inv (τ1 f)) D τ0' ?a"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                           ((η ?c D F g) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "(τ0' ?b D D.inv (τ1 f)) D τ0' ?a"
                                    "(τ0' ?b D (τ0 ?b D F f)) D τ0' ?a"]
            by simp
          finally have "((η ?c D F g) D (τ0' ?b D (G f D τ0 ?a)) D τ0' ?a) D
                        ((F0 ?c D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                          = (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                            ((η ?c D F g) D (τ0' ?b D (τ0 ?b D F f)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f]) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (((η ?c D F g) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                         ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a)) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                  = (η ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g"
                                    "(τ0' ?b D τ0 ?b D F f) D τ0' ?a"
                                    "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"]
            by simp
          also have "... = (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                           ((η ?c D F g) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                    "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
                                    "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"]
            by simp
          finally have "((η ?c D F g) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                        ((F0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                          = (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                            ((η ?c D F g) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?c down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                         (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                         (𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f])) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                         (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((η ?c D F g) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                ((F0 ?c D F g) D (η ?b D F f) D τ0' ?a)
                  = (η ?c D F g) D (η ?b D F f) D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η ?c D F g" "F0 ?c D F g"
                                    "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"
                                    "(η ?b D F f) D τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f]) D
                        (𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D G0 ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a)) D
                        (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f] D
              (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝗋D[G f])
                 = ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f]) D
                   𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D G0 ?a]"
            using f g fg D.assoc'_naturality [of "(τ0' ?c D τ0 ?c) D F g" "τ0' ?b" "𝗋D[G f]"]
            by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f]) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a) D
                        (𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D τ0 ?a D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D G0 ?a] D
               (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D G f D ε ?a)
                 = ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a) D
                   𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D τ0 ?a D τ0' ?a]"
           using f g fg D.assoc'_naturality [of "(τ0' ?c D τ0 ?c) D F g" "τ0' ?b" "G f D ε ?a"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f]) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (G f D τ0 ?a) D τ0' ?a] D
                        ((((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, G f D τ0 ?a D τ0' ?a] D
               (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D 𝖺D[G f, τ0 ?a, τ0' ?a])
                 = ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                 𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (G f D τ0 ?a) D τ0' ?a]"
           using f g fg
                 D.assoc'_naturality [of "(τ0' ?c D τ0 ?c) D F g" "τ0' ?b" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f]) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (G f D τ0 ?a) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D D.inv (τ1 f) D τ0' ?a)) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
               (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                 = ((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a] D
                   ((τ0' ?b D D.inv (τ1 f)) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.whisker_left by simp
         also have "... = ((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f) D τ0' ?a) D
                          𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"
           using f g fg τ.iso_map1_ide
                 D.assoc_naturality [of "τ0' ?b" "D.inv (τ1 f)" "τ0' ?a"]
           by simp
         also have "... = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D D.inv (τ1 f) D τ0' ?a) D
                          (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])"
           using f g fg τ.iso_map1_ide D.whisker_left by simp
         finally have "(((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, G f D τ0 ?a, τ0' ?a]) D
                       (((τ0' ?c D τ0 ?c) D F g) D (τ0' ?b D D.inv (τ1 f)) D τ0' ?a)
                         = (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D D.inv (τ1 f) D τ0' ?a) D
                           (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f])) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (G f D τ0 ?a) D τ0' ?a] D
               (((τ0' ?c D τ0 ?c) D F g) D τ0' ?b D D.inv (τ1 f) D τ0' ?a)
                 = ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                   𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
           using f g fg τ.iso_map1_ide D.assoc'_naturality
                   [of "(τ0' ?c D τ0 ?c) D F g" "τ0' ?b" "D.inv (τ1 f) D τ0' ?a"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f]) D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D G0 ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a)) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
               ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f])
                 = (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D 𝗋D[G f]"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "((τ0' ?c D τ0 ?c) D F g) D τ0' ?b"
                                   "G f" "𝗋D[G f]"]
           by simp
         also have "... = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f]) D
                          ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D G0 ?a)"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "𝗋D[G f]" "G f D G0 ?a"]
           by simp
         finally have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f) D
                       ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝗋D[G f])
                         = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f]) D
                           ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D G0 ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a) D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D G0 ?a) D
               ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a)
                 = (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D ε ?a"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "((τ0' ?c D τ0 ?c) D F g) D τ0' ?b"
                                   "G f D G0 ?a" "G f D ε ?a"]
           by simp
         also have "... = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a) D
                          ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D τ0 ?a D τ0' ?a)"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "G f D ε ?a" "G f D τ0 ?a D τ0' ?a"]
           by simp
         finally have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D G0 ?a) D
                       ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D G f D ε ?a)
                         = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a) D
                           ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D τ0 ?a D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                        ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
               ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                 = (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "((τ0' ?c D τ0 ?c) D F g) D τ0' ?b"
                                   "G f D τ0 ?a D τ0' ?a"
                                   "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         also have "... = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                          ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "𝖺D[G f, τ0 ?a, τ0' ?a]"
                                   "(G f D τ0 ?a) D τ0' ?a"]
           by simp
         finally have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                       ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                         = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        ((((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f])) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
               ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                 = (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D D.inv (τ1 f) D τ0' ?a"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "((τ0' ?c D τ0 ?c) D F g) D τ0' ?b"
                                   "(G f D τ0 ?a) D τ0' ?a"
                                   "D.inv (τ1 f) D τ0' ?a"]
           by simp
         also have "... = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                          ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b"
                                   "D.inv (τ1 f) D τ0' ?a"
                                   "(τ0 ?b D F f) D τ0' ?a"]
           by simp
         finally have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                       ((((τ0' ?c D τ0 ?c) D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                         = (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                           ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        ((((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D G0 ?a) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a)) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
               (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f])
                 = ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D 𝗋D[G f]"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "G f" "𝗋D[G f]"]
           by simp
         also have "... = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                          (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D G0 ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                   "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "𝗋D[G f]" "G f D G0 ?a"]
           by simp
         finally have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f) D
                       (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝗋D[G f])
                         = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                           (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D G0 ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        ((((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D G0 ?a) D
               (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a)
                 = ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D ε ?a"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "G f D G0 ?a" "G f D ε ?a"]
           by simp
         also have "... = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                          (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D τ0 ?a D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                   "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "G f D ε ?a" "G f D τ0 ?a D τ0' ?a"]
           by simp
         finally have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D G0 ?a) D
                       (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D G f D ε ?a)
                         = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                           (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D τ0 ?a D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        ((((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                        (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
               (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                 = ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "G f D τ0 ?a D τ0' ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         also have "... = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                          (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                   "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "𝖺D[G f, τ0 ?a, τ0' ?a]" "(G f D τ0 ?a) D τ0' ?a"]
           by simp
         finally have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                       (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                         = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
               (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                 = ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "(τ0' ?c D τ0 ?c D F g) D τ0' ?b"
                                   "(G f D τ0 ?a) D τ0' ?a" "D.inv (τ1 f) D τ0' ?a"]
           by simp
         also have "... = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                          (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                   "(τ0' ?c D D.inv (τ1 g)) D τ0' ?b"
                                   "D.inv (τ1 f) D τ0' ?a" "(τ0 ?b D F f) D τ0' ?a"]
           by simp
         finally have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                       (((τ0' ?c D τ0 ?c D F g) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                         = (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                           (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D τ0 ?c D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b D (τ0 ?b D F f) D τ0' ?a)) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
               𝖺D-1[(τ0' ?c D τ0 ?c) D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a]
                 = 𝖺D-1[τ0' ?c D τ0 ?c D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                   (𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b D (τ0 ?b D F f) D τ0' ?a)"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.assoc'_naturality [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "τ0' ?b"
                                         "(τ0 ?b D F f) D τ0' ?a"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D τ0 ?c D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                        (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b D (τ0 ?b D F f) D τ0' ?a) D
               (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])
                 = 𝖺D[τ0' ?c, τ0 ?c, F g] D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "(τ0' ?c D τ0 ?c) D F g"
                                   "τ0' ?b D (τ0 ?b D F f) D τ0' ?a"
                                   "𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"]
           by simp
         also have "... = ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                          (𝖺D[τ0' ?c, τ0 ?c, F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D τ0 ?c D F g" "𝖺D[τ0' ?c, τ0 ?c, F g]"
                                   "𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"
                                   "(τ0' ?b D (τ0 ?b D F f)) D τ0' ?a"]
           by simp
         finally have "(𝖺D[τ0' ?c, τ0 ?c, F g] D τ0' ?b D (τ0 ?b D F f) D τ0' ?a) D
                       (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])
                         = ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                           (𝖺D[τ0' ?c, τ0 ?c, F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        ((((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D τ0 ?c D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a]) D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, τ0 ?c, F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
               (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                 = 𝖺D[τ0' ?c, τ0 ?c, F g] D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "(τ0' ?c D τ0 ?c) D F g"
                                   "(τ0' ?b D τ0 ?b D F f) D τ0' ?a"
                                   "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"]
           by simp
         also have "... = ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                          (𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D τ0 ?c D F g" "𝖺D[τ0' ?c, τ0 ?c, F g]"
                                   "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
                                   "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"]
           by simp
         finally have "(𝖺D[τ0' ?c, τ0 ?c, F g] D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                       (((τ0' ?c D τ0 ?c) D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                         = ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                           (𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        (((τ0' ?c D D.inv (τ1 g)) D τ0' ?b D (τ0 ?b D F f) D τ0' ?a) D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])) D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D D.inv (τ1 g)) D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
               𝖺D-1[τ0' ?c D τ0 ?c D F g, τ0' ?b, (τ0 ?b D F f) D τ0' ?a]
                 = 𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                   ((τ0' ?c D D.inv (τ1 g)) D τ0' ?b D (τ0 ?b D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide
                 D.assoc'_naturality
                   [of "τ0' ?c D D.inv (τ1 g)" "τ0' ?b" "(τ0 ?b D F f) D τ0' ?a"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        (((τ0' ?c D D.inv (τ1 g)) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                        ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D D.inv (τ1 g)) D τ0' ?b D (τ0 ?b D F f) D τ0' ?a) D
               ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])
                 = (τ0' ?c D D.inv (τ1 g)) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D D.inv (τ1 g)" "τ0' ?c D τ0 ?c D F g"
                                   "τ0' ?b D (τ0 ?b D F f) D τ0' ?a"
                                   "𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"]
           by simp
         also have "... = ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                          ((τ0' ?c D D.inv (τ1 g)) D (τ0' ?b D (τ0 ?b D F f)) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D G g D τ0 ?b" "τ0' ?c D D.inv (τ1 g)"
                                   "𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]"
                                   "(τ0' ?b D (τ0 ?b D F f)) D τ0' ?a"]
           by simp
         finally have "((τ0' ?c D D.inv (τ1 g)) D τ0' ?b D (τ0 ?b D F f) D τ0' ?a) D
                       ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a])
                         = ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                           ((τ0' ?c D D.inv (τ1 g)) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move D.inv (τ1 g) down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        ((η ?c D F g) D (η ?b D F f) D τ0' ?a)) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D D.inv (τ1 g)) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
               ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                 = (τ0' ?c D D.inv (τ1 g)) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D D.inv (τ1 g)" "τ0' ?c D τ0 ?c D F g"
                                   "(τ0' ?b D τ0 ?b D F f) D τ0' ?a"
                                   "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"]
           by simp
         also have "... = ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                          ((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "τ0' ?c D G g D τ0 ?b" "τ0' ?c D D.inv (τ1 g)"
                                   "𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a"
                                   "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"]
           by simp
         finally have "((τ0' ?c D D.inv (τ1 g)) D (τ0' ?b D τ0 ?b D F f) D τ0' ?a) D
                       ((τ0' ?c D τ0 ?c D F g) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a)
                         = ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                           ((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move η ?b up. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        (((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?b D F f) D τ0' ?a)) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
               ((η ?c D F g) D (η ?b D F f) D τ0' ?a)
                 = 𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?c D F g) D
                   (((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D ((η ?b D F f) D τ0' ?a)"
           using f g fg
                 D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "η ?c D F g"
                                   "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a"
                                   "(η ?b D F f) D τ0' ?a"]
           by simp
         also have "... = 𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?c D F g) D ((η ?b D F f) D τ0' ?a)"
           using f g fg D.comp_cod_arr by simp
         also have "... = 𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?c D F g) D
                          ((η ?b D F f) D τ0' ?a) D ((F0 ?b D F f) D τ0' ?a)"
           using f g fg D.comp_arr_dom by simp
         also have "... = (𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?b D F f) D τ0' ?a) D
                          ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a)"
          using f g fg ** D.interchange by auto
         finally have "(𝖺D[τ0' ?c, τ0 ?c, F g] D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                       ((η ?c D F g) D (η ?b D F f) D τ0' ?a)
                         = (𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?b D F f) D τ0' ?a) D
                           ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move η ?b up. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        (((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f)) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
               (𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?b D F f) D τ0' ?a)
                 = (τ0' ?c D D.inv (τ1 g)) D 𝖺D[τ0' ?c, τ0 ?c, F g] D ((η ?b D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_cod_arr
                 D.interchange
                   [of "τ0' ?c D D.inv (τ1 g)" "𝖺D[τ0' ?c, τ0 ?c, F g]"
                       "((τ0' ?b D τ0 ?b) D F f) D τ0' ?a" "(η ?b D F f) D τ0' ?a"]
           by simp
         also have "... = ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                          (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a)"
           using f g fg τ.iso_map1_ide D.comp_arr_dom
                 D.interchange
                   [of "τ0' ?c D D.inv (τ1 g)" "𝖺D[τ0' ?c, τ0 ?c, F g]"
                       "(η ?b D F f) D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
           by simp
         finally have "((τ0' ?c D D.inv (τ1 g)) D ((τ0' ?b D τ0 ?b) D F f) D τ0' ?a) D
                       (𝖺D[τ0' ?c, τ0 ?c, F g] D (η ?b D F f) D τ0' ?a)
                         = ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                           (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move ε ?b down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        (((τ0' ?c D G g D ε ?b) D G f) D
                        (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)) D
                        (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f) D
                        ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
               (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f)
                 = (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f"
           using f g fg D.whisker_right by simp
         also have "... = 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D
                          (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f"
           using f g fg D.pentagon
                 D.invert_side_of_triangle(2)
                   [of "𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                        "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                        "𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b"]
                 D.comp_assoc
           by simp
         also have "... = (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f) D
                          (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f) D
                          ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f)"
           using f g fg D.whisker_right by simp
         finally have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                       (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f)
                         = (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f) D
                           (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f) D
                           ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move ε ?b down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        (𝖺D[τ0' ?c, G g, G0 ?b] D G f) D
                        (((τ0' ?c D G g) D ε ?b) D G f) D
                        ((𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f) D
                        ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f)) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D G g D ε ?b) D G f) D (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)
                 = (τ0' ?c D G g D ε ?b) D 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f"
           using f g fg D.whisker_right [of "G f"] by simp
         also have "... = 𝖺D[τ0' ?c, G g, G0 ?b] D ((τ0' ?c D G g) D ε ?b) D G f"
           using f g fg D.assoc_naturality [of "τ0' ?c" "G g" "ε ?b"] by simp
         also have "... = (𝖺D[τ0' ?c, G g, G0 ?b] D G f) D (((τ0' ?c D G g) D ε ?b) D G f)"
           using f g fg * D.whisker_right [of "G f"] by simp
         finally have "((τ0' ?c D G g D ε ?b) D G f) D
                       (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)
                         = (𝖺D[τ0' ?c, G g, G0 ?b] D G f) D (((τ0' ?c D G g) D ε ?b) D G f)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Prepare to move ε ?b down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        (𝖺D[τ0' ?c, G g, G0 ?b] D G f) D
                        ((((τ0' ?c D G g) D ε ?b) D G f) D
                        (𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D
               (𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b)
                 = 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
           using f g fg D.pentagon by simp
         hence "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]
                  = 𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                    𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D (𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b)"
           using f g fg D.comp_assoc D.invert_side_of_triangle(1) by simp
         hence "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b)
                  = 𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                    𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
           using f g fg D.comp_assoc
                 D.invert_side_of_triangle(2)
                   [of "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                       "𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                          𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                       "𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b"]
           by simp
         hence "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f
                  = 𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D
                    𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f"
           using f g fg D.whisker_right by simp
         hence "(𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f) D
                ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f)
                  = (𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f) D
                    ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                    (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f)"
           using f g fg D.whisker_right by simp
        thus ?thesis
          using D.comp_assoc by simp
       qed
       (* Move ε ?b down *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        (((𝖺D[τ0' ?c, G g, G0 ?b] D G f) D
                        (𝖺D-1[τ0' ?c, G g, G0 ?b] D G f)) D
                        ((τ0' ?c D G g D ε ?b) D G f)) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D G g) D ε ?b) D G f) D
               (𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)
                 = ((τ0' ?c D G g) D ε ?b) D 𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f"
           using f g fg D.whisker_right by simp
         also have "... = 𝖺D-1[τ0' ?c, G g, G0 ?b] D (τ0' ?c D G g D ε ?b) D G f"
           using f g fg D.assoc'_naturality [of "τ0' ?c" "G g" "ε ?b"] by simp
         also have "... = (𝖺D-1[τ0' ?c, G g, G0 ?b] D G f) D ((τ0' ?c D G g D ε ?b) D G f)"
           using f g fg * D.whisker_right by simp
         finally have "(((τ0' ?c D G g) D ε ?b) D G f) D
                       (𝖺D-1[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f)
                         = (𝖺D-1[τ0' ?c, G g, G0 ?b] D G f) D ((τ0' ?c D G g D ε ?b) D G f)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* There is a cancellation of associativities here. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        ((𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, G g, G0 ?b] D G f) D (𝖺D-1[τ0' ?c, G g, G0 ?b] D G f)
                 = (τ0' ?c D G g D G0 ?b) D G f"
           using f g fg * D.comp_arr_inv' D.whisker_right
           by (metis C.ideD(1) C.obj_trg D.comp_assoc_assoc'(1) D.hcomp_simps(2) D.hseqI'
               D.ideD(1) G.map0_simps(3) G.preserves_ide G.preserves_src G.preserves_trg
               map0_simps(1-2))
         moreover have "((τ0' ?c D G g D G0 ?b) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f)
                          = (τ0' ?c D G g D ε ?b) D G f"
           using f g fg D.comp_cod_arr by simp
         ultimately have "((𝖺D[τ0' ?c, G g, G0 ?b] D G f) D
                          (𝖺D-1[τ0' ?c, G g, G0 ?b] D G f)) D
                          ((τ0' ?c D G g D ε ?b) D G f)
                            = (τ0' ?c D G g D ε ?b) D G f"
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move 𝗋D[G f] up. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D G f) D
                        ((τ0' ?c D G g D ε ?b) D G f) D
                        (((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])) D
                        (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                        ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                        ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])
                  = 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                                    "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                    "G f" "𝗋D[G f]"]
            by simp
          also have "... = ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                           (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D (G g D τ0 ?b) D τ0' ?b"
                                    "𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                                    "𝗋D[G f]" "G f D G0 ?a"]
            by simp
          finally have "(𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])
                          = ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f]) D
                            (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a)"
            by blast
          thus ?thesis
            using f g fg D.comp_assoc by simp
        qed
        (* Move 𝗋D[G f] up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         (((τ0' ?c D G g D ε ?b) D G f) D
                         ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D 𝗋D[G f])) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])
                  = (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]"
                                    "τ0' ?c D (G g D τ0 ?b) D τ0' ?b"
                                    "G f" "𝗋D[G f]"]
            by simp
          also have "... = ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D 𝗋D[G f]) D
                           ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D τ0 ?b D τ0' ?b"
                                    "τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]"
                                    "𝗋D[G f]" "G f D G0 ?a"]
            by simp
          finally have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f) D
                        ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D 𝗋D[G f])
                          = ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D 𝗋D[G f]) D
                            ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗋D[G f] up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D ε ?b) D G f D G0 ?a) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a) D
                         ((𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g D ε ?b) D G f) D
                ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D 𝗋D[G f])
                  = (τ0' ?c D G g D ε ?b) D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D ε ?b" "τ0' ?c D G g D τ0 ?b D τ0' ?b"
                                    "G f" "𝗋D[G f]"]
            by simp
          also have "... = ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                           ((τ0' ?c D G g D ε ?b) D G f D G0 ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D G0 ?b" "τ0' ?c D G g D ε ?b"
                                    "𝗋D[G f]" "G f D G0 ?a"]
            by simp
          finally have "((τ0' ?c D G g D ε ?b) D G f) D
                        ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D 𝗋D[G f])
                          = ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                            ((τ0' ?c D G g D ε ?b) D G f D G0 ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move ε ?a up. The useful effect is on the associativity part of the term. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D ε ?b) D G f D G0 ?a) D
                         (((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a) D
                         ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a) D
                (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)
                  = 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D ε ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                                    "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                    "G f D G0 ?a" "G f D ε ?a"]
            by simp
          also have "... = ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                           (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D (G g D τ0 ?b) D τ0' ?b"
                                    "𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                                    "G f D ε ?a" "G f D τ0 ?a D τ0' ?a"]
            by simp
          finally have "(𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D G0 ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)
                          = ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D G f D ε ?a) D
                            (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a)"
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move ε ?a up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         (((τ0' ?c D G g D ε ?b) D G f D G0 ?a) D
                         ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D G f D ε ?a)) D
                         ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D τ0 ?a D τ0' ?a) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a) D
                ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)
                  = (τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D ε ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]"
                                    "τ0' ?c D (G g D τ0 ?b) D τ0' ?b"
                                    "G f D G0 ?a" "G f D ε ?a"]
            by simp
          also have "... = ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D G f D ε ?a) D
                           ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D τ0 ?a D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D τ0 ?b D τ0' ?b"
                                    "τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]"
                                    "G f D ε ?a" "G f D τ0 ?a D τ0' ?a"]
            by simp
          finally have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D G0 ?a) D
                        ((τ0' ?c D (G g D τ0 ?b) D τ0' ?b) D G f D ε ?a)
                          = ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D G f D ε ?a) D
                            ((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D τ0 ?a D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move ε ?a up and ε ?b down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         ((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D τ0 ?a D τ0' ?a) D
                         (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a)) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g D ε ?b) D G f D G0 ?a) D
                ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D G f D ε ?a)
                  = (τ0' ?c D G g D ε ?b) D G f D ε ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D ε ?b"
                                    "τ0' ?c D G g D τ0 ?b D τ0' ?b"
                                    "G f D G0 ?a" "G f D ε ?a"]
            by simp
          also have "... = ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                           ((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D G0 ?b"
                                    "τ0' ?c D G g D ε ?b"
                                    "G f D ε ?a" "G f D τ0 ?a D τ0' ?a"]
            by simp
          finally have "((τ0' ?c D G g D ε ?b) D G f D G0 ?a) D
                        ((τ0' ?c D G g D τ0 ?b D τ0' ?b) D G f D ε ?a)
                          = ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                            ((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Prepare to move ε ?b down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                         (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f D τ0 ?a D τ0' ?a)) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D G f D τ0 ?a D τ0' ?a) D
                (𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a)
                  = (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                    (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                    ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f D τ0 ?a D τ0' ?a)"
          proof -
            have "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b] D
                  (𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b)
                    = 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
              using f g fg D.pentagon by simp
            hence "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]
                     = 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D
                       (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b)"
              using f g fg D.comp_assoc
                    D.invert_side_of_triangle(2)
                      [of "𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                          "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]"
                          "𝖺D[τ0' ?c, G g, τ0 ?b] D τ0' ?b"]
              by simp
            hence "(τ0' ?c D 𝖺D[G g, τ0 ?b, τ0' ?b]) D 𝖺D[τ0' ?c, G g D τ0 ?b, τ0' ?b]
                       D G f D τ0 ?a D τ0' ?a
                     = 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D
                       (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b)
                           D G f D τ0 ?a D τ0' ?a"
              by simp
            thus ?thesis
              using f g fg D.whisker_right by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move ε ?b down. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f D τ0 ?a D τ0' ?a)
                  = (τ0' ?c D G g D ε ?b) D 𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b]
                        D G f D τ0 ?a D τ0' ?a"
            using f g fg D.whisker_right by simp
          also have "... = 𝖺D[τ0' ?c, G g, G0 ?b] D ((τ0' ?c D G g) D ε ?b)
                              D G f D τ0 ?a D τ0' ?a"
            using f g fg D.assoc_naturality [of "τ0' ?c" "G g" "ε ?b"] by simp
          also have "... = (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                           (((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a)"
            using f g fg * D.whisker_right by simp
          finally have "((τ0' ?c D G g D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                        (𝖺D[τ0' ?c, G g, τ0 ?b D τ0' ?b] D G f D τ0 ?a D τ0' ?a)
                          = (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                            (((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Prepare to move D.inv (τ1 f) up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                         ((𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                         ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                  = ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b"
                                    "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                    "G f D τ0 ?a D τ0' ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "((τ0' ?c D G g) D τ0 ?b) D τ0' ?b"
                                    "𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b"
                                    "𝖺D[G f, τ0 ?a, τ0' ?a]" "(G f D τ0 ?a) D τ0' ?a"]
            by simp
          finally have "((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D G f D τ0 ?a D τ0' ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                          = ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Prepare to move D.inv (τ1 f) up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         ((((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                  = 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                                    "((τ0' ?c D G g) D τ0 ?b) D τ0' ?b"
                                    "G f D τ0 ?a D τ0' ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D τ0 ?b D τ0' ?b"
                                    "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                                    "𝖺D[G f, τ0 ?a, τ0' ?a]" "(G f D τ0 ?a) D τ0' ?a"]
            by simp
          finally have "(𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D G f D τ0 ?a D τ0' ?a) D
                        ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                          = (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Prepare to move D.inv (τ1 f) up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a) D
                         (((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                  = ((τ0' ?c D G g) D ε ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D ε ?b" "(τ0' ?c D G g) D τ0 ?b D τ0' ?b"
                                    "G f D τ0 ?a D τ0' ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          also have "... = (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                           (((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D G0 ?b" "(τ0' ?c D G g) D ε ?b"
                                    "𝖺D[G f, τ0 ?a, τ0' ?a]" "(G f D τ0 ?a) D τ0' ?a"]
            by simp
          finally have "(((τ0' ?c D G g) D ε ?b) D G f D τ0 ?a D τ0' ?a) D
                        (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                          = (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            (((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move D.inv (τ1 f) up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         ((𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a) D
                         ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                  = (𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D D.inv (τ1 f) D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b"
                                    "(τ0' ?c D G g D τ0 ?b) D τ0' ?b"
                                    "(G f D τ0 ?a) D τ0' ?a" "D.inv (τ1 f) D τ0' ?a"]
            by simp
          also have "... = ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                           ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "((τ0' ?c D G g) D τ0 ?b) D τ0' ?b"
                                    "𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b"
                                    "D.inv (τ1 f) D τ0' ?a" "(τ0 ?b D F f) D τ0' ?a"]
            by simp
          finally have "((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (G f D τ0 ?a) D τ0' ?a) D
                        (((τ0' ?c D G g D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                          = ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                            ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move D.inv (τ1 f) up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a) D
                         (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a) D
                ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                  = 𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D D.inv (τ1 f) D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                                    "((τ0' ?c D G g) D τ0 ?b) D τ0' ?b"
                                    "(G f D τ0 ?a) D τ0' ?a" "D.inv (τ1 f) D τ0' ?a"]
            by simp
          also have "... = (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                           (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D τ0 ?b D τ0' ?b"
                                    "𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b]"
                                    "D.inv (τ1 f) D τ0' ?a" "(τ0 ?b D F f) D τ0' ?a"]
            by simp
          finally have "(𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (G f D τ0 ?a) D τ0' ?a) D
                        ((((τ0' ?c D G g) D τ0 ?b) D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                          = (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D D.inv (τ1 f) D τ0' ?a) D
                            (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move D.inv (τ1 f) up across ε ?b. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a) D
                (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                  = ((τ0' ?c D G g) D ε ?b) D D.inv (τ1 f) D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D ε ?b" "(τ0' ?c D G g) D τ0 ?b D τ0' ?b"
                                    "(G f D τ0 ?a) D τ0' ?a" "D.inv (τ1 f) D τ0' ?a"]
            by simp
          also have "... = (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                           (((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D G0 ?b" "(τ0' ?c D G g) D ε ?b"
                                    "D.inv (τ1 f) D τ0' ?a" "(τ0 ?b D F f) D τ0' ?a"]
            by simp
          finally have "(((τ0' ?c D G g) D ε ?b) D (G f D τ0 ?a) D τ0' ?a) D
                        (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D D.inv (τ1 f) D τ0' ?a)
                          = (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                            (((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move η ?b up. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         ((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D D.inv (τ1 g)) D (η ?b D F f) D τ0' ?a
                  = ((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                    ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D τ0 ?b" "τ0' ?c D D.inv (τ1 g)"
                                    "(η ?b D F f) D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (*
         * Introduce associativities to align (ε ?b ⋆D τ0 ?b) with
         * (τ0 ?b ⋆D η ?b) in the middle.
         *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                         ((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                         (((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                         ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                         ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                         ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                         𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                         ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a])) D
                         ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a) D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a
                  = 𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                    ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                    ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                    ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                    𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
          proof -
            have "((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a
                    = (((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a) D
                      (((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a)"
              using f g fg D.comp_arr_dom by simp
            also have "... = ((((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a) D
                             𝖺D-1[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "𝖺D-1[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                    ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                    ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                    𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]
                      = 𝖺-1[τ0' ?c  G g, τ0 ?b  τ0' ?b, (τ0 ?b  F f)  τ0' ?a] 
                         ((τ0' ?c  G g)  (τ0 ?b  τ0' ?b)  𝖺-1[τ0 ?b, F f, τ0' ?a]) 
                         ((τ0' ?c  G g)  𝖺[τ0 ?b  τ0' ?b, τ0 ?b, F f  τ0' ?a]) 
                         ((τ0' ?c  G g)  𝖺-1[τ0 ?b  τ0' ?b, τ0 ?b, F f  τ0' ?a]) 
                         ((τ0' ?c  G g)  (τ0 ?b  τ0' ?b)  𝖺[τ0 ?b, F f, τ0' ?a]) 
                         𝖺[τ0' ?c  G g, τ0 ?b  τ0' ?b, (τ0 ?b  F f)  τ0' ?a]"
                using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                      D.VV.ide_charSbC D.VV.arr_charSbC
                by simp
              also have "... =
                         ((τ0' ?c  G g)  τ0 ?b  τ0' ?b)  (τ0 ?b  F f)  τ0' ?a"
                using f g fg by (intro EV.eval_eqI, auto)
              also have "... = ((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a"
                using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_char D.VVV.arr_charSbC
                      D.VV.ide_charSbC D.VV.arr_charSbC
                by simp
              finally have "𝖺D-1[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                            ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                            ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                            ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                            ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                            𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]
                              = ((τ0' ?c D G g) D τ0 ?b D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                             (((τ0' ?c D G g) D ε ?b D (τ0 ?b D F f) D τ0' ?a) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a])) D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "(((τ0' ?c D G g) D ε ?b) D (τ0 ?b D F f) D τ0' ?a) D
                    𝖺D-1[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]
                      = 𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                        ((τ0' ?c D G g) D ε ?b D (τ0 ?b D F f) D τ0' ?a)"
                using f g fg
                      D.assoc'_naturality [of "τ0' ?c D G g" "ε ?b" "(τ0 ?b D F f) D τ0' ?a"]
                by auto
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                             ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                             (((τ0' ?c D G g) D ε ?b D τ0 ?b D F f D τ0' ?a) D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a])) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "((τ0' ?c D G g) D ε ?b D (τ0 ?b D F f) D τ0' ?a) D
                    ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a])
                      = ((τ0' ?c D G g) D ε ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a])"
                using f g fg * D.comp_arr_dom D.comp_cod_arr D.whisker_left
                      D.interchange [of "ε ?b" "(τ0 ?b D τ0' ?b)" "(τ0 ?b D F f) D τ0' ?a"
                                        "𝖺D-1[τ0 ?b, F f, τ0' ?a]"]
                by simp
              also have "... = ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                               ((τ0' ?c D G g) D ε ?b D τ0 ?b D F f D τ0' ?a)"
                using f g fg * D.comp_arr_dom D.comp_cod_arr D.whisker_left
                      D.interchange [of "G0 ?b" "ε ?b" "𝖺D-1[τ0 ?b, F f, τ0' ?a]"
                                        "τ0 ?b D F f D τ0' ?a"]
                by simp
              finally have "((τ0' ?c D G g) D ε ?b D (τ0 ?b D F f) D τ0' ?a) D
                            ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D-1[τ0 ?b, F f, τ0' ?a])
                              = ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                                ((τ0' ?c D G g) D ε ?b D τ0 ?b D F f D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                             ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "((τ0' ?c D G g) D ε ?b D τ0 ?b D F f D τ0' ?a) D
                    ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a])
                      = (τ0' ?c D G g) D
                          (ε ?b D τ0 ?b D F f D τ0' ?a) D
                          𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]"
                using f g fg D.whisker_left by simp
              also have "... = (τ0' ?c D G g) D
                                 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a] D
                                 ((ε ?b D τ0 ?b) D F f D τ0' ?a)"
                using f g fg D.assoc_naturality [of "ε ?b" "τ0 ?b" "F f D τ0' ?a"]
                by simp
              also have "... = ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                               ((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a)"
                using f g fg * D.whisker_left by simp
              finally have "((τ0' ?c D G g) D ε ?b D τ0 ?b D F f D τ0' ?a) D
                            ((τ0' ?c D G g) D 𝖺D[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a])
                              = ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                                ((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            finally show ?thesis by simp
          qed
          moreover
          have "(τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a
                  = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                    𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                    ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a) D
                    ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                    𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                    (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])"
          proof -
            have "(τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a
                    = ((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                      ((τ0' ?c D G g D τ0 ?b) D (F0 ?b D F f) D τ0' ?a)"
              using f g fg ** D.comp_arr_dom by simp
            also have "... = (((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                             (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[F0 ?b, F f, τ0' ?a])) D
                             𝖺D-1[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                             (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])"

            proof -
              have "(𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[F0 ?b, F f, τ0' ?a]) D
                    𝖺D-1[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                    ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                    ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                    𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                    (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])
                      = (𝖺[τ0' ?c, G g, τ0 ?b]  𝖺-1[F0 ?b0, F f, τ0' ?a]) 
                         𝖺-1[τ0' ?c  G g, τ0 ?b, F0 ?b0  F f  τ0' ?a] 
                         ((τ0' ?c  G g)  𝖺[τ0 ?b, F0 ?b0, F f  τ0' ?a]) 
                         ((τ0' ?c  G g)  𝖺-1[τ0 ?b, F0 ?b0, F f  τ0' ?a]) 
                         𝖺[τ0' ?c  G g, τ0 ?b, F0 ?b0  F f  τ0' ?a] 
                         (𝖺-1[τ0' ?c, G g, τ0 ?b]  𝖺[F0 ?b0, F f, τ0' ?a])"
                using f g fg ** D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                      D.VV.ide_charSbC D.VV.arr_charSbC
                by simp
              also have "... = (τ0' ?c  G g  τ0 ?b)  (F0 ?b0  F f)  τ0' ?a"
                using f g fg by (intro EV.eval_eqI, auto)
              also have "... = (τ0' ?c D G g D τ0 ?b) D (F0 ?b D F f) D τ0' ?a"
                using f g fg ** D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                      D.VV.ide_charSbC D.VV.arr_charSbC
                by simp
              finally have "(𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[F0 ?b, F f, τ0' ?a]) D
                            𝖺D-1[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                            ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                            ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                            𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                            (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])
                              = (τ0' ?c D G g D τ0 ?b) D (F0 ?b D F f) D τ0' ?a"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                             ((((τ0' ?c D G g) D τ0 ?b) D η ?b D F f D τ0' ?a) D
                             𝖺D-1[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                             (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])"
            proof -
              have "((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                    (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[F0 ?b, F f, τ0' ?a])
                    = 𝖺D[τ0' ?c, G g, τ0 ?b] D
                        ((η ?b D F f) D τ0' ?a) D 𝖺D-1[F0 ?b, F f, τ0' ?a]"
                using f g fg ** D.comp_arr_dom D.comp_cod_arr
                      D.interchange [of "τ0' ?c D G g D τ0 ?b" "𝖺D[τ0' ?c, G g, τ0 ?b]"
                                        "(η ?b D F f) D τ0' ?a" "𝖺D-1[F0 ?b, F f, τ0' ?a]"]
                by simp
              also have "... = 𝖺D[τ0' ?c, G g, τ0 ?b] D
                                 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a] D
                                 (η ?b D F f D τ0' ?a)"
                using f g fg ** D.assoc'_naturality [of "η ?b" "F f" "τ0' ?a"]
                by simp
              also have "... = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                               (((τ0' ?c D G g) D τ0 ?b) D η ?b D F f D τ0' ?a)"
                using f g fg ** D.comp_arr_dom D.comp_cod_arr
                      D.interchange [of "𝖺D[τ0' ?c, G g, τ0 ?b]" "(τ0' ?c D G g) D τ0 ?b"
                                        "𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]"
                                        "η ?b D F f D τ0' ?a"]
                by simp
              finally have "((τ0' ?c D G g D τ0 ?b) D (η ?b D F f) D τ0' ?a) D
                            (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[F0 ?b, F f, τ0' ?a])
                              = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                                (((τ0' ?c D G g) D τ0 ?b) D η ?b D F f D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                             𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                             (((τ0' ?c D G g) D τ0 ?b D η ?b D F f D τ0' ?a) D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a])) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                             (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])"
            proof -
              have "(((τ0' ?c D G g) D τ0 ?b) D η ?b D F f D τ0' ?a) D
                    𝖺D-1[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a]
                      = 𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                        ((τ0' ?c D G g) D τ0 ?b D η ?b D F f D τ0' ?a)"
                using f g fg D.assoc'_naturality [of "τ0' ?c D G g" "τ0 ?b"
                                                     "η ?b D F f D τ0' ?a"]
                by force
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                             𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                             ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a]) D
                             ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a) D
                             ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                             𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                             (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])"
            proof -
              have "((τ0' ?c D G g) D τ0 ?b D η ?b D F f D τ0' ?a) D
                    ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a])
                      = (τ0' ?c D G g) D
                          (τ0 ?b D η ?b D F f D τ0' ?a) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a]"
                using f g fg ** D.whisker_left by auto
              also have "... = (τ0' ?c D G g) D
                                  𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a] D
                                  ((τ0 ?b D η ?b) D F f D τ0' ?a)"
                using f g fg ** D.assoc_naturality [of "τ0 ?b" "η ?b" "F f D τ0' ?a"]
                by auto
              also have "... = ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a]) D
                               ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a)"
                using f g fg ** D.whisker_left by auto
              finally have "((τ0' ?c D G g) D τ0 ?b D η ?b D F f D τ0' ?a) D
                            ((τ0' ?c D G g) D 𝖺D[τ0 ?b, F0 ?b, F f D τ0' ?a])
                              = ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a]) D
                                ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            finally show ?thesis by blast
          qed
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        (* Cancel out all the intervening associativities. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                         (((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a) D
                         ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a)) D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a])
                  = (τ0' ?c D G g) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a"
          proof -
            have "((τ0' ?c D G g) D 𝖺D-1[τ0 ?b D τ0' ?b, τ0 ?b, F f D τ0' ?a]) D
                  ((τ0' ?c D G g) D (τ0 ?b D τ0' ?b) D 𝖺D[τ0 ?b, F f, τ0' ?a]) D
                  𝖺D[τ0' ?c D G g, τ0 ?b D τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                  (𝖺D[τ0' ?c D G g, τ0 ?b, τ0' ?b] D (τ0 ?b D F f) D τ0' ?a) D
                  ((𝖺D-1[τ0' ?c, G g, τ0 ?b] D τ0' ?b) D (τ0 ?b D F f) D τ0' ?a) D
                  𝖺D-1[τ0' ?c D G g D τ0 ?b, τ0' ?b, (τ0 ?b D F f) D τ0' ?a] D
                  ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b D F f, τ0' ?a]) D
                  ((τ0' ?c D G g D τ0 ?b) D 𝖺D[τ0' ?b, τ0 ?b, F f] D τ0' ?a) D
                  (𝖺D[τ0' ?c, G g, τ0 ?b] D 𝖺D-1[τ0' ?b D τ0 ?b, F f, τ0' ?a]) D
                  𝖺D-1[τ0' ?c D G g, τ0 ?b, (τ0' ?b D τ0 ?b) D F f D τ0' ?a] D
                  ((τ0' ?c D G g) D 𝖺D[τ0 ?b, τ0' ?b D τ0 ?b, F f D τ0' ?a])
                    = ((τ0' ?c  G g)  𝖺-1[τ0 ?b  τ0' ?b, τ0 ?b, F f  τ0' ?a]) 
                       ((τ0' ?c  G g)  (τ0 ?b  τ0' ?b)  𝖺[τ0 ?b, F f, τ0' ?a]) 
                       𝖺[τ0' ?c  G g, τ0 ?b  τ0' ?b, (τ0 ?b  F f)  τ0' ?a] 
                       (𝖺[τ0' ?c  G g, τ0 ?b, τ0' ?b]  (τ0 ?b  F f)  τ0' ?a) 
                       ((𝖺-1[τ0' ?c, G g, τ0 ?b]  τ0' ?b)  (τ0 ?b  F f)  τ0' ?a) 
                       𝖺-1[τ0' ?c  G g  τ0 ?b, τ0' ?b, (τ0 ?b  F f)  τ0' ?a] 
                       ((τ0' ?c  G g  τ0 ?b)  𝖺[τ0' ?b, τ0 ?b  F f, τ0' ?a]) 
                       ((τ0' ?c  G g  τ0 ?b)  𝖺[τ0' ?b, τ0 ?b, F f]  τ0' ?a) 
                       (𝖺[τ0' ?c, G g, τ0 ?b]  𝖺-1[τ0' ?b  τ0 ?b, F f, τ0' ?a]) 
                        𝖺-1[τ0' ?c  G g, τ0 ?b, (τ0' ?b  τ0 ?b)  F f  τ0' ?a] 
                       ((τ0' ?c  G g)  𝖺[τ0 ?b, τ0' ?b  τ0 ?b, F f  τ0' ?a])"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            also have "... =
                       (τ0' ?c  G g)  𝖺-1[τ0 ?b, τ0' ?b, τ0 ?b]  F f  τ0' ?a"
              using f g fg by (intro EV.eval_eqI, auto)
            also have "... = (τ0' ?c D G g) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            finally show ?thesis
              using D.comp_assoc by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Hooray!  We can finally cancel η ?b with ε ?b using the triangle identity. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                         ((τ0' ?c D G g) D 𝗅D-1[τ0 ?b] D 𝗋D[τ0 ?b] D (F f D τ0' ?a)) D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a) D
                ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a)
                  = (τ0' ?c D G g) D
                      ((ε ?b D τ0 ?b) D F f D τ0' ?a) D
                      (𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a) D
                      ((τ0 ?b D η ?b) D F f D τ0' ?a)"
            using f g fg D.whisker_left by simp
          also have "... = (τ0' ?c D G g) D
                              (ε ?b D τ0 ?b) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D (τ0 ?b D η ?b)
                                 D F f D τ0' ?a"
            using f g fg D.whisker_right by simp
          also have "... = (τ0' ?c D G g) D 𝗅D-1[τ0 ?b] D 𝗋D[τ0 ?b] D (F f D τ0' ?a)"
          proof -
            interpret adjoint_equivalence_in_bicategory
                         VD HD 𝖺D 𝗂D srcD trgD τ0 ?b τ0' ?b η ?b ε ?b
              using f chosen_adjoint_equivalence by simp
            show ?thesis
              using fg triangle_left by simp
          qed
          finally have "((τ0' ?c D G g) D (ε ?b D τ0 ?b) D F f D τ0' ?a) D
                        ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, τ0' ?b, τ0 ?b] D F f D τ0' ?a) D
                        ((τ0' ?c D G g) D (τ0 ?b D η ?b) D F f D τ0' ?a)
                          = (τ0' ?c D G g) D 𝗅D-1[τ0 ?b] D 𝗋D[τ0 ?b] D (F f D τ0' ?a)"
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Simplify some more canonical arrows. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         (((τ0' ?c D 𝗋D[G g]) D G f) D
                         ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f])) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         ((𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         ((τ0' ?c D G g) D τ0 ?b D 𝗅D[F f] D τ0' ?a) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, (F0 ?b D F f) D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                ((τ0' ?c D G g) D 𝗅D-1[τ0 ?b] D 𝗋D[τ0 ?b] D (F f D τ0' ?a)) D
                ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])
                  = (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                    ((τ0' ?c D G g) D τ0 ?b D 𝗅D[F f] D τ0' ?a) D
                    𝖺D[τ0' ?c D G g, τ0 ?b, (F0 ?b D F f) D τ0' ?a] D
                    (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a)"
          proof -
            have "𝖺D-1[τ0' ?c D G g, G0 ?b, (τ0 ?b D F f) D τ0' ?a] D
                  ((τ0' ?c D G g) D G0 ?b D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                  ((τ0' ?c D G g) D 𝖺D[G0 ?b, τ0 ?b, F f D τ0' ?a]) D
                  ((τ0' ?c D G g) D 𝗅D-1[τ0 ?b] D 𝗋D[τ0 ?b] D (F f D τ0' ?a)) D
                  ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F0 ?b, F f D τ0' ?a]) D
                  𝖺D[τ0' ?c D G g, τ0 ?b, F0 ?b D F f D τ0' ?a] D
                  (𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝖺D[F0 ?b, F f, τ0' ?a])
                    = 𝖺-1[τ0' ?c  G g, G0 ?b0, (τ0 ?b  F f)  τ0' ?a] 
                       ((τ0' ?c  G g)  G0 ?b0  𝖺-1[τ0 ?b, F f, τ0' ?a]) 
                       ((τ0' ?c  G g)  𝖺[G0 ?b0, τ0 ?b, F f  τ0' ?a]) 
                       ((τ0' ?c  G g)  𝗅-1[τ0 ?b]  𝗋[τ0 ?b]  (F f  τ0' ?a)) 
                       ((τ0' ?c  G g)  𝖺-1[τ0 ?b, F0 ?b0, F f  τ0' ?a]) 
                       𝖺[τ0' ?c  G g, τ0 ?b, F0 ?b0  F f  τ0' ?a] 
                       (𝖺-1[τ0' ?c, G g, τ0 ?b]  𝖺[F0 ?b0, F f, τ0' ?a])"
              using f g fg * ** D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC D.𝔩_ide_simp D.𝔯_ide_simp
              by simp
            also have "... = (𝗋-1[τ0' ?c  G g]  𝖺-1[τ0 ?b, F f, τ0' ?a]) 
                              ((τ0' ?c  G g)  τ0 ?b  𝗅[F f]  τ0' ?a) 
                              𝖺[τ0' ?c  G g, τ0 ?b, (F0 ?b0  F f)  τ0' ?a] 
                              (𝖺-1[τ0' ?c, G g, τ0 ?b]  (F0 ?b0  F f)  τ0' ?a)"
              using f g fg by (intro EV.eval_eqI, auto)
            also have "... = (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                             ((τ0' ?c D G g) D τ0 ?b D 𝗅D[F f] D τ0' ?a) D
                             𝖺D[τ0' ?c D G g, τ0 ?b, (F0 ?b D F f) D τ0' ?a] D
                             (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a)"
              using f g fg * ** D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC D.𝔩_ide_simp D.𝔯_ide_simp
              by simp
            finally show ?thesis by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         (((τ0' ?c D G g) D τ0 ?b D 𝗅D[F f] D τ0' ?a) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, (F0 ?b D F f) D τ0' ?a]) D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D 𝗋D[G g]) D G f) D ((τ0' ?c D G g D G0 ?b) D 𝗋D[G f])
                  = (τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D 𝗋D[G g]" "τ0' ?c D G g D G0 ?b" "G f" "𝗋D[G f]"]
            by simp
          moreover have "(𝖺D[τ0' ?c, G g, G0 ?b] D G f D τ0 ?a D τ0' ?a) D
                         (((τ0' ?c D G g) D G0 ?b) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                           = 𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]"
            using f g fg * D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c, G g, G0 ?b]" "(τ0' ?c D G g) D G0 ?b"
                                    "G f D τ0 ?a D τ0' ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
            by simp
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        (*
         * Move 𝗋D-10' ?c ⋆D G g] and 𝗅D[F f] outside, to get rid of
         * G0 ?b and F0 ?b.
         *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                         ((((τ0' ?c D G g) D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a)) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g) D τ0 ?b D 𝗅D[F f] D τ0' ?a) D
                𝖺D[τ0' ?c D G g, τ0 ?b, (F0 ?b D F f) D τ0' ?a]
                  = 𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                    (((τ0' ?c D G g) D τ0 ?b) D 𝗅D[F f] D τ0' ?a)"
            using f g fg D.assoc_naturality [of "τ0' ?c D G g" "τ0 ?b" "𝗅D[F f] D τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                         (((τ0' ?c D G g D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a)) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(((τ0' ?c D G g) D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a)
                  = 𝖺D-1[τ0' ?c, G g, τ0 ?b] D 𝗅D[F f] D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D τ0 ?b" "𝖺D-1[τ0' ?c, G g, τ0 ?b]"
                                     "𝗅D[F f] D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
            by simp
          also have "... = (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                           ((τ0' ?c D G g D τ0 ?b) D 𝗅D[F f] D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D-1[τ0' ?c, G g, τ0 ?b]" "τ0' ?c D G g D τ0 ?b"
                                    "F f D τ0' ?a" "𝗅D[F f] D τ0' ?a"]
            by simp
          finally have "(((τ0' ?c D G g) D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                        (𝖺D-1[τ0' ?c, G g, τ0 ?b] D (F0 ?b D F f) D τ0' ?a)
                          = (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                            ((τ0' ?c D G g D τ0 ?b) D 𝗅D[F f] D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         ((((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                         (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a])) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                         ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D G g D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a)
                  = (τ0' ?c D D.inv (τ1 g)) D 𝗅D[F f] D τ0' ?a"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D G g D τ0 ?b" "τ0' ?c D D.inv (τ1 g)"
                                    "𝗅D[F f] D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
            by simp
          also have "... = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                           ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D D.inv (τ1 g)" "τ0' ?c D τ0 ?c D F g"
                                    "F f D τ0' ?a" "𝗅D[F f] D τ0' ?a"]
            by simp
          finally have "((τ0' ?c D G g D τ0 ?b) D 𝗅D[F f] D τ0' ?a) D
                        ((τ0' ?c D D.inv (τ1 g)) D (F0 ?b D F f) D τ0' ?a)
                          = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                            ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                         ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                         ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                         ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a])
                  = 𝗋D-1[τ0' ?c D G g] D (D.inv (τ1 f) D τ0' ?a) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' ?c D G g) D G0 ?b" "𝗋D-1[τ0' ?c D G g]"
                                    "D.inv (τ1 f) D τ0' ?a" "𝖺D-1[τ0 ?b, F f, τ0' ?a]"]
            by simp
          also have "... = (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                           ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                           ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a])"
            using f g fg τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗋D-1[τ0' ?c D G g]" "τ0' ?c D G g" "(G f D τ0 ?a) D τ0' ?a"
                                    "(D.inv (τ1 f) D τ0' ?a) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]"]
                  D.whisker_left
            by simp (* 12 sec *)
          finally have "(((τ0' ?c D G g) D G0 ?b) D D.inv (τ1 f) D τ0' ?a) D
                        (𝗋D-1[τ0' ?c D G g] D 𝖺D-1[τ0 ?b, F f, τ0' ?a])
                          = (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                            ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                            ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Introduce associativities to achieve (D.inv (τ1 g) ⋆D F f) and (G g ⋆D D.inv (τ1 f)). *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                         𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                         (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                         ((τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                         ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                         (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                         𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                         (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a])) D
                         (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a
                  = 𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                    (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                    (τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                    (τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                    𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
          proof -
            have "(τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a
                    = ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                      ((τ0' ?c D G g) D (τ0 ?b D F f) D τ0' ?a)"
              using f g fg τ.iso_map1_ide D.comp_arr_dom by simp
            also have "... = (((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                             𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]) D
                             (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a]) D
                             (τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                    𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                    (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a]) D
                    (τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                    𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]
                      = ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                        𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                        (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a] D
                                  𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
                using f g fg τ.iso_map1_ide D.whisker_left D.comp_assoc by simp
              also have "... = ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                               𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                               (τ0' ?c D G g D (τ0 ?b D F f) D τ0' ?a) D
                               𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
                using f g fg τ.iso_map1_ide D.comp_arr_inv' by simp
              also have "... = ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                               𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                               𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
                using f g fg τ.iso_map1_ide D.comp_cod_arr by simp
              also have "... = ((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                               ((τ0' ?c D G g) D (τ0 ?b D F f) D τ0' ?a)"
                using f g fg τ.iso_map1_ide D.comp_inv_arr' by simp
              finally show ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                             ((τ0' ?c D G g D D.inv (τ1 f) D τ0' ?a) D
                             (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a])) D
                             (τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "((τ0' ?c D G g) D D.inv (τ1 f) D τ0' ?a) D
                    𝖺D-1[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]
                      = 𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                        (τ0' ?c D G g D D.inv (τ1 f) D τ0' ?a)"
                using f g fg τ.iso_map1_ide
                      D.assoc'_naturality [of "τ0' ?c" "G g" "D.inv (τ1 f) D τ0' ?a"]
                by simp
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                             (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                             (τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                             (τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a]"
            proof -
              have "(τ0' ?c D G g D D.inv (τ1 f) D τ0' ?a) D
                    (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a])
                      = τ0' ?c D (G g D D.inv (τ1 f) D τ0' ?a) D 𝖺D[G g, τ0 ?b D F f, τ0' ?a]"
                using f g fg τ.iso_map1_ide D.whisker_left by simp
              also have "... = τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a] D
                                        ((G g D D.inv (τ1 f)) D τ0' ?a)"
                using f g fg τ.iso_map1_ide D.assoc_naturality [of "G g" "D.inv (τ1 f)" "τ0' ?a"]
                by simp
              also have "... = (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                               (τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a)"
                using f g fg τ.iso_map1_ide D.whisker_left by simp
              finally have "(τ0' ?c D G g D D.inv (τ1 f) D τ0' ?a) D
                            (τ0' ?c D 𝖺D[G g, τ0 ?b D F f, τ0' ?a])
                              = (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                                (τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            finally show ?thesis by simp
          qed
          moreover have "(τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a
                           = 𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                             (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a]) D
                             (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a) D
                             (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
          proof -
            have "(τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a
                    = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                      ((τ0' ?c D τ0 ?c D F g) D F f D τ0' ?a)"
              using f g fg τ.iso_map1_ide D.comp_arr_dom by auto
            also have "... = (((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                             𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]) D
                             (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a]) D
                             (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
            proof -
              have "((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                    𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                    (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a]) D
                    (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                    𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]
                      = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                        𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a] D
                                  𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
                using f g fg D.whisker_left D.comp_assoc by simp
              also have "... = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                               𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                               (τ0' ?c D (τ0 ?c D F g) D F f D τ0' ?a) D
                               𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
                using f g fg D.comp_arr_inv' by simp
              also have "... = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                               𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                               𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
                using f g fg D.comp_cod_arr by simp
              also have "... = ((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                               ((τ0' ?c D τ0 ?c D F g) D F f D τ0' ?a)"
                using f g fg D.comp_inv_arr' by simp
              finally show ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                             ((τ0' ?c D D.inv (τ1 g) D F f D τ0' ?a) D
                             (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a])) D
                             (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
            proof -
              have "((τ0' ?c D D.inv (τ1 g)) D F f D τ0' ?a) D
                    𝖺D-1[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]
                      = 𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                        (τ0' ?c D D.inv (τ1 g) D F f D τ0' ?a)"
                using f g fg τ.iso_map1_ide
                      D.assoc'_naturality [of "τ0' ?c" "D.inv (τ1 g)" "F f D τ0' ?a"]
                by simp
              thus ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = 𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                             (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a]) D
                             (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a) D
                             (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                             𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a]"
            proof -
              have "(τ0' ?c D D.inv (τ1 g) D F f D τ0' ?a) D
                    (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a])
                      = τ0' ?c D (D.inv (τ1 g) D F f D τ0' ?a) D 𝖺D[τ0 ?c D F g, F f, τ0' ?a]"
                using f g fg τ.iso_map1_ide D.whisker_left by simp
              also have "... = τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a] D
                                        ((D.inv (τ1 g) D F f) D τ0' ?a)"
                using f g fg τ.iso_map1_ide D.assoc_naturality [of "D.inv (τ1 g)" "F f" "τ0' ?a"]
                by simp
              also have "... = (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a]) D
                               (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a)"
                using f g fg τ.iso_map1_ide D.whisker_left by simp
              finally have "(τ0' ?c D D.inv (τ1 g) D F f D τ0' ?a) D
                            (τ0' ?c D 𝖺D[τ0 ?c D F g, F f, τ0' ?a])
                              = (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a]) D
                                (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a)"
                by blast
              thus ?thesis
                using D.comp_assoc by simp
            qed
            finally show ?thesis
              by simp
          qed
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        (* Cancel intervening associativities. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                         𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                         (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                         ((τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                         (τ0' ?c D 𝖺D[G g, τ0 ?b, F f] D τ0' ?a) D
                         (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         ((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a])
                  = τ0' ?c D 𝖺D[G g, τ0 ?b, F f] D τ0' ?a"
          proof -
            have "(τ0' ?c D 𝖺D-1[G g, τ0 ?b D F f, τ0' ?a]) D
                  𝖺D[τ0' ?c, G g, (τ0 ?b D F f) D τ0' ?a] D
                  ((τ0' ?c D G g) D 𝖺D-1[τ0 ?b, F f, τ0' ?a]) D
                  𝖺D[τ0' ?c D G g, τ0 ?b, F f D τ0' ?a] D
                  (𝖺D-1[τ0' ?c, G g, τ0 ?b] D F f D τ0' ?a) D
                  𝖺D-1[τ0' ?c, G g D τ0 ?b, F f D τ0' ?a] D
                  (τ0' ?c D 𝖺D[G g D τ0 ?b, F f, τ0' ?a])
                    = (τ0' ?c  𝖺-1[G g, τ0 ?b  F f, τ0' ?a]) 
                       𝖺[τ0' ?c, G g, (τ0 ?b  F f)  τ0' ?a] 
                       ((τ0' ?c  G g)  𝖺-1[τ0 ?b, F f, τ0' ?a]) 
                       𝖺[τ0' ?c  G g,τ0 ?b, F f  τ0' ?a] 
                       (𝖺-1[τ0' ?c, G g, τ0 ?b]  F f  τ0' ?a) 
                       𝖺-1[τ0' ?c, G g  τ0 ?b, F f  τ0' ?a] 
                       (τ0' ?c  𝖺[G g  τ0 ?b, F f, τ0' ?a])"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            also have "... = τ0' ?c  𝖺[G g, τ0 ?b, F f]  τ0' ?a"
              using f g fg by (intro EV.eval_eqI, auto)
            also have "... = τ0' ?c D 𝖺D[G g, τ0 ?b, F f] D τ0' ?a"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Apply "respects composition". *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                         𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                         (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                         (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         (((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a)) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                (τ0' ?c D 𝖺D[G g, τ0 ?b, F f] D τ0' ?a) D
                (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a)
                  = τ0' ?c D ((G g D D.inv (τ1 f)) D τ0' ?a) D
                             (𝖺D[G g, τ0 ?b, F f] D τ0' ?a) D
                             ((D.inv (τ1 g) D F f) D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.whisker_left by simp
          also have "... = τ0' ?c D
                             (G g D D.inv (τ1 f)) D 𝖺D[G g, τ0 ?b, F f] D (D.inv (τ1 g) D F f)
                               D τ0' ?a"
            using f g fg τ.iso_map1_ide D.whisker_right by simp
          also have "... = τ0' ?c D
                               𝖺D[G g, G f, τ0 ?a] D
                               (D.inv (ΦG (g, f)) D τ0 ?a) D
                               D.inv (τ1 (g C f)) D
                               ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])
                                  D τ0' ?a"
          proof -
            have 1: "(τ1 g D F f) D 𝖺D-1[G g, τ0 ?b, F f] D (G g D τ1 f)
                       = D.inv ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]) D
                         τ1 (g C f) D
                         (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a]"
            proof -
              have "((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f] D
                    (τ1 g D F f) D D.inv 𝖺D[G g, τ0 ?b, F f] D (G g D τ1 f)) D
                    𝖺D[G g, G f, τ0 ?a]
                      = τ1 (g C f) D (ΦG (g, f) D τ0 ?a)"
                using f g fg τ.respects_hcomp D.comp_assoc by simp
              hence "((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]) D
                     (τ1 g D F f) D D.inv 𝖺D[G g, τ0 ?b, F f] D (G g D τ1 f)
                       = τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a]"
                using f g fg D.comp_assoc
                      D.invert_side_of_triangle(2)
                        [of "τ1 (g C f) D (ΦG (g, f) D τ0 ?a)"
                            "(τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f] D
                             (τ1 g D F f) D D.inv 𝖺D[G g, τ0 ?b, F f] D (G g D τ1 f)"
                            "𝖺D[G g, G f, τ0 ?a]"]
                by fastforce
              moreover have "D.iso ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])"
                using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_simp F.cmp_components_are_iso
                      F.FF_def
                by (intro D.isos_compose D.seqI D.hseqI') auto
              moreover have "D.seq (τ1 (g C f))
                                   ((ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])"
                using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_simp G.FF_def
                by (intro D.seqI) auto
              ultimately show ?thesis
                using f g fg τ.iso_map1_ide
                      D.invert_side_of_triangle(1)
                        [of "τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a]"
                            "(τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]"
                            "(τ1 g D F f) D D.inv 𝖺D[G g, τ0 ?b, F f] D (G g D τ1 f)"]
                by simp
            qed
            have "(G g D D.inv (τ1 f)) D 𝖺D[G g, τ0 ?b, F f] D (D.inv (τ1 g) D F f)
                    = D.inv ((τ1 g D F f) D 𝖺D-1[G g, τ0 ?b, F f] D (G g D τ1 f))"
            proof -
              have "D.inv ((τ1 g D F f) D 𝖺D-1[G g, τ0 ?b, F f] D (G g D τ1 f))
                      = D.inv (𝖺D-1[G g, τ0 ?b, F f] D (G g D τ1 f)) D D.inv (τ1 g D F f)"
              proof -
                have "D.iso ((τ1 g D F f) D 𝖺D-1[G g, τ0 ?b, F f] D (G g D τ1 f))"
                  using f g fg τ.iso_map1_ide
                  by (intro D.isos_compose) auto
                moreover have "D.iso (τ1 g D F f)"
                  using f g fg τ.iso_map1_ide by auto
                ultimately show ?thesis
                  using τ.iso_map1_ide D.inv_comp_left by simp
              qed
              also have "... = ((G g D D.inv (τ1 f)) D 𝖺D[G g, τ0 ?b, F f]) D
                               (D.inv (τ1 g) D F f)"
              proof -
                have "D.iso (𝖺D-1[G g, τ0 (srcC g), F f] D (G g D τ1 f))"
                  using f g fg τ.iso_map1_ide
                  by (intro D.isos_compose) auto
                thus ?thesis
                  using f g fg τ.iso_map1_ide D.inv_comp_left by simp
              qed
              finally show ?thesis
                using D.comp_assoc by simp
            qed
            also have "... = D.inv (D.inv ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]) D
                                    τ1 (g C f) D
                                    (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])"
              using 1 by simp
            also have "... = D.inv (τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D
                                    𝖺D-1[G g, G f, τ0 ?a]) D
                             ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])"
            proof -
              have 2: "D.iso ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])"
                 using f g fg τ.iso_map1_ide C.VV.arr_charSbC C.VV.dom_simp F.cmp_components_are_iso
                       F.FF_def
                 by (intro D.isos_compose) auto
              moreover have "D.iso (D.inv ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]) D
                                    τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])"
                 using 2 f g fg τ.iso_map1_ide C.VV.arr_charSbC C.VV.dom_simp
                       C.VV.cod_simp F.FF_def G.FF_def D.inv_comp_left
                 by (intro D.isos_compose) auto (* 10 sec *)
              ultimately show ?thesis
                using D.inv_comp_left
                        [of "D.inv ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])"
                            "τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a]"]
                      D.inv_inv D.iso_inv_iso
                by metis
            qed
            also have "... = 𝖺D[G g, G f, τ0 ?a] D (D.inv (ΦG (g, f)) D τ0 ?a) D
                             D.inv (τ1 (g C f)) D ((τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f])"
            proof -
              have "D.inv (τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])
                      = 𝖺D[G g, G f, τ0 ?a] D (D.inv (ΦG (g, f)) D τ0 ?a) D
                        D.inv (τ1 (g C f))"
              proof -
                have 2: "D.iso (τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])"
                   using f g fg τ.iso_map1_ide C.VV.arr_charSbC C.VV.dom_simp
                         C.VV.cod_simp G.FF_def
                   by (intro D.isos_compose D.seqI D.hseqI') auto
                have "D.inv (τ1 (g C f) D (ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a])
                        = D.inv ((ΦG (g, f) D τ0 ?a) D 𝖺D-1[G g, G f, τ0 ?a]) D D.inv (τ1 (g C f))"
                  using 2 f g fg * τ.iso_map1_ide G.cmp_components_are_iso C.VV.arr_charSbC
                        C.VV.dom_simp C.VV.cod_simp G.FF_def D.inv_comp_left
                  by simp
                also have "... = (𝖺D[G g, G f, τ0 ?a] D (D.inv (ΦG (g, f)) D τ0 ?a)) D
                                 D.inv (τ1 (g C f))"
                  using 2 f g fg * τ.iso_map1_ide G.cmp_components_are_iso C.VV.arr_charSbC
                        C.VV.dom_simp C.VV.cod_simp G.FF_def D.inv_comp_left
                  by simp
                also have "... = 𝖺D[G g, G f, τ0 ?a] D (D.inv (ΦG (g, f)) D τ0 ?a) D
                                 D.inv (τ1 (g C f))"
                  using D.comp_assoc by simp
                finally show ?thesis
                  using D.comp_assoc by simp
              qed
              thus ?thesis
                using D.comp_assoc by simp
            qed
            finally have "(G g D D.inv (τ1 f)) D 𝖺D[G g, τ0 ?b, F f] D (D.inv (τ1 g) D F f)
                            = 𝖺D[G g, G f, τ0 ?a] D (D.inv (ΦG (g, f)) D τ0 ?a) D
                              D.inv (τ1 (g C f)) D (τ0 ?c D ΦF (g, f)) D 𝖺D[τ0 ?c, F g, F f]"
              by blast
            thus ?thesis by simp
          qed
          also have "... = τ0' ?c D
                             (𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                             ((D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                             (D.inv (τ1 (g C f)) D τ0' ?a) D
                             (((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                             (𝖺D[τ0 ?c, F g, F f] D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.whisker_right
                  C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_simp G.cmp_components_are_iso
                  F.FF_def G.FF_def
            by simp
          also have "... = (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                           (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                           (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                           (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                           (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a)"
            using f g fg τ.iso_map1_ide D.whisker_left
                  C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_simp G.cmp_components_are_iso
                  F.FF_def G.FF_def
            by simp
          finally have "(τ0' ?c D (G g D D.inv (τ1 f)) D τ0' ?a) D
                        (τ0' ?c D 𝖺D[G g, τ0 ?b, F f] D τ0' ?a) D
                        (τ0' ?c D (D.inv (τ1 g) D F f) D τ0' ?a)
                          = (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                            (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                            (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                            (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                            (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move 𝗅D[F f] down, where it will cancel. *)
        also have "... = (τ0' ?c D ΦG (g, f)) D
                         𝖺D[τ0' ?c, G g, G f] D
                         ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                         ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                         (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                         (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                         𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                         (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                         (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                         ((((τ0' ?c D τ0 ?c) D F g) D 𝗅D[F f] D τ0' ?a) D
                         ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a)) D
                         (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) D
                         𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a)
                  = 𝖺D[τ0' ?c, τ0 ?c, F g] D 𝗅D[F f] D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "τ0' ?c D τ0 ?c D F g" "𝖺D[τ0' ?c, τ0 ?c, F g]"
                                    "𝗅D[F f] D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
                  D.whisker_right
            by simp
          also have "... = (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                           (((τ0' ?c D τ0 ?c) D F g) D 𝗅D[F f] D τ0' ?a)"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "(τ0' ?c D τ0 ?c) D F g"
                                    "F f D τ0' ?a" "𝗅D[F f] D τ0' ?a"]
                  D.whisker_right
            by simp
          finally have "((τ0' ?c D τ0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D (F0 ?b D F f) D τ0' ?a)
                          = (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                            (((τ0' ?c D τ0 ?c) D F g) D 𝗅D[F f] D τ0' ?a)"
            by blast
         thus ?thesis
            using D.comp_assoc by simp
       qed
       (* Move 𝗅D[F f] down. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                        ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                        (𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a) D
                        𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (((F0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                        (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a)) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(((τ0' ?c D τ0 ?c) D F g) D 𝗅D[F f] D τ0' ?a) D
               ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a)
                 = (η ?c D F g) D 𝗅D[F f] D τ0' ?a"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "(τ0' ?c D τ0 ?c) D F g" "η ?c D F g"
                                   "𝗅D[F f] D τ0' ?a" "(F0 ?b D F f) D τ0' ?a"]
           by simp
         also have "... = ((η ?c D F g) D F f D τ0' ?a) D
                          ((F0 ?c D F g) D 𝗅D[F f] D τ0' ?a)"
           using f g fg D.comp_arr_dom D.comp_cod_arr
                 D.interchange [of "η ?c D F g" "F0 ?c D F g" "F f D τ0' ?a" "𝗅D[F f] D τ0' ?a"]
           by simp
         finally have "(((τ0' ?c D τ0 ?c) D F g) D 𝗅D[F f] D τ0' ?a) D
                       ((η ?c D F g) D (F0 ?b D F f) D τ0' ?a)
                         = ((η ?c D F g) D F f D τ0' ?a) D
                           ((F0 ?c D F g) D 𝗅D[F f] D τ0' ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Cancel 𝗅D[F f] and 𝗅D-1[F f]. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                        ((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                        ((𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a)) D
                        𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((F0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a) =
               𝗅D-1[F g] D (𝗅D[F f] D τ0' ?a) D (𝗅D-1[F f] D τ0' ?a)"
           using f g fg D.comp_cod_arr
                 D.interchange [of "F0 ?c D F g" "𝗅D-1[F g]" "𝗅D[F f] D τ0' ?a" "𝗅D-1[F f] D τ0' ?a"]
           by simp
         also have "... = 𝗅D-1[F g] D 𝗅D[F f] D 𝗅D-1[F f] D τ0' ?a"
           using f g fg D.whisker_right by simp
         also have "... = 𝗅D-1[F g] D F f D τ0' ?a"
           using f D.comp_arr_inv' by simp
         finally have "((F0 ?c D F g) D 𝗅D[F f] D τ0' ?a) D
                       (𝗅D-1[F g] D 𝗅D-1[F f] D τ0' ?a)
                         = 𝗅D-1[F g] D F f D τ0' ?a"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move 𝗋D-1[G g] up, where it will cancel. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                        (((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                        ((τ0' ?c D 𝗋D-1[G g]) D 𝖺D[G f, τ0 ?a, τ0' ?a])) D
                        𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
               (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a)
                 = 𝖺D[τ0' ?c, G g, G0 ?b] D 𝗋D-1[τ0' ?c D G g] D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           using f g fg * D.comp_arr_dom
                 D.interchange [of "𝖺D[τ0' ?c, G g, G0 ?b]" "𝗋D-1[τ0' ?c D G g]"
                                   "𝖺D[G f, τ0 ?a, τ0' ?a]" "(G f D τ0 ?a) D τ0' ?a"]
           by simp
         also have "... = (τ0' ?c D 𝗋D-1[G g]) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           using f g fg D.runit_hcomp(4) [of "τ0' ?c" "G g"] by simp
         finally have "(𝖺D[τ0' ?c, G g, G0 ?b] D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                       (𝗋D-1[τ0' ?c D G g] D (G f D τ0 ?a) D τ0' ?a)
                         = (τ0' ?c D 𝗋D-1[G g]) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move 𝗋D-1[G g] up. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        (((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                        ((τ0' ?c D 𝗋D-1[G g]) D G f D ε ?a)) D
                        ((τ0' ?c D G g) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a] D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
               ((τ0' ?c D 𝗋D-1[G g]) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                 = (τ0' ?c D 𝗋D-1[G g]) D (G f D ε ?a) D 𝖺D[G f, τ0 ?a, τ0' ?a]"
           using f g fg D.comp_cod_arr
                 D.interchange [of "τ0' ?c D G g D G0 ?b" "τ0' ?c D 𝗋D-1[G g]"
                                   "G f D ε ?a" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         also have "... = ((τ0' ?c D 𝗋D-1[G g]) D G f D ε ?a) D
                          ((τ0' ?c D G g) D 𝖺D[G f, τ0 ?a, τ0' ?a])"
           using f g fg D.comp_arr_dom
                 D.interchange [of "τ0' ?c D 𝗋D-1[G g]" "τ0' ?c D G g" "G f D ε ?a"
                                   "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         finally have "((τ0' ?c D G g D G0 ?b) D G f D ε ?a) D
                       ((τ0' ?c D 𝗋D-1[G g]) D 𝖺D[G f, τ0 ?a, τ0' ?a])
                         = ((τ0' ?c D 𝗋D-1[G g]) D G f D ε ?a) D
                           ((τ0' ?c D G g) D 𝖺D[G f, τ0 ?a, τ0' ?a])"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Cancel 𝗋D-1[G g] and 𝗋D[G g]. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D G g) D 𝗋D[G f]) D
                        ((τ0' ?c D G g) D G f D ε ?a) D
                        (((τ0' ?c D G g) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D ((τ0' ?c D 𝗋D-1[G g]) D G f D ε ?a)
                 = (τ0' ?c D 𝗋D[G g]) D (τ0' ?c D 𝗋D-1[G g]) D 𝗋D[G f] D (G f D ε ?a)"
           using f g fg D.interchange by simp
         also have "... = (τ0' ?c D 𝗋D[G g] D 𝗋D-1[G g]) D 𝗋D[G f] D (G f D ε ?a)"
           using f g fg D.whisker_left by simp
         also have "... = (τ0' ?c D G g) D 𝗋D[G f] D (G f D ε ?a)"
           using g D.comp_arr_inv' by simp
         also have "... = ((τ0' ?c D G g) D 𝗋D[G f]) D ((τ0' ?c D G g) D G f D ε ?a)"
           using f g fg D.whisker_left by simp
         finally have "((τ0' ?c D 𝗋D[G g]) D 𝗋D[G f]) D
                       ((τ0' ?c D 𝗋D-1[G g]) D G f D ε ?a)
                         = ((τ0' ?c D G g) D 𝗋D[G f]) D ((τ0' ?c D G g) D G f D ε ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D G g) D 𝗋D[G f]) D
                        ((τ0' ?c D G g) D G f D ε ?a) D
                        𝖺D-1[τ0' ?c, G g, G f D τ0 ?a D τ0' ?a] D
                        ((τ0' ?c D G g D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a)) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D G g) D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
               𝖺D-1[τ0' ?c, G g, (G f D τ0 ?a) D τ0' ?a]
                 = 𝖺D-1[τ0' ?c, G g, G f D τ0 ?a D τ0' ?a] D
                   (τ0' ?c D G g D 𝖺D[G f, τ0 ?a, τ0' ?a])"
           using f g fg
                 D.assoc'_naturality [of "τ0' ?c" "G g" "𝖺D[G f, τ0 ?a, τ0' ?a]"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        ((τ0' ?c D G g) D 𝗋D[G f]) D
                        (((τ0' ?c D G g) D G f D ε ?a) D
                        𝖺D-1[τ0' ?c, G g, G f D τ0 ?a D τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(τ0' ?c D G g D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
               (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
               (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a)
                 = τ0' ?c D (G g D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                            𝖺D[G g, G f D τ0 ?a, τ0' ?a] D
                            (𝖺D[G g, G f, τ0 ?a] D τ0' ?a)"
           using f g fg D.whisker_left by simp
         also have "... = τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a] D
                                   𝖺D[G g D G f, τ0 ?a, τ0' ?a]"
           using f g fg D.pentagon by simp
         also have "... = (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]) D
                          (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a])"
           using f g fg D.whisker_left by simp
         finally have "(τ0' ?c D G g D 𝖺D[G f, τ0 ?a, τ0' ?a]) D
                       (τ0' ?c D 𝖺D[G g, G f D τ0 ?a, τ0' ?a]) D
                       (τ0' ?c D 𝖺D[G g, G f, τ0 ?a] D τ0' ?a)
                         = (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]) D
                           (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a])"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        𝖺D[τ0' ?c, G g, G f] D
                        (((τ0' ?c D G g) D 𝗋D[G f]) D
                        𝖺D-1[τ0' ?c, G g, G f D G0 ?a]) D
                        (τ0' ?c D G g D G f D ε ?a) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D G g) D G f D ε ?a) D 𝖺D-1[τ0' ?c, G g, G f D τ0 ?a D τ0' ?a]
                 = 𝖺D-1[τ0' ?c, G g, G f D G0 ?a] D (τ0' ?c D G g D G f D ε ?a)"
           using f g fg D.assoc'_naturality [of "τ0' ?c" "G g" "G f D ε ?a"]
           by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Move associativity to where it can be canceled. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        ((𝖺D[τ0' ?c, G g, G f] D
                        𝖺D-1[τ0' ?c, G g, G f]) D
                        (τ0' ?c D G g D 𝗋D[G f])) D
                        (τ0' ?c D G g D G f D ε ?a) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]) D
                        (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "((τ0' ?c D G g) D 𝗋D[G f]) D 𝖺D-1[τ0' ?c, G g, G f D G0 ?a]
                 = 𝖺D-1[τ0' ?c, G g, G f] D (τ0' ?c D G g D 𝗋D[G f])"
           using f g fg D.assoc'_naturality [of "τ0' ?c" "G g" "𝗋D[G f]"] by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Cancel associativities. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        (τ0' ?c D G g D 𝗋D[G f]) D
                        ((τ0' ?c D G g D G f D ε ?a) D
                        (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a])) D
                        (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(𝖺D[τ0' ?c, G g, G f] D 𝖺D-1[τ0' ?c, G g, G f]) D (τ0' ?c D G g D 𝗋D[G f])
                 = (τ0' ?c D G g D 𝗋D[G f])"
           using f g fg D.comp_arr_inv' D.comp_cod_arr by simp
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Permute associativity to continue forming G g ⋆D G f. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        ((τ0' ?c D G g D 𝗋D[G f]) D
                        (τ0' ?c D 𝖺D[G g, G f, G0 ?a])) D
                        (τ0' ?c D (G g D G f) D ε ?a) D
                        (τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(τ0' ?c D G g D G f D ε ?a) D (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a])
                 = τ0' ?c D (G g D G f D ε ?a) D 𝖺D[G g, G f, τ0 ?a D τ0' ?a]"
           using f g fg D.whisker_left by simp
         also have "... = τ0' ?c D 𝖺D[G g, G f, G0 ?a] D ((G g D G f) D ε ?a)"
           using f g fg D.assoc_naturality [of "G g" "G f" "ε ?a"] by simp
         also have "... = (τ0' ?c D 𝖺D[G g, G f, G0 ?a]) D (τ0' ?c D (G g D G f) D ε ?a)"
           using f g fg * D.whisker_left by simp
         finally have "(τ0' ?c D G g D G f D ε ?a) D
                       (τ0' ?c D 𝖺D[G g, G f, τ0 ?a D τ0' ?a])
                         = (τ0' ?c D 𝖺D[G g, G f, G0 ?a]) D (τ0' ?c D (G g D G f) D ε ?a)"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
       qed
       (* Form 𝗋D[G g ⋆D G f]. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        (τ0' ?c D 𝗋D[G g D G f]) D
                        (τ0' ?c D (G g D G f) D ε ?a) D
                        ((τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a)) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
         using f g fg * D.runit_hcomp D.whisker_left D.comp_assoc by simp
       (* Move D.inv (ΦG (g, f)) to the top and cancel with its inverse. *)
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        (τ0' ?c D 𝗋D[G g D G f]) D
                        ((τ0' ?c D (G g D G f) D ε ?a) D
                        (τ0' ?c D D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
       proof -
         have "(τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
               (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a)
                 = τ0' ?c D
                      𝖺D[G g D G f, τ0 ?a, τ0' ?a] D
                      ((D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a)"
           using f g fg G.cmp_components_are_iso D.whisker_left by simp
         also have "... = τ0' ?c D
                            (D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a) D
                            𝖺D[G (g C f), τ0 ?a, τ0' ?a]"
           using f g fg G.cmp_components_are_iso
                 D.assoc_naturality [of "D.inv (ΦG (g, f))" "τ0 ?a" "τ0' ?a"]
           by simp
         also have "... = (τ0' ?c D D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a) D
                          (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a])"
           using f g fg G.cmp_components_are_iso D.whisker_left by simp
         finally have "(τ0' ?c D 𝖺D[G g D G f, τ0 ?a, τ0' ?a]) D
                       (τ0' ?c D (D.inv (ΦG (g, f)) D τ0 ?a) D τ0' ?a)
                         = (τ0' ?c D D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a) D
                           (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a])"
           by blast
         thus ?thesis
           using D.comp_assoc by simp
        qed
       also have "... = (τ0' ?c D ΦG (g, f)) D
                        ((τ0' ?c D 𝗋D[G g D G f]) D
                        (τ0' ?c D D.inv (ΦG (g, f)) D G0 ?a)) D
                        (τ0' ?c D G (g C f) D ε ?a) D
                        (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D (G g D G f) D ε ?a) D
                (τ0' ?c D D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a)
                  = τ0' ?c D ((G g D G f) D ε ?a) D (D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a)"
            using f g fg G.cmp_components_are_iso D.whisker_left by simp
          also have "... = τ0' ?c D (D.inv (ΦG (g, f)) D ε ?a)"
            using f g fg * D.comp_arr_dom D.comp_cod_arr
                   D.interchange [of "G g D G f" "D.inv (ΦG (g, f))" "ε ?a" "τ0 ?a D τ0' ?a"]
            by simp
          also have "... = τ0' ?c D (D.inv (ΦG (g, f)) D G0 ?a) D (G (g C f) D ε ?a)"
            using f g fg * D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "D.inv (ΦG (g, f))" "G (g C f)" "G0 ?a" "ε ?a"]
            by simp
          also have "... = (τ0' ?c D D.inv (ΦG (g, f)) D G0 ?a) D
                           (τ0' ?c D G (g C f) D ε ?a)"
            using f g fg * G.cmp_components_are_iso D.whisker_left by simp
          finally have "(τ0' ?c D (G g D G f) D ε ?a) D
                        (τ0' ?c D D.inv (ΦG (g, f)) D τ0 ?a D τ0' ?a)
                          = (τ0' ?c D D.inv (ΦG (g, f)) D G0 ?a) D
                            (τ0' ?c D G (g C f) D ε ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
       also have "... = (((τ0' ?c D ΦG (g, f)) D
                        (τ0' ?c D D.inv (ΦG (g, f)))) D
                        (τ0' ?c D 𝗋D[G (g C f)])) D
                        (τ0' ?c D G (g C f) D ε ?a) D
                        (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "(τ0' ?c D 𝗋D[G g D G f]) D (τ0' ?c D D.inv (ΦG (g, f)) D G0 ?a)
                  = τ0' ?c D 𝗋D[G g D G f] D (D.inv (ΦG (g, f)) D G0 ?a)"
            using f g fg * G.cmp_components_are_iso D.whisker_left by simp
          also have "... = τ0' ?c D D.inv (ΦG (g, f)) D 𝗋D[G (g C f)]"
            using f g fg * G.cmp_components_are_iso D.runit_naturality [of "D.inv (ΦG (g, f))"]
            by simp
          also have "... = (τ0' ?c D D.inv (ΦG (g, f))) D (τ0' ?c D  𝗋D[G (g C f)])"
            using f g fg * G.cmp_components_are_iso D.whisker_left by simp
          finally have "(τ0' ?c D 𝗋D[G g D G f]) D (τ0' ?c D D.inv (ΦG (g, f)) D G0 ?a) =
                        (τ0' ?c D D.inv (ΦG (g, f))) D (τ0' ?c D  𝗋D[G (g C f)])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
       also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                        (τ0' ?c D G (g C f) D ε ?a) D
                        (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                        ((η ?c D F g) D F f D τ0' ?a) D
                        (𝗅D-1[F g] D F f D τ0' ?a) D
                        𝖺D[F g, F f, τ0' ?a]"
        proof -
          have "((τ0' ?c D ΦG (g, f)) D (τ0' ?c D D.inv (ΦG (g, f)))) D
                (τ0' ?c D 𝗋D[G (g C f)])
                  = τ0' ?c D (ΦG (g, f) D D.inv (ΦG (g, f))) D 𝗋D[G (g C f)]"
            using f g fg D.whisker_left G.cmp_components_are_iso
                  C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_simp
            by simp
          also have "... = τ0' ?c D 𝗋D[G (g C f)]"
            using f g fg G.cmp_components_are_iso D.comp_arr_inv' D.comp_cod_arr by simp
          finally have "((τ0' ?c D ΦG (g, f)) D (τ0' ?c D D.inv (ΦG (g, f)))) D
                        (τ0' ?c D 𝗋D[G (g C f)])
                          = τ0' ?c D 𝗋D[G (g C f)]"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Perform similar manipulations on the bottom part. *)
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         (𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                         (((η ?c D F g) D F f D τ0' ?a) D
                         𝖺D[F0 ?c D F g, F f, τ0' ?a]) D
                         ((𝗅D-1[F g] D F f) D τ0' ?a)"
          using f g fg D.assoc_naturality [of "𝗅D-1[F g]" "F f" "τ0' ?a"] D.comp_assoc by simp
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                         𝖺D[(τ0' ?c D τ0 ?c) D F g, F f, τ0' ?a]) D
                         (((η ?c D F g) D F f) D τ0' ?a) D
                         ((𝗅D-1[F g] D F f) D τ0' ?a)"
        proof -
          have "((η ?c D F g) D F f D τ0' ?a) D 𝖺D[F0 ?c D F g, F f, τ0' ?a]
                  = 𝖺D[(τ0' ?c D τ0 ?c) D F g, F f, τ0' ?a] D
                    (((η ?c D F g) D F f) D τ0' ?a)"
            using f g fg **
                  D.assoc_naturality [of "η ?c D F g" "F f" "τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a) D
                         (((η ?c D F g) D F f) D τ0' ?a) D
                         ((𝗅D-1[F g] D F f) D τ0' ?a)"
        proof -
          have "(𝖺D[τ0' ?c, τ0 ?c, F g] D F f D τ0' ?a) D
                𝖺D[(τ0' ?c D τ0 ?c) D F g, F f, τ0' ?a]
                  = 𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                    ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a)"
            using f g fg D.assoc_naturality [of "𝖺D[τ0' ?c, τ0 ?c, F g]" "F f" "τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Replace 𝗅D-1[F g] ⋆D F f by 𝗅D-1[F (g ⋆C f)]. *)
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         (τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                         (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                         𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                         𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                         ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a) D
                         ((((η ?c D F g) D F f) D τ0' ?a) D
                         (𝖺D-1[trgD (F g), F g, F f] D τ0' ?a)) D
                         (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "(𝗅D-1[F g] D F f) D τ0' ?a
                   = 𝖺D-1[trgD (F g), F g, F f] D 𝗅D-1[F g D F f] D τ0' ?a"
            using f g fg D.lunit_hcomp(2) [of "F g" "F f"] by simp
          also have "... = (𝖺D-1[trgD (F g), F g, F f] D τ0' ?a) D (𝗅D-1[F g D F f] D τ0' ?a)"
            using f g fg ** D.whisker_right [of "τ0' ?a"] by simp
          finally have "(𝗅D-1[F g] D F f) D τ0' ?a
                          = (𝖺D-1[trgD (F g), F g, F f] D τ0' ?a) D (𝗅D-1[F g D F f] D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Move the associativity up to the big block of associativities. *)
       also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                        (τ0' ?c D G (g C f) D ε ?a) D
                        (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                        (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                        (τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                        ((τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                        (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                        𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                        𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                        ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a) D
                        (𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D τ0' ?a)) D
                        ((η ?c D F g D F f) D τ0' ?a) D
                        (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "(((η ?c D F g) D F f) D τ0' ?a) D (𝖺D-1[trgD (F g), F g, F f] D τ0' ?a)
                  = ((η ?c D F g) D F f) D 𝖺D-1[trgD (F g), F g, F f] D τ0' ?a"
            using f g fg ** D.whisker_right by simp
          also have "... = 𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D (η ?c D F g D F f) D τ0' ?a"
            using f g fg ** D.assoc'_naturality [of "η ?c" "F g" "F f"] by simp
          also have "... = (𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D τ0' ?a) D
                           ((η ?c D F g D F f) D τ0' ?a)"
            using f g fg ** D.whisker_right by simp    
          finally have "(((η ?c D F g) D F f) D τ0' ?a) D
                        (𝖺D-1[trgD (F g), F g, F f] D τ0' ?a)
                          = (𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D τ0' ?a) D
                            ((η ?c D F g D F f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Simplify the block of associativities. *)
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         ((τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                         𝖺D[τ0' ?c, τ0 ?c D F g D F f, τ0' ?a]) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a) D
                         ((η ?c D F g D F f) D τ0' ?a) D
                         (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "(τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a) D
                (𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D τ0' ?a)
                  = 𝖺D[τ0' ?c, τ0 ?c D F g D F f, τ0' ?a] D
                    (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a)"
          proof -
            have "(τ0' ?c D 𝖺D[τ0 ?c, F g, F f] D τ0' ?a) D
                  (τ0' ?c D 𝖺D-1[τ0 ?c D F g, F f, τ0' ?a]) D
                  𝖺D[τ0' ?c, τ0 ?c D F g, F f D τ0' ?a] D
                  𝖺D[τ0' ?c D τ0 ?c D F g, F f, τ0' ?a] D
                  ((𝖺D[τ0' ?c, τ0 ?c, F g] D F f) D τ0' ?a) D
                  (𝖺D-1[τ0' ?c D τ0 ?c, F g, F f] D τ0' ?a)
                    = (τ0' ?c  𝖺[τ0 ?c, F g, F f]  τ0' ?a) 
                       (τ0' ?c  𝖺-1[τ0 ?c  F g, F f, τ0' ?a]) 
                       𝖺[τ0' ?c, τ0 ?c  F g, F f  τ0' ?a] 
                       𝖺[τ0' ?c  τ0 ?c  F g, F f, τ0' ?a] 
                       ((𝖺[τ0' ?c, τ0 ?c, F g]  F f)  τ0' ?a) 
                       (𝖺-1[τ0' ?c  τ0 ?c, F g, F f]  τ0' ?a)"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            also have "... = 𝖺[τ0' ?c,  τ0 ?c  F g  F f, τ0' ?a] 
                              (𝖺[τ0' ?c, τ0 ?c, F g  F f]  τ0' ?a)"
              using f g fg by (intro EV.eval_eqI, auto)
            also have "... = 𝖺D[τ0' ?c, τ0 ?c D F g D F f, τ0' ?a] D
                             (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a)"
              using f g fg D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by simp
            finally show ?thesis by simp
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* Permute ΦF (g, f) to the bottom. *)
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a] D
                         (((τ0' ?c D τ0 ?c D ΦF (g, f)) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a)) D
                         ((η ?c D F g D F f) D τ0' ?a) D
                         (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "(τ0' ?c D ((τ0 ?c D ΦF (g, f)) D τ0' ?a)) D
                𝖺D[τ0' ?c, τ0 ?c D F g D F f, τ0' ?a]
                  = 𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a] D
                    ((τ0' ?c D τ0 ?c D ΦF (g, f)) D τ0' ?a)"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.assoc_naturality [of "τ0' ?c" "τ0 ?c D ΦF (g, f)" "τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a] D
                         (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                         ((((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a) D
                         ((η ?c D F g D F f) D τ0' ?a)) D
                         (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "((τ0' ?c D (τ0 ?c D ΦF (g, f))) D τ0' ?a) D
                (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a)
                  = (τ0' ?c D τ0 ?c D ΦF (g, f)) D 𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.whisker_right
            by simp
          also have "... = 𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D
                           ((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.assoc_naturality [of "τ0' ?c" "τ0 ?c" "ΦF (g, f)"]
            by simp
          also have "... = (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                           (((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a)"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.whisker_right
            by simp
          finally have "((τ0' ?c D (τ0 ?c D ΦF (g, f))) D τ0' ?a) D
                        (𝖺D[τ0' ?c, τ0 ?c, F g D F f] D τ0' ?a)
                          = (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                            (((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         (τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a] D
                         (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                         ((η ?c D F (g C f)) D τ0' ?a) D
                         ((F0 ?c D ΦF (g, f)) D τ0' ?a) D
                         (𝗅D-1[F g D F f] D τ0' ?a)"
        proof -
          have "(((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a) D
                ((η ?c D F g D F f) D τ0' ?a)
                  = ((τ0' ?c D τ0 ?c) D ΦF (g, f)) D (η ?c D F g D F f) D τ0' ?a"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def D.whisker_right
            by simp
          also have "... = (η ?c D ΦF (g, f)) D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.interchange [of "τ0' ?c D τ0 ?c" "η ?c" "ΦF (g, f)" "F g D F f"]
            by simp
          also have "... = (η ?c D F (g C f)) D (F0 ?c D ΦF (g, f)) D τ0' ?a"
            using f g fg D.comp_arr_dom D.comp_cod_arr
                  C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.interchange [of "η ?c" "F0 ?c" "F (g C f)" "ΦF (g, f)"]
            by simp
          also have "... = ((η ?c D F (g C f)) D τ0' ?a) D ((F0 ?c D ΦF (g, f)) D τ0' ?a)"
            using f g fg ** C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def D.whisker_right
            by simp
          finally have "(((τ0' ?c D τ0 ?c) D ΦF (g, f)) D τ0' ?a) D
                        ((η ?c D F g D F f) D τ0' ?a)
                          = ((η ?c D F (g C f)) D τ0' ?a) D ((F0 ?c D ΦF (g, f)) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         ((τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                         𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a]) D
                         (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                         ((η ?c D F (g C f)) D τ0' ?a) D
                         (𝗅D-1[F (g C f)] D τ0' ?a) D
                         (ΦF (g, f) D τ0' ?a)"
        proof -
          have "((F0 ?c D ΦF (g, f)) D τ0' ?a) D (𝗅D-1[F g D F f] D τ0' ?a)
                  = (F0 ?c D ΦF (g, f)) D 𝗅D-1[F g D F f] D τ0' ?a"
            using f g fg ** C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def D.whisker_right
            by simp
          also have "... = 𝗅D-1[F (g C f)] D ΦF (g, f) D τ0' ?a"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def
                  D.lunit'_naturality [of "ΦF (g, f)"]
            by simp
          also have "... = (𝗅D-1[F (g C f)] D τ0' ?a) D (ΦF (g, f) D τ0' ?a)"
            using f g fg C.VV.arr_charSbC C.VV.dom_simp C.VV.cod_charSbC F.FF_def D.whisker_right
            by simp
          finally have "((F0 ?c D ΦF (g, f)) D τ0' ?a) D (𝗅D-1[F g D F f] D τ0' ?a)
                          = (𝗅D-1[F (g C f)] D τ0' ?a) D (ΦF (g, f) D τ0' ?a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        (* One more associativity to move to its final position. *)
        also have "... = (τ0' ?c D 𝗋D[G (g C f)]) D
                         (τ0' ?c D G (g C f) D ε ?a) D
                         (τ0' ?c D 𝖺D[G (g C f), τ0 ?a, τ0' ?a]) D
                         𝖺D[τ0' ?c, G (g C f) D τ0 ?a, τ0' ?a] D
                         ((τ0' ?c D D.inv (τ1 (g C f))) D τ0' ?a) D
                         (𝖺D[τ0' ?c, τ0 ?c, F (g C f)] D τ0' ?a) D
                         ((η ?c D F (g C f)) D τ0' ?a) D
                         (𝗅D-1[F (g C f)] D τ0' ?a) D
                         (ΦF (g, f) D τ0' ?a)"
        proof -
          have "(τ0' ?c D D.inv (τ1 (g C f)) D τ0' ?a) D
                𝖺D[τ0' ?c, τ0 ?c D F (g C f), τ0' ?a]
                  = 𝖺D[τ0' ?c, G (g C f) D τ0 ?a, τ0' ?a] D
                    ((τ0' ?c D D.inv (τ1 (g C f))) D τ0' ?a)"
            using f g fg τ.iso_map1_ide
                  D.assoc_naturality [of "τ0' ?c" "D.inv (τ1 (g C f))" "τ0' ?a"]
            by simp
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = τ1' (g C f) D (ΦF (g, f) D τ0' ?a)"
          unfolding map1_def
          using f g fg D.comp_assoc by simp
        finally show "(τ0' ?c D ΦG (g, f)) D 𝖺D[τ0' ?c, G g, G f] D (τ1' g D G f) D
                      D.inv 𝖺D[F g, τ0' (srcC g), G f] D (F g D τ1' f) D 𝖺D[F g, F f, τ0' ?a]
                        = τ1' (g C f) D (ΦF (g, f) D τ0' ?a)"
          by blast
      qed
    qed

    lemma is_pseudonatural_equivalence:
    shows "pseudonatural_equivalence
             VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG F ΦF τ0' τ1'"
      ..

  end

  subsection "Pseudonaturally Equivalent Pseudofunctors"

  text ‹
    Pseudofunctors F› and G› are \emph{pseudonaturally equivalent} if there is a
    pseudonatural equivalence between them.
  ›

  definition pseudonaturally_equivalent
  where "pseudonaturally_equivalent
           VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG 
         τ0 τ1. pseudonatural_equivalence
                  VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1"

  lemma pseudonaturally_equivalent_reflexive:
  assumes "pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF"
  shows "pseudonaturally_equivalent
           VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF F ΦF"
  proof -
    interpret F: pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF
      using assms by simp
    interpret identity_pseudonatural_transformation
                VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF
      ..
    show ?thesis
      using pseudonatural_equivalence_axioms pseudonaturally_equivalent_def by blast
  qed

  lemma pseudonaturally_equivalent_symmetric:
  assumes "pseudonaturally_equivalent
             VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG"
  shows "pseudonaturally_equivalent
             VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG F ΦF"
  proof -
    obtain τ0 τ1 where τ: "pseudonatural_equivalence
                           VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1"
      using assms pseudonaturally_equivalent_def by blast
    interpret τ: pseudonatural_equivalence
                    VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
      using τ by simp
    interpret σ: converse_pseudonatural_equivalence
                    VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
      ..
    show ?thesis
      using σ.is_pseudonatural_equivalence pseudonaturally_equivalent_def by blast
  qed

  lemma pseudonaturally_equivalent_transitive:
  assumes "pseudonaturally_equivalent
             VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG"
  and "pseudonaturally_equivalent
         VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG H ΦH"
  shows "pseudonaturally_equivalent
           VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF H ΦH"
  proof -
    obtain τ0 τ1 where τ: "pseudonatural_equivalence
                            VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1"
      using assms pseudonaturally_equivalent_def by blast
    interpret τ: pseudonatural_equivalence
                   VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
      using τ by simp
    obtain σ0 σ1 where σ: "pseudonatural_equivalence
                             VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG H ΦH σ0 σ1"
      using assms pseudonaturally_equivalent_def by blast
    interpret σ: pseudonatural_equivalence
                   VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG H ΦH σ0 σ1
      using σ by simp
    interpret στ: composite_pseudonatural_equivalence VB HB 𝖺B 𝗂B srcB trgB
                    VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG H ΦH τ0 τ1 σ0 σ1
      ..
    show ?thesis
      using στ.pseudonatural_equivalence_axioms pseudonaturally_equivalent_def by blast
  qed

  text ‹
    If τ› is a pseudonatural equivalence from pseudofunctor F› to pseudofunctor G›
    and σ› is the converse equivalence, then F› is locally naturally isomorphic to
    the functor that takes a 2-cell μ› of C› to σ0 (trgC μ) ⋆D G μ ⋆D τ0 (srcC μ)›
    and symmetrically for G›.  Here we just establish the naturality property and
    and that each 1-cell «g : a →C a'»› is isomorphic to τ0 a' ⋆D0 a' ⋆D g ⋆D τ0 a) ⋆D σ0 a›.
    We ultimately need these results to prove that a pseudofunctor extends to an
    equivalence of bicategories if and only if it is an equivalence pseudofunctor.
  ›

  context pseudonatural_equivalence
  begin

    interpretation σ: converse_pseudonatural_equivalence
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
      ..

    abbreviation (input) σ0
    where "σ0  σ.map0"

    definition φ
    where "φ f  𝖺D[τ0 (trgC f), F f, σ0 (srcC f)] D
                 (τ1 f D σ0 (srcC f)) D
                 𝖺D-1[G f, τ0 (srcC f), σ0 (srcC f)] D
                 (G f D D.inv (σ.ε (srcC f))) D
                 𝗋D-1[G f]"

    lemma φ_in_hom [intro]:
    assumes "C.ide f"
    shows "«φ f : G f D τ0 (trgC f) D F f D σ0 (srcC f)»"
      unfolding φ_def
      using assms by (intro D.comp_in_homI' D.hseqI') auto

    lemma iso_φ:
    assumes "C.ide f"
    shows "D.iso (φ f)"
      unfolding φ_def
      using assms iso_map1_ide
      by (intro D.isos_compose) auto

    definition ψ
    where "ψ f  (σ0 (trgC f) D D.inv (τ1 f)) D
                  𝖺D[σ0 (trgC f), τ0 (trgC f), F f] D
                  (σ.η (trgC f) D F f) D
                  𝗅D-1[F f]"

    lemma ψ_in_hom [intro]:
    assumes "C.ide f"
    shows "«ψ f : F f D σ0 (trgC f) D G f D τ0 (srcC f)»"
      unfolding ψ_def
      using assms iso_map1_ide
      by (intro D.comp_in_homI' D.hseqI') auto

    lemma iso_ψ:
    assumes "C.ide f"
    shows "D.iso (ψ f)"
      unfolding ψ_def
      using assms iso_map1_ide
      by (intro D.isos_compose) auto

    lemma ψ_naturality:
    assumes "C.arr μ"
    shows "(σ0 (trgC μ) D G μ D τ0 (srcC μ)) D ψ (C.dom μ) = ψ (C.cod μ) D F μ"
    and "D.inv (ψ (C.cod μ)) D (σ0 (trgC μ) D G μ D τ0 (srcC μ)) D ψ (C.dom μ) = F μ"
    proof -
      let ?a = "srcC μ" and ?a' = "trgC μ"
      let ?f = "C.dom μ" and ?f' = "C.cod μ"
      have "(σ0 ?a' D G μ D τ0 ?a) D ψ (C.dom μ)
              = ((σ0 ?a' D G μ D τ0 ?a) D
                (σ0 ?a' D D.inv (τ1 ?f))) D
                𝖺D[σ0 ?a', τ0 ?a', F ?f] D
                (σ.η ?a' D F ?f) D
                𝗅D-1[F ?f]"
        unfolding ψ_def       
        using assms D.comp_assoc by simp
      also have "... = (σ0 ?a' D D.inv (τ1 ?f')) D
                       ((σ0 ?a' D τ0 ?a' D F μ) D
                       𝖺D[σ0 ?a', τ0 ?a', F ?f]) D
                       (σ.η ?a' D F ?f) D
                       𝗅D-1[F ?f]"            
      proof -
        have "(σ0 ?a' D G μ D τ0 ?a) D (σ0 ?a' D D.inv (τ1 ?f))
                = σ0 ?a' D (G μ D τ0 ?a) D D.inv (τ1 ?f)"
          using assms D.whisker_left iso_map1_ide by simp
        also have "... = σ0 ?a' D D.inv (τ1 ?f') D (τ0 ?a' D F μ)"
          using assms naturality iso_map1_ide
                D.invert_opposite_sides_of_square
                   [of "τ1 ?f'" "G μ D τ0 ?a" "τ0 ?a' D F μ" "τ1 ?f"]
          by simp
        also have "... = (σ0 ?a' D D.inv (τ1 ?f')) D (σ0 ?a' D τ0 ?a' D F μ)"
          using assms D.whisker_left iso_map1_ide by simp
        finally have "(σ0 ?a' D G μ D τ0 ?a) D (σ0 ?a' D D.inv (τ1 ?f))
                        = (σ0 ?a' D D.inv (τ1 ?f')) D (σ0 ?a' D τ0 ?a' D F μ)"
          by blast
        thus ?thesis
          using D.comp_assoc by simp
      qed
      also have "... = (σ0 ?a' D D.inv (τ1 ?f')) D
                       𝖺D[σ0 ?a', τ0 ?a', F ?f'] D
                       (((σ0 ?a' D τ0 ?a') D F μ) D
                       (σ.η ?a' D F ?f)) D
                       𝗅D-1[F ?f]"            
      proof -
        have "(σ0 ?a' D τ0 ?a' D F μ) D 𝖺D[σ0 ?a', τ0 ?a', F ?f]
                = 𝖺D[σ0 ?a', τ0 ?a', F ?f'] D ((σ0 ?a' D τ0 ?a') D F μ)"
          using assms D.assoc_naturality [of "σ0 ?a'" "τ0 ?a'" "F μ"] by simp
        thus ?thesis
          using D.comp_assoc by simp
      qed
      also have "... = (σ0 ?a' D D.inv (τ1 ?f')) D
                       𝖺D[σ0 ?a', τ0 ?a', F ?f'] D
                       (σ.η ?a' D F ?f') D
                       (F.map0 ?a' D F μ) D
                       𝗅D-1[F ?f]"            
      proof -
        have "((σ0 ?a' D τ0 ?a') D F μ) D (σ.η ?a' D F ?f)
                = (σ0 ?a' D τ0 ?a') D σ.η ?a' D F μ D F ?f"
          using assms D.interchange [of "σ0 ?a' D τ0 ?a'" "σ.η ?a'" "F μ" "F ?f"]
          by simp
        also have "... = σ.η ?a' D F.map0 ?a' D F ?f' D F μ"
          using assms D.comp_arr_dom D.comp_cod_arr by simp
        also have "... = (σ.η ?a' D F ?f') D (F.map0 ?a' D F μ)"
          using assms D.interchange [of "σ.η ?a'" "F.map0 ?a'" "F ?f'" "F μ"]
                σ.unit_in_hom [of ?a']
          by fastforce
        finally have "((σ0 ?a' D τ0 ?a') D F μ) D (σ.η ?a' D F ?f)
                        = (σ.η ?a' D F ?f') D (F.map0 ?a' D F μ)"
          by blast
        thus ?thesis
          using D.comp_assoc by simp
      qed
      also have "... = ψ ?f' D F μ"            
      proof -
        have "(F.map0 ?a' D F μ) D 𝗅D-1[F ?f] = 𝗅D-1[F ?f'] D F μ"
          using assms D.lunit'_naturality [of "F μ"] by simp
        thus ?thesis
        unfolding ψ_def       
          using assms D.comp_assoc by simp
      qed
      finally show "(σ0 ?a' D G μ D τ0 ?a) D ψ (C.dom μ) = ψ ?f' D F μ"
        by blast
      thus "D.inv (ψ ?f') D (σ0 ?a' D G μ D τ0 ?a) D ψ (C.dom μ) = F μ"
        using assms ψ_in_hom iso_ψ
        by (metis C.ide_cod D.in_homE D.invert_side_of_triangle(1) D.seqI
            F.preserves_arr F.preserves_cod)
    qed

    lemma isomorphic_expansion:
    assumes "C.obj a" and "C.obj a'" and "«g : G.map0 a D G.map0 a'»" and "D.ide g"
    shows "D.isomorphic (τ0 a' D (σ0 a' D g D τ0 a) D σ0 a) g"
    proof -
      let ?g' = "σ0 a' D g D τ0 a"
      have g': "«?g' : F.map0 a D F.map0 a'»"
        using assms ide_map0_obj σ.map0_simps(3) C.obj_simps
        by (intro D.in_hhomI D.hseqI') auto
      have ide_g': "D.ide ?g'"
        using assms g' σ.ide_map0_obj ide_map0_obj by blast
      let  = "(σ0 a' D 𝗋D[g]) D (σ0 a' D g D σ.ε a) D
                (σ0 a' D 𝖺D[g, τ0 a, σ0 a]) D 𝖺D[σ0 a', g D τ0 a, σ0 a]"
      have ψ: "« : ?g' D σ0 a D σ0 a' D g»"
      proof (intro D.comp_in_homI)
        show "«𝖺D[σ0 a', g D τ0 a, σ0 a] :
                 (σ0 a' D g D τ0 a) D σ0 a D σ0 a' D (g D τ0 a) D σ0 a»"
          using assms g' by fastforce
        show "«σ0 a' D 𝖺D[g, τ0 a, σ0 a] :
                 σ0 a' D (g D τ0 a) D σ0 a D σ0 a' D g D τ0 a D σ0 a»"
          using assms g' by fastforce
        show "«σ0 a' D g D σ.ε a :
                 σ0 a' D g D τ0 a D σ0 a D σ0 a' D g D G.map0 a»"
          using assms C.obj_simps
          by (intro D.hcomp_in_vhom) auto
        show "«σ0 a' D 𝗋D[g] : σ0 a' D g D G.map0 a D σ0 a' D g»"
          using assms
          apply (intro D.hcomp_in_vhom)
            apply auto
          by fastforce
      qed
      have iso_ψ: "D.iso "
        using assms g' ψ ide_g' ide_map0_obj C.obj_simps
        by (intro D.isos_compose) auto
      let  = "𝗅D[g] D (σ.ε a' D g) D 𝖺D-1[τ0 a', σ0 a', g] D (τ0 a' D )"
      have φ: "« : τ0 a' D ?g' D σ0 a D g»"
      proof (intro D.comp_in_homI)
        show "«τ0 a' D  : τ0 a' D ?g' D σ0 a D τ0 a' D σ0 a' D g»"
          using assms g' ψ C.obj_simps
          by (intro D.hcomp_in_vhom) auto
        show "«𝖺D-1[τ0 a', σ0 a', g] : τ0 a' D σ0 a' D g D (τ0 a' D σ0 a') D g»"
        proof -
          have "srcD (τ0 a') = trgD (σ0 a')"
            using assms by auto
          moreover have "srcD (σ0 a') = trgD g"
            using assms by auto
          ultimately show ?thesis
            using assms ide_map0_obj σ.ide_map0_obj by auto
        qed
        show "«σ.ε a' D g : (τ0 a' D σ0 a') D g D G.map0 a' D g»"
          using assms by fastforce
        show "«𝗅D[g] : G.map0 a' D g D g»"
          using assms by auto
      qed
      have iso_φ: "D.iso "
        using assms g' φ ψ iso_ψ ide_map0_obj iso_map1_ide σ.ide_map0_obj
        apply (intro D.isos_compose)
              apply (meson D.arrI D.hseqE D.ide_is_iso D.iso_hcomp D.seqE)
             apply (metis D.hseqE D.in_hhomE D.iso_assoc' D.trg_hcomp F.map0_def map0_simps(2))
        by auto
      show ?thesis
        using φ iso_φ D.isomorphic_def by auto
    qed

  end

  text ‹
    Here we show that pseudonatural equivalence respects equivalence pseudofunctors,
    in the sense that a pseudofunctor G›, pseudonaturally equivalent to an
    equivalence pseudofunctor F›, is itself an equivalence pseudofunctor.
  ›

  locale pseudofunctor_pseudonaturally_equivalent_to_equivalence_pseudofunctor =
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    F: equivalence_pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF +
    pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG +
    τ: pseudonatural_equivalence VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
  for VC :: "'c comp"                   (infixr "C" 55)
  and HC :: "'c comp"                   (infixr "C" 53)
  and 𝖺C :: "'c  'c  'c  'c"       ("𝖺C[_, _, _]")
  and 𝗂C :: "'c  'c"                   ("𝗂C[_]")
  and srcC :: "'c  'c"
  and trgC :: "'c  'c"
  and VD :: "'d comp"                   (infixr "D" 55)
  and HD :: "'d comp"                   (infixr "D" 53)
  and 𝖺D :: "'d  'd  'd  'd"       ("𝖺D[_, _, _]")
  and 𝗂D :: "'d  'd"                   ("𝗂D[_]")
  and srcD :: "'d  'd"
  and trgD :: "'d  'd"
  and F :: "'c  'd"
  and ΦF :: "'c * 'c  'd"
  and G :: "'c  'd"
  and ΦG :: "'c * 'c  'd"
  and τ0 :: "'c  'd"
  and τ1 :: "'c  'd"
  begin

    interpretation σ': converse_pseudonatural_equivalence
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
      ..

    sublocale G: equivalence_pseudofunctor
                   VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG
    proof
      show "μ μ'. C.par μ μ'; G μ = G μ'  μ = μ'"
      proof -
        fix μ μ'
        assume par: "C.par μ μ'" and eq: "G μ = G μ'"
        let ?a = "srcC μ" and ?a' = "trgC μ"
        let ?f = "C.dom μ" and ?f' = "C.cod μ"
        have "τ0 ?a' D F μ = (τ0 ?a' D F μ) D τ1 ?f D D.inv (τ1 ?f)"
          using par τ.ide_map0_obj τ.iso_map1_ide D.comp_arr_dom D.comp_arr_inv'
                τ.map1_in_hom [of μ]
          by (metis C.dom_trg C.ide_dom C.obj_trg C.trg.preserves_dom D.whisker_left
              F.as_nat_trans.is_natural_2 F.as_nat_trans.naturality F.preserves_arr
              τ.map1_simps(5))
        also have "... = ((τ0 ?a' D F μ) D τ1 ?f) D D.inv (τ1 ?f)"
          using D.comp_assoc by simp
        also have "... = ((τ0 ?a' D F μ') D τ1 ?f) D D.inv (τ1 ?f)"
          using eq par τ.naturality [of μ] τ.naturality [of μ'] C.src_cod C.trg_cod by metis
        also have 1: "... = (τ0 ?a' D F μ') D τ1 ?f D D.inv (τ1 ?f)"
          using D.comp_assoc by blast
        also have "... = τ0 ?a' D F μ'"
          using par τ.iso_map1_ide D.comp_arr_dom D.comp_arr_inv' τ.map1_in_hom [of μ']
          by (metis 1 C.ide_dom C.trg_cod D.hseqE D.hseqI' D.hseq_char' D.seqE
              F.preserves_arr F.preserves_trg calculation)
        finally have "τ0 ?a' D F μ = τ0 ?a' D F μ'"
          by blast
        hence "F μ = F μ'"
          using par τ.components_are_equivalences
                D.equivalence_cancel_left [of "τ0 ?a'" "F μ" "F μ'"]
          by simp
        thus "μ = μ'"
          using par F.is_faithful by blast
      qed
      show "b. D.obj b  a. C.obj a  D.equivalent_objects (map0 a) b"
      proof -
        fix b
        assume b: "D.obj b"
        obtain a where a: "C.obj a  D.equivalent_objects (F.map0 a) b"
          using b F.biessentially_surjective_on_objects by blast
        have "D.equivalent_objects (F.map0 a) (map0 a)"
          using a τ.components_are_equivalences D.equivalent_objects_def
          by (metis F.map0_def map0_def τ.map0_in_hhom)
        hence "D.equivalent_objects (map0 a) b"
          using a D.equivalent_objects_symmetric D.equivalent_objects_transitive by blast
        thus "a. C.obj a  D.equivalent_objects (map0 a) b"
          using a by auto
      qed
      show "a a' g. C.obj a; C.obj a'; «g : map0 a D map0 a'»; D.ide g
                        f. «f : a C a'»  C.ide f  D.isomorphic (G f) g"
      proof -
        fix a a' g
        assume a: "C.obj a" and a': "C.obj a'"
        assume g: "«g : map0 a D map0 a'»" and ide_g: "D.ide g"
        interpret σ: converse_pseudonatural_equivalence
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1
          ..
        interpret σ: pseudonatural_equivalence
                       VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD
                       G ΦG F ΦF σ'.map0 σ'.map1
          using σ'.is_pseudonatural_equivalence by simp
        let ?g' = "σ'.map0 a' D g D τ0 a"
        have g': "«?g' : F.map0 a D F.map0 a'»"
          using a a' g τ.ide_map0_obj σ'.map0_simps(3) C.obj_simps
          by (intro D.in_hhomI D.hseqI') auto
        have ide_g': "D.ide ?g'"
          using a a' g g' ide_g
          by (meson D.hcomp_in_hhomE D.hseqE D.ide_hcomp σ'.ide_map0_obj τ.ide_map0_obj)
        obtain f where f: "«f : a C a'»  C.ide f  D.isomorphic (F f) ?g'"
          using a a' g g' ide_g' F.locally_essentially_surjective [of a a' ?g'] by auto
        obtain ξ where ξ: "«ξ : F f D ?g'»  D.iso ξ"
          using f D.isomorphic_def by blast
        have "D.isomorphic (G f) g"
        proof -
          have "D.isomorphic (G f) (τ0 a' D F f D σ'.map0 a)"
            using a a' f τ.iso_φ D.isomorphic_def by blast
          also have "D.isomorphic ... (τ0 a' D ?g' D σ'.map0 a)"
            using a a' g' ξ D.isomorphic_def
            by (metis D.hcomp_ide_isomorphic D.hcomp_isomorphic_ide D.hseqE D.ideD(1)
                D.isomorphic_implies_ide(2) σ'.ide_map0_obj calculation τ.ide_map0_obj)
          also have "D.isomorphic ... g"
            using a a' g ide_g τ.isomorphic_expansion by simp
          finally show ?thesis by blast
        qed
        thus "f. «f : a C a'»  C.ide f  D.isomorphic (G f) g"
          using f by auto
      qed
      show "f f' ν. C.ide f; C.ide f'; srcC f = srcC f'; trgC f = trgC f'; «ν : G f D G f'»
                          μ. «μ : f C f'»  G μ = ν"
      proof -
        fix f f' ν
        assume f: "C.ide f" and f': "C.ide f'"
        and eq_src: "srcC f = srcC f'" and eq_trg: "trgC f = trgC f'"
        and ν: "«ν : G f D G f'»"
        let ?a = "srcC f" and ?a' = "trgC f"
        let ?ν' = "D.inv (τ.ψ f') D (σ'.map0 ?a' D ν D τ0 ?a) D τ.ψ f"
        have ν': "«?ν' : F f D F f'»"
        proof (intro D.comp_in_homI)
          show "«τ.ψ f : F f D σ'.map0 ?a' D G f D τ0 ?a»"
            using f τ.ψ_in_hom [of f] by blast
          show "«σ'.map0 ?a' D ν D τ0 ?a :
                   σ'.map0 ?a' D G f D τ0 ?a D σ'.map0 ?a' D G f' D τ0 ?a»"
            using f ν by (intro D.hcomp_in_vhom) auto
          show "«D.inv (τ.ψ f') : σ'.map0 ?a' D G f' D τ0 ?a D F f'»"
            using f' τ.iso_ψ eq_src eq_trg by auto
        qed
        obtain μ where μ: "«μ : f C f'»  F μ = ?ν'"
          using f f' eq_src eq_trg ν' F.locally_full [of f f' ?ν'] by blast
        have "G μ = ν"
        proof -
          have "D.inv (τ.ψ f') D (σ'.map0 (trgC μ) D G μ D τ0 (srcC μ)) D τ.ψ f =
                D.inv (τ.ψ f') D (σ'.map0 ?a' D ν D τ0 ?a) D τ.ψ f"
            using μ τ.ψ_naturality [of μ] by auto
          hence "σ'.map0 (trgC μ) D G μ D τ0 (srcC μ) = σ'.map0 ?a' D ν D τ0 ?a"
            using f f' ν' τ.iso_ψ
                  D.iso_cancel_left
                    [of "D.inv (τ.ψ f')" "(σ'.map0 (trgC μ) D G μ D τ0 (srcC μ)) D τ.ψ f"
                        "(σ'.map0 ?a' D ν D τ0 ?a) D τ.ψ f"]
                  D.iso_cancel_right
                    [of "τ.ψ f" "σ'.map0 (trgC μ) D G μ D τ0 (srcC μ)" "σ'.map0 ?a' D ν D τ0 ?a"]
            by auto
          hence "σ'.map0 ?a' D G μ D τ0 ?a = σ'.map0 ?a' D ν D τ0 ?a"
            using μ by auto
          moreover have "D.par (G μ D τ0 (srcC f)) (ν D τ0 (srcC f))"
            using f μ ν ν'
            apply (intro conjI D.hseqI')
                   apply (auto simp add: D.vconn_implies_hpar(1))
             apply fastforce
            by (metis C.ideD(1) C.vconn_implies_hpar(1) D.hcomp_simps(4) D.hseqE D.hseqI'
                D.seqE D.vconn_implies_hpar(1) preserves_arr preserves_cod preserves_src
                weak_arrow_of_homs_axioms category.in_homE horizontal_homs_def
                weak_arrow_of_homs_def)
          ultimately have "G μ D τ0 ?a = ν D τ0 ?a"
            using f f' μ ν τ.ide_map0_obj σ'.ide_map0_obj
                  D.equivalence_cancel_left [of "σ'.map0 ?a'" "G μ D τ0 ?a" "ν D τ0 ?a"]
                  σ'.components_are_equivalences
            by auto
          moreover have "D.par (G μ) ν"
            using f f' μ ν by fastforce
          ultimately show ?thesis
            using f f' μ ν τ.ide_map0_obj
                  D.equivalence_cancel_right [of "τ0 ?a" "G μ" "ν"] τ.components_are_equivalences
            by auto
        qed
        thus "μ. «μ : f C f'»  G μ = ν"
          using μ by auto
      qed
    qed

    lemma is_equivalence_pseudofunctor:
    shows "equivalence_pseudofunctor VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG"
      ..

  end

  lemma pseudonaturally_equivalent_respects_equivalence_pseudofunctor:
  assumes "pseudonaturally_equivalent
             VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG"
  and "equivalence_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF"
  shows "equivalence_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG"
  proof -
    obtain τ0 τ1 where τ: "pseudonatural_equivalence
                            VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1"
      using assms pseudonaturally_equivalent_def by blast
    interpret F: equivalence_pseudofunctor
                   VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF
      using assms by simp
    interpret G: pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG
      using assms τ
      by (simp add: pseudonatural_equivalence_def pseudonatural_transformation_def)
    interpret τ: pseudonatural_equivalence
                   VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
      using τ by simp
    interpret G: pseudofunctor_pseudonaturally_equivalent_to_equivalence_pseudofunctor
                   VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC F ΦF G ΦG τ0 τ1
      ..
    show "equivalence_pseudofunctor VB HB 𝖺B 𝗂B srcB trgB VC HC 𝖺C 𝗂C srcC trgC G ΦG"
      using G.is_equivalence_pseudofunctor by simp
  qed

end