Theory Modification

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

section "Modifications"

text ‹
  Modifications are morphisms of pseudonatural transformations.
  In this section, we give a definition of ``modification'', and we prove that
  the mappings η› and ε›, which were chosen in the course of showing that a
  pseudonatural equivalence τ› has a converse pseudonatural equivalence τ'›,
  are invertible modifications that relate the composites τ'τ› and ττ'›
  to the identity pseudonatural transformations on F› and G›.
  This means that τ› and τ'› are quasi-inverses in a suitable bicategory
  of pseudofunctors, pseudonatural transformations, and modifications, though
  we do not go so far as to give a formal construction of such a bicategory.
›

theory Modification
imports PseudonaturalTransformation
begin

  locale modification =  (* 12 sec *)
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    τ: 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 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"
  and τ0' :: "'c  'd"
  and τ1' :: "'c  'd"
  and Γ :: "'c  'd" +
  assumes Γ_in_hom: "C.obj a  «Γ a : τ0 a D τ0' a»"
  and naturality: " «f : a C b»; C.ide f   τ1' f D (G f D Γ a) = (Γ b D F f) D τ1 f"

  locale invertible_modification =  (* 13 sec *)
    modification +
    assumes components_are_iso: "C.obj a  D.iso (Γ a)"

  locale identity_modification =  (* 12 sec *)
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    τ: pseudonatural_transformation
         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

    abbreviation map
    where "map  τ0"

    sublocale invertible_modification
                VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1 τ0 τ1 map
      using D.comp_arr_dom D.comp_cod_arr
      by unfold_locales auto

  end

  locale composite_modification =  (* 13 sec *)
    C: bicategory VC HC 𝖺C 𝗂C srcC trgC +
    D: bicategory VD HD 𝖺D 𝗂D srcD trgD +
    ρ: 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 F ΦF G ΦG σ0 σ1 +
    τ: pseudonatural_transformation
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG τ0 τ1 +
    Γ: modification
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG ρ0 ρ1 σ0 σ1 Γ +
    Δ: modification
         VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG σ0 σ1 τ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"
  and σ0 :: "'c  'd"
  and σ1 :: "'c  'd"
  and τ0 :: "'c  'd"
  and τ1 :: "'c  'd"
  and Γ :: "'c  'd"
  and Δ :: "'c  'd"
  begin

    abbreviation map
    where "map a  Δ a D Γ a"

    sublocale modification
                VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF G ΦG ρ0 ρ1 τ0 τ1 map
      using Δ.Γ_in_hom Γ.Γ_in_hom Δ.naturality Γ.naturality
      apply unfold_locales
       apply auto[1]
    proof -
      fix f a b
      assume f: "«f : a C b»" and ide_f: "C.ide f"
      have "τ1 f D (G f D map a) = (τ1 f D (G f D Δ a)) D (G f D Γ a)"
      proof -
        have "D.seq (Δ a) (Γ a)"
          using f Δ.Γ_in_hom Γ.Γ_in_hom by blast
        thus ?thesis
          using f ide_f D.whisker_left [of "G f" "Δ a" "Γ a"] D.comp_assoc
          by simp
      qed
      also have "... = (Δ b D F f) D σ1 f D (G f D Γ a)"
        using f ide_f Δ.naturality [of f a b] D.comp_assoc by simp
      also have "... = ((Δ b D F f) D (Γ b D F f)) D ρ1 f"
        using f ide_f Γ.naturality [of f a b] D.comp_assoc by simp
      also have "...  = (map b D F f) D ρ1 f"
      proof -
        have "D.seq (Δ b) (Γ b)"
          using f Δ.Γ_in_hom Γ.Γ_in_hom by blast
        thus ?thesis
          using f ide_f D.whisker_right [of "F f" "Δ b" "Γ b"] by simp
      qed
      finally show "τ1 f D (G f D map a) = (map b D F f) D ρ1 f" by simp
    qed

  end

  context converse_pseudonatural_equivalence
  begin

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

    interpretation ιF: identity_pseudonatural_transformation
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF
      ..
    interpretation ιG: identity_pseudonatural_transformation
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG
      ..

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

    interpretation η: invertible_modification
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF F ΦF
                        ιF.map0 ιF.map1 τ'τ.map0 τ'τ.map1 η
    proof
      show "a. C.obj a  «η a : F.map0 a D τ'τ.map0 a»"
        using unit_in_hom τ'τ.map0_def by simp
      show "a. C.obj a  D.iso (η a)"
        by simp
      show "f a b.  «f : a C b»; C.ide f
                        τ'τ.map1 f D (F f D η a) = (η b D F f) D 𝗅D-1[F f] D 𝗋D[F f]"
      proof -
        fix f a b
        assume f: "«f : a C b»" and ide_f: "C.ide f"
        have a: "C.obj a" and b: "C.obj b"
          using f by auto
        have "τ'τ.map1 f D (F f D η a) =
                (𝖺D-1[τ0' b, τ0 b, F f] D
                (τ0' b D τ1 f) D
                𝖺D[τ0' b, G f, τ0 a] 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 τ0 a) D
                𝖺D-1[F f, τ0' a, τ0 a]) D
                (F f D η a)"
          unfolding τ'τ.map1_def map1_def
          using a b f D.comp_assoc by auto
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         (((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                         ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                         (((η b D F f) D τ0' a) D τ0 a) D
                         (((𝗅D-1[F f] D τ0' a) D τ0 a) D
                         𝖺D-1[F f, τ0' a, τ0 a]) D
                         (F f D η a)"
        proof -
          have "(τ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 τ0 a
                  = ((τ0' b D 𝗋D[G f]) D τ0 a) D
                    ((τ0' b D G f D ε a) D τ0 a) D
                    ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                    (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                    (((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                    ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                    (((η b D F f) D τ0' a) D τ0 a) D
                    ((𝗅D-1[F f] D τ0' a) D τ0 a)"
          proof -
            have "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 a b f ide_f τ.iso_map1_ide
              by (metis (no_types, lifting) C.in_hhomE map1_def map1_simps(1))
            thus ?thesis
              using a b f D.whisker_right [of "τ0 a"] by fastforce
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         (((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                         ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                         (((η b D F f) D τ0' a) D τ0 a) D
                         𝖺D-1[F0 b D F f, τ0' a, τ0 a] D
                         (𝗅D-1[F f] D τ0' a D τ0 a) D
                         (F f D η a)"
        proof -
          have "((𝗅D-1[F f] D τ0' a) D τ0 a) D 𝖺D-1[F f, τ0' a, τ0 a] =
                𝖺D-1[F0 b D F f, τ0' a, τ0 a] D (𝗅D-1[F f] D τ0' a D τ0 a)"
            using a b f ide_f D.assoc'_naturality [of "𝗅D-1[F f]" "τ0' a" "τ0 a"] by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         (((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                         ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                         ((((η b D F f) D τ0' a) D τ0 a) D
                         𝖺D-1[F0 b D F f, τ0' a, τ0 a]) D
                         ((F0 b D F f) D η a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(𝗅D-1[F f] D τ0' a D τ0 a) D (F f D η a) = 𝗅D-1[F f] D η a"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "𝗅D-1[F f]" "F f" "τ0' a D τ0 a" "η a"]
            by simp
          also have "... = ((F0 b D F f) D η a) D (𝗅D-1[F f] D F0 a)"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "F0 b D F f" "𝗅D-1[F f]" "η a" "F0 a"]
            by auto
          finally have "(𝗅D-1[F f] D τ0' a D τ0 a) D (F f D η a) =
                        ((F0 b D F f) D η a) D (𝗅D-1[F f] D F0 a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         (((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                         ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                         𝖺D-1[(τ0' b D τ0 b) D F f, τ0' a, τ0 a] D
                         (((η b D F f) D τ0' a D τ0 a) D
                         ((F0 b D F f) D η a)) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(((η b D F f) D τ0' a) D τ0 a) D 𝖺D-1[F0 b D F f, τ0' a, τ0 a] =
                𝖺D-1[(τ0' b D τ0 b) D F f, τ0' a, τ0 a] D ((η b D F f) D τ0' a D τ0 a)"
            using a b f ide_f D.assoc'_naturality [of "η b D F f" "τ0' a" "τ0 a"] by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         ((((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                         ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a)) D
                         𝖺D-1[(τ0' b D τ0 b) D F f, τ0' a, τ0 a] D
                         (((τ0' b D τ0 b) D F f) D η a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "((η b D F f) D τ0' a D τ0 a) D ((F0 b D F f) D η a)
                  = (η b D F f) D η a"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "η b D F f" "F0 b D F f" "τ0' a D τ0 a" "η a"]
            by auto
          also have "... = (((τ0' b D τ0 b) D F f) D η a) D ((η b D F f) D F0 a)"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "(τ0' b D τ0 b) D F f" "η b D F f" "η a" "F0 a"]
            by auto
          finally have "((η b D F f) D τ0' a D τ0 a) D ((F0 b D F f) D η a) =
                        (((τ0' b D τ0 b) D F f) D η a) D ((η b D F f) D F0 a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         ((((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                         𝖺D-1[(τ0' b D τ0 b) D F f, τ0' a, τ0 a]) D
                         (((τ0' b D τ0 b) D F f) D η a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(((τ0' b D D.inv (τ1 f)) D τ0' a) D τ0 a) D
                  ((𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) =
                ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a"
            using a b f ide_f D.whisker_right τ.iso_map1_ide by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                         (((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a D τ0 a) D
                         (((τ0' b D τ0 b) D F f) D η a)) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D τ0 a) D
                  𝖺D-1[(τ0' b D τ0 b) D F f, τ0' a, τ0 a] =
                𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                  ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a D τ0 a)"
            using a b f ide_f τ.iso_map1_ide
                  D.assoc'_naturality
                    [of "(τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f]" "τ0' a" "τ0 a"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         ((τ0' b D G f D ε a) D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                         ((τ0' b D G f D τ0 a) D η a) D
                         ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a D τ0 a) D
                  (((τ0' b D τ0 b) D F f) D η a) =
                ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f]) D ((τ0' b D τ0 b) D F f) D
                  (τ0' a D τ0 a) D η a"
            using a b f ide_f τ.iso_map1_ide
                  D.interchange [of "(τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f]"
                                    "(τ0' b D τ0 b) D F f" "τ0' a D τ0 a" "η a"]
            by auto
          also have "... = (τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D η a"
            using a b f ide_f τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr D.comp_assoc
            by auto
          also have "... = (τ0' b D G f D τ0 a) D
                           (τ0' b D D.inv (τ1 f)) D
                           𝖺D[τ0' b, τ0 b, F f]
                             D η a D F0 a"
            using a b f ide_f τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr by auto
          also have "... = ((τ0' b D G f D τ0 a) D η a) D
                             ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a)"
          proof -
            have "D.seq (τ0' b D G f D τ0 a) ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f])"
              using a b f ide_f τ.iso_map1_ide
              by (intro D.seqI D.hseqI') auto
            thus ?thesis
              using a b f ide_f τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr
                    D.interchange [of "(τ0' b D G f D τ0 a)"
                                      "(τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f]"
                                      "η a" "F0 a"]
              by simp
          qed
          finally have "((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D τ0' a D τ0 a) D
                          (((τ0' b D τ0 b) D F f) D η a) =
                        ((τ0' b D G f D τ0 a) D η a) D
                          ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                         (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                         ((τ0' b D G f) D ε a D τ0 a) D
                         (𝖺D[τ0' b D G f, τ0 a D τ0' a, τ0 a] D
                         (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a) D
                         ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                         (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                         𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                         (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                         𝖺D-1[τ0' b D G f, τ0 a, τ0' a D τ0 a]) D
                         ((τ0' b D G f) D τ0 a D η a) D
                         𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                         (𝖺D-1[τ0' b, G f, τ0 a] D F0 a) D
                         ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(τ0' b D G f D ε a) D τ0 a
                  = (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                    (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                    ((τ0' b D G f) D ε a D τ0 a) D
                    𝖺D[τ0' b D G f, τ0 a D τ0' a, τ0 a]) D
                    (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a)"
          proof -
            have "(τ0' b D G f D ε a) D τ0 a
                    = (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                      (((τ0' b D G f) D ε a) D τ0 a) D
                      (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a)"
              using a b f ide_f D.hcomp_reassoc D.whisker_right [of "τ0 a"] by auto
            also have "... = (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                             (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                             ((τ0' b D G f) D ε a D τ0 a) D
                             𝖺D[τ0' b D G f, τ0 a D τ0' a, τ0 a]) D
                             (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a)"
              using a b f ide_f D.hcomp_reassoc(1) [of "τ0' b D G f" "ε a" "τ0 a"]
              by auto
            finally show ?thesis by blast
          qed
          moreover have "(τ0' b D G f D τ0 a) D η a
                           = (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                             (𝖺D-1[τ0' b D G f, τ0 a, τ0' a D τ0 a] D
                             ((τ0' b D G f) D τ0 a D η a) D
                             𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                             (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)"
          proof -
            have "(τ0' b D G f D τ0 a) D η a =
                  𝖺D[τ0' b, G f, τ0 a] D ((τ0' b D G f) D τ0 a) D 𝖺D-1[τ0' b, G f, τ0 a] D
                    (τ0' a D τ0 a) D η a D F0 a"
              using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                    D.hcomp_reassoc(2) [of "τ0' b" "G f" "τ0 a"]
              by auto
            also have "... = (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                             (((τ0' b D G f) D τ0 a) D η a) D
                             (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)"
              using a b f ide_f D.inv_inv D.iso_inv_iso D.interchange by auto
            also have "... = (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                             (𝖺D-1[τ0' b D G f, τ0 a, τ0' a D τ0 a] D
                             ((τ0' b D G f) D τ0 a D η a) D
                             𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                             (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)"
              using a b f ide_f D.hcomp_reassoc(1) [of "τ0' b D G f" "τ0 a" "η a"] by auto
            finally show ?thesis by blast
          qed
          ultimately show ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                         (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                         (((τ0' b D G f) D ε a D τ0 a) D
                         ((τ0' b D G f) D 𝖺D-1[τ0 a, τ0' a, τ0 a]) D
                         ((τ0' b D G f) D τ0 a D η a)) D
                         𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                         (𝖺D-1[τ0' b, G f, τ0 a] D F0 a) D
                         ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "𝖺D[τ0' b D G f, τ0 a D τ0' a, τ0 a] D
                (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a) D
                ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                𝖺D-1[τ0' b D G f, τ0 a, τ0' a D τ0 a] =
                (τ0' b D G f) D 𝖺D-1[τ0 a, τ0' a, τ0 a]"
          proof -
            have "𝖺D[τ0' b D G f, τ0 a D τ0' a, τ0 a] D
                    (𝖺D-1[τ0' b, G f, τ0 a D τ0' a] D τ0 a) D
                    ((τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D τ0 a) D
                    (𝖺D[τ0' b, G f D τ0 a, τ0' a] D τ0 a) D
                    𝖺D-1[τ0' b D (G f D τ0 a), τ0' a, τ0 a] D
                    (𝖺D[τ0' b, G f, τ0 a] D τ0' a D τ0 a) D
                    𝖺D-1[τ0' b D G f, τ0 a, τ0' a D τ0 a]
                      = 𝖺[τ0' b  G f, τ0 a  τ0' a, τ0 a] 
                        (𝖺-1[τ0' b, G f, τ0 a  τ0' a]  τ0 a) 
                        ((τ0' b  𝖺[ G f, τ0 a, τ0' a])  τ0 a) 
                        (𝖺[τ0' b, G f  τ0 a, τ0' a]  τ0 a) 
                        𝖺-1[τ0' b  (G f  τ0 a), τ0' a, τ0 a] 
                        (𝖺[τ0' b, G f, τ0 a]  τ0' a  τ0 a) 
                        𝖺-1[τ0' b  G f, τ0 a, τ0' a  τ0 a]"
              using a b f ide_f D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by auto
            also have "... = (τ0' b  G f)  𝖺-1[τ0 a, τ0' a, τ0 a]"
              using a b f ide_f by (intro EV.eval_eqI, auto)
            also have "... = (τ0' b D G f) D 𝖺D-1[τ0 a, τ0' a, τ0 a]"
              using a b f ide_f D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by auto
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         (𝖺D[τ0' b, G f, τ0 a] D
                         ((τ0' b D 𝗋D[G f]) D τ0 a) D
                         (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                         (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                         ((τ0' b D G f) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]) D
                         𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                         (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)) D
                         ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 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' b D G f) D ε a D τ0 a) D
                ((τ0' b D G f) D 𝖺D-1[τ0 a, τ0' a, τ0 a]) D
                ((τ0' b D G f) D τ0 a D η a)
                  = (τ0' b D G f) D (ε a D τ0 a) D
                    𝖺D-1[τ0 a, τ0' a, τ0 a] D
                    (τ0 a D η a)"
            using a b f ide_f D.whisker_left by auto
          also have "... = (τ0' b D G f) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]"
            using triangle_left by simp
          finally have "((τ0' b D G f) D ε a D τ0 a) D
                        ((τ0' b D G f) D 𝖺D-1[τ0 a, τ0' a, τ0 a]) D
                        ((τ0' b D G f) D τ0 a D η a)
                          = (τ0' b D G f) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = 𝖺D-1[τ0' b, τ0 b, F f] D
                         (τ0' b D τ1 f) D
                         (𝗋D[τ0' b D G f D τ0 a] D
                         ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a)) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "𝖺D[τ0' b, G f, τ0 a] D
                ((τ0' b D 𝗋D[G f]) D τ0 a) D
                (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                ((τ0' b D G f) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]) D
                𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)
                  = 𝗋D[τ0' b D G f D τ0 a]"
          proof -
            have "𝖺D[τ0' b, G f, τ0 a] D
                  ((τ0' b D 𝗋D[G f]) D τ0 a) D
                  (𝖺D[τ0' b, G f, G0 a] D τ0 a) D
                  (𝖺D-1[τ0' b D G f, G0 a, τ0 a] D
                  ((τ0' b D G f) D 𝗅D-1[τ0 a] D 𝗋D[τ0 a]) D
                  𝖺D[τ0' b D G f, τ0 a, F0 a]) D
                  (𝖺D-1[τ0' b, G f, τ0 a] D F0 a)
                    = 𝖺[τ0' b, G f, τ0 a] 
                      ((τ0' b  𝗋[G f])  τ0 a) 
                      (𝖺[τ0' b, G f, G0 a0]  τ0 a) 
                      (𝖺-1[τ0' b  G f, G0 a0, τ0 a] 
                      ((τ0' b  G f)  𝗅-1[τ0 a]  𝗋[τ0 a]) 
                      𝖺[τ0' b  G f, τ0 a, F0 a0]) 
                      (𝖺-1[τ0' b, G f, τ0 a]  F0 a0)"
              using a b f ide_f 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 auto
            also have "... = 𝗋[τ0' b  G f  τ0 a]"
              using a b f ide_f by (intro EV.eval_eqI, auto)
            also have "... = 𝗋D[τ0' b D G f D τ0 a]"
              using a b f ide_f 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 auto
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (𝖺D-1[τ0' b, τ0 b, F f] D
                         ((τ0' b D τ1 f) D
                         (τ0' b D D.inv (τ1 f)))) D
                         𝖺D[τ0' b, τ0 b, F f] D 𝗋D[(τ0' b D τ0 b) D F f] D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "𝗋D[τ0' b D G f D τ0 a] D
                ((τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f] D F0 a)
                  = (τ0' b D D.inv (τ1 f)) D
                    𝖺D[τ0' b, τ0 b, F f] D
                    𝗋D[(τ0' b D τ0 b) D F f]"
            using a b f ide_f D.comp_assoc τ.iso_map1_ide
                  D.runit_naturality [of "(τ0' b D D.inv (τ1 f)) D 𝖺D[τ0' b, τ0 b, F f]"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((𝖺D-1[τ0' b, τ0 b, F f] D
                          𝖺D[τ0' b, τ0 b, F f]) D
                          𝗋D[(τ0' b D τ0 b) D F f]) D
                         ((η b D F f) D F0 a) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "𝖺D-1[τ0' b, τ0 b, F f] D ((τ0' b D τ1 f) D (τ0' b D D.inv (τ1 f)))
                  = 𝖺D-1[τ0' b, τ0 b, F f]"
            using a b f ide_f D.comp_arr_inv' D.comp_arr_dom τ.iso_map1_ide
                  D.whisker_left [of "τ0' b" "τ1 f" "D.inv (τ1 f)"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (𝗋D[(τ0' b D τ0 b) D F f] D
                         ((η b D F f) D F0 a)) D
                         (𝗅D-1[F f] D F0 a)"
        proof -
          have "(𝖺D-1[τ0' b, τ0 b, F f] D 𝖺D[τ0' b, τ0 b, F f]) D 𝗋D[(τ0' b D τ0 b) D F f]
                  = 𝗋D[(τ0' b D τ0 b) D F f]"
            using a b f ide_f D.comp_inv_arr' D.comp_cod_arr by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (η b D F f) D 𝗋D[F0 b D F f] D (𝗅D-1[F f] D F0 a)"
        proof -
          have "𝗋D[(τ0' b D τ0 b) D F f] D ((η b D F f) D F0 a)
                  = (η b D F f) D 𝗋D[F0 b D F f]"
            using a b f ide_f D.runit_naturality [of "η b D F f"] by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (η b D F f) D  𝗅D-1[F f] D 𝗋D[F f]"
          using a b f ide_f D.runit_naturality [of "𝗅D-1[F f]"] by auto
        finally show "τ'τ.map1 f D (F f D η a) = (η b D F f) D 𝗅D-1[F f] D 𝗋D[F f]"
          by blast
      qed
    qed

    lemma unit_is_invertible_modification:
    shows "invertible_modification
                     VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD F ΦF F ΦF
                     ιF.map0 ιF.map1 τ'τ.map0 τ'τ.map1 η"
      ..

    interpretation ε: invertible_modification
                        VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG G ΦG
                        ττ'.map0 ττ'.map1 ιG.map0 ιG.map1 ε
    proof
      show "a. C.obj a  «ε a : ττ'.map0 a D G0 a»"
        using counit_in_hom ττ'.map0_def by simp
      show "a. C.obj a  D.iso (ε a)"
        by simp
      show "f a b. «f : a C b»; C.ide f
                        (𝗅D-1[G f] D 𝗋D[G f]) D (G f D ε a) = (ε b D G f) D ττ'.map1 f"
      proof -
        fix f a b
        assume f: "«f : a C b»" and ide_f: "C.ide f"
        have a: "C.obj a" and b: "C.obj b"
          using f by auto
        have "(ε b D G f) D ττ'.map1 f
                = (ε b D G f) D 
                  𝖺D-1[τ0 b, τ0' b, G f] D
                  (τ0 b 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[τ0 b, F f, τ0' a] D
                  (τ1 f D τ0' a) D
                  𝖺D-1[G f, τ0 a, τ0' a]"
          unfolding ττ'.map1_def map1_def
          using a b f D.comp_assoc by auto
        also have "... = (ε b D G f) D 
                         𝖺D-1[τ0 b, τ0' b, G f] D
                         (τ0 b D τ0' b D 𝗋D[G f]) D
                         (τ0 b D τ0' b D G f D ε a) D
                         (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D
                         ((τ0 b D 𝖺D[τ0' b, G f D τ0 a, τ0' a]) D
                         (τ0 b D (τ0' b D D.inv (τ1 f)) D τ0' a)) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "τ0 b 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)
                  = (τ0 b D τ0' b D 𝗋D[G f]) D
                    (τ0 b D τ0' b D G f D ε a) D
                    (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D
                    (τ0 b D 𝖺D[τ0' b, G f D τ0 a, τ0' a]) D
                    (τ0 b D (τ0' b D D.inv (τ1 f)) D τ0' a) D
                    (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                    (τ0 b D (η b D F f) D τ0' a) D
                    (τ0 b D 𝗅D-1[F f] D τ0' a)"
          proof -
            have "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 a b f ide_f τ.iso_map1_ide
              by (intro D.seqI) auto
            thus ?thesis
              using a b f D.whisker_left [of "τ0 b"] by fastforce
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (ε b D G f) D 
                         𝖺D-1[τ0 b, τ0' b, G f] D
                         (τ0 b D τ0' b D 𝗋D[G f]) D
                         (τ0 b D τ0' b D G f D ε a) D
                         ((τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D
                         (τ0 b D τ0' b D D.inv (τ1 f) D τ0' a)) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(τ0 b D 𝖺D[τ0' b, G f D τ0 a, τ0' a]) D
                (τ0 b D (τ0' b D D.inv (τ1 f)) D τ0' a)
                  = τ0 b D 𝖺D[τ0' b, G f D τ0 a, τ0' a] D
                           ((τ0' b D D.inv (τ1 f)) D τ0' a)"
            using a b f ide_f D.whisker_left [of "τ0 b"] τ.iso_map1_ide by auto
          also have "... = τ0 b D (τ0' b D D.inv (τ1 f) D τ0' a) D
                                  𝖺D[τ0' b, τ0 b D F f, τ0' a]"
            using a b f ide_f τ.iso_map1_ide
                  D.assoc_naturality [of "τ0' b" "D.inv (τ1 f)" "τ0' a"]
            by auto
          also have "... = (τ0 b D τ0' b D D.inv (τ1 f) D τ0' a) D
                           (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a])"
            using a b f ide_f D.whisker_left [of "τ0 b"] τ.iso_map1_ide by auto
          finally have "(τ0 b D 𝖺D[τ0' b, G f D τ0 a, τ0' a]) D
                        (τ0 b D (τ0' b D D.inv (τ1 f)) D τ0' a)
                          = (τ0 b D τ0' b D D.inv (τ1 f) D τ0' a) D
                            (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a])"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (ε b D G f) D 
                         (𝖺D-1[τ0 b, τ0' b, G f] D
                         (τ0 b D τ0' b D 𝗋D[G f])) D
                         (τ0 b D τ0' b D G f D ε a) D
                         (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a]) D
                (τ0 b D τ0' b D D.inv (τ1 f) D τ0' a)
                  = τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"
            using a b f ide_f D.whisker_left τ.iso_map1_ide by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (ε b D G f) D 
                         ((τ0 b D τ0' b) D 𝗋D[G f]) D
                         (𝖺D-1[τ0 b, τ0' b, G f D G0 a] D
                         (τ0 b D τ0' b D G f D ε a)) D
                         (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "𝖺D-1[τ0 b, τ0' b, G f] D (τ0 b D τ0' b D 𝗋D[G f])
                  = ((τ0 b D τ0' b) D 𝗋D[G f]) D 𝖺D-1[τ0 b, τ0' b, G f D G0 a]"
            using a b f ide_f D.assoc'_naturality [of "τ0 b" "τ0' b" "𝗋D[G f]"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (ε b D G f) D 
                         ((τ0 b D τ0' b) D 𝗋D[G f]) D
                         ((τ0 b D τ0' b) D G f D ε a) D
                         (𝖺D-1[τ0 b, τ0' b, G f D τ0 a D τ0' a] D
                         (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "𝖺D-1[τ0 b, τ0' b, G f D G0 a] D (τ0 b D τ0' b D G f D ε a)
                  = ((τ0 b D τ0' b) D G f D ε a) D 𝖺D-1[τ0 b, τ0' b, G f D τ0 a D τ0' a]"
            using a b f ide_f D.assoc'_naturality [of "τ0 b" "τ0' b" "G f D ε a"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((ε b D G f) D 
                         ((τ0 b D τ0' b) D 𝗋D[G f])) D
                         ((τ0 b D τ0' b) D G f D ε a) D
                         ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "𝖺D-1[τ0 b, τ0' b, G f D τ0 a D τ0' a] D
                (τ0 b D τ0' b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))
                  = ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                    𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a]"
            using a b f ide_f τ.iso_map1_ide
                  D.assoc'_naturality
                    [of "τ0 b" "τ0' b" "𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         ((ε b D G f D G0 a) D
                         ((τ0 b D τ0' b) D G f D ε a)) D
                         ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(ε b D G f) D ((τ0 b D τ0' b) D 𝗋D[G f]) = ε b D 𝗋D[G f]"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "ε b" "τ0 b D τ0' b" "G f" "𝗋D[G f]"]
            by simp
          also have "... = (G0 b D 𝗋D[G f]) D (ε b D G f D G0 a)"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "G0 b" "ε b" "𝗋D[G f]" "G f D G0 a"]
            by auto
          finally have "(ε b D G f) D ((τ0 b D τ0' b) D 𝗋D[G f]) =
                        (G0 b D 𝗋D[G f]) D (ε b D G f D G0 a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         ((ε b D G f D τ0 a D τ0' a) D
                         ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))) D
                         𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(ε b D G f D G0 a) D ((τ0 b D τ0' b) D G f D ε a)
                  = ε b D G f D ε a"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "ε b" "τ0 b D τ0' b" "G f D G0 a" "G f D ε a"]
            by auto
          also have "... = (G0 b D G f D ε a) D (ε b D G f D τ0 a D τ0' a)"
            using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                  D.interchange [of "G0 b" "ε b" "G f D ε a" "G f D τ0 a D τ0' a"]
            by auto
          finally have "(ε b D G f D G0 a) D ((τ0 b D τ0' b) D G f D ε a) =
                        (G0 b D G f D ε a) D (ε b D G f D τ0 a D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) 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 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D (η b D F f) D τ0' a) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have 1: "D.seq (G f D τ0 a D τ0' a)
                         (𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))"
            using a b f ide_f τ.iso_map1_ide
            by (intro D.seqI D.hseqI') auto
          have 2: "D.seq (𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))
                         ((τ0 b D F f) D τ0' a)"
            using a b f ide_f τ.iso_map1_ide
            by (intro D.seqI D.hseqI') auto
          have "(ε b D G f D τ0 a D τ0' a) D
                  ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) =
                ε b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"
            using 1 a b f ide_f D.comp_arr_dom D.comp_cod_arr τ.iso_map1_ide
                  D.interchange [of "ε b" "τ0 b D τ0' b" "G f D τ0 a D τ0' a"
                                    "𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"]
            by auto
          also have "... = G0 b D ε b D
                             (𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                             ((τ0 b D F f) D τ0' a)"
            using a b f ide_f τ.iso_map1_ide D.comp_arr_dom D.comp_cod_arr by auto
          also have "... = (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                           (ε b D (τ0 b D F f) D τ0' a)"
            using 2 a b f ide_f τ.iso_map1_ide D.comp_assoc
                  D.interchange [of "G0 b" "ε b"
                                    "𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"
                                    "(τ0 b D F f) D τ0' a"]
            by simp
          finally have "(ε b D G f D τ0 a D τ0' a) D
                        ((τ0 b D τ0' b) D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a))
                          = (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                            (ε b D (τ0 b D F f) D τ0' a)"
            by blast
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         (G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                         (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                         ((ε b D τ0 b) D F f D τ0' a) D
                         (𝖺D-1[τ0 b D τ0' b, τ0 b, F f D τ0' a] D
                         ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a]) D
                         𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
                         (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                         (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                         (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) 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) D
                         𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                         (τ0 b D 𝖺D[F0 b, F f, τ0' a]) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "ε b D (τ0 b D F f) D τ0' a
                  = (G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                    (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                    ((ε b D τ0 b) D F f D τ0' a) D
                    𝖺D-1[τ0 b D τ0' b, τ0 b, F f D τ0' a]) D
                    ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a])"
          proof -
            have "ε b D (τ0 b D F f) D τ0' a
                    = (G0 b D ε b D (τ0 b D τ0' b)) D
                      𝖺D-1[τ0 b, F f, τ0' a] D (τ0 b D F f D τ0' a) D 𝖺D[τ0 b, F f, τ0' a]"
              using a b f ide_f D.comp_arr_dom D.comp_cod_arr
                    D.hcomp_reassoc(1) [of "τ0 b" "F f" "τ0' a"]
              by auto
           also have "... = (G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                            (ε b D τ0 b D F f D τ0' a) D
                            ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a])"
             using a b f ide_f D.comp_arr_dom D.comp_cod_arr D.assoc'_is_natural_1
                   D.interchange [of "G0 b" "ε b D (τ0 b D τ0' b)" "𝖺D-1[τ0 b, F f, τ0' a]"
                                     "(τ0 b D F f D τ0' a) D 𝖺D[τ0 b, F f, τ0' a]"]
                   D.interchange [of "ε b" "τ0 b D τ0' b" "τ0 b D F f D τ0' a"
                                     "𝖺D[τ0 b, F f, τ0' a]"]
             by fastforce
           also have "... = (G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                            (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                            ((ε b D τ0 b) D F f D τ0' a) D
                            𝖺D-1[τ0 b D τ0' b, τ0 b, F f D τ0' a]) D
                            ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a])"
              using a b f ide_f D.hcomp_reassoc(2) [of "ε b" "τ0 b" "F f D τ0' a"]
              by auto
           finally show ?thesis by blast
         qed
         moreover have "τ0 b D (η b D F f) D τ0' a
                          = (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) 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) D
                            𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                            (τ0 b D 𝖺D[F0 b, F f, τ0' a])"
         proof -
           have "τ0 b D (η b D F f) D τ0' a =
                 (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) D
                   (τ0 b D η b D F f D τ0' a) D
                   (τ0 b D 𝖺D[F0 b, F f, τ0' a])"
             using a b f ide_f D.hcomp_reassoc(1) [of "η b" "F f" "τ0' a"]
                   D.whisker_left [of "τ0 b"]
             by auto
           also have "... = (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) 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) D
                              𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                              (τ0 b D 𝖺D[F0 b, F f, τ0' a])"
             using a b f ide_f D.hcomp_reassoc(2) [of "τ0 b" "η b" "F f D τ0' a"]
             by auto
           finally show ?thesis by blast
         qed
         ultimately show ?thesis
           using D.comp_assoc by simp
       qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         (G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                         (𝖺D[G0 b, τ0 b, F f D τ0' a] 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)) D
                         𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                         (τ0 b D 𝖺D[F0 b, F f, τ0' a]) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a] D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
       proof -
         have "𝖺D-1[τ0 b D τ0' b, τ0 b, F f D τ0' a] D
               ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a]) D
               𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
               (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
               (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
               (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) D
               𝖺D[τ0 b, τ0' b D τ0 b, F f D τ0' a]
                 = 𝖺D-1[τ0 b, τ0' b, τ0 b] D F f D τ0' a"
         proof -
           have "𝖺D-1[τ0 b D τ0' b, τ0 b, F f D τ0' a] D
                 ((τ0 b D τ0' b) D 𝖺D[τ0 b, F f, τ0' a]) D
                 𝖺D-1[τ0 b, τ0' b, (τ0 b D F f) D τ0' a] D
                 (τ0 b D 𝖺D[τ0' b, τ0 b D F f, τ0' a]) D
                 (τ0 b D 𝖺D[τ0' b, τ0 b, F f] D τ0' a) D
                 (τ0 b D 𝖺D-1[τ0' b D τ0 b, F f, τ0' a]) D
                 𝖺D[τ0 b, τ0' b D τ0 b, F f D τ0' a]
                   = 𝖺-1[τ0 b  τ0' b, τ0 b, F f  τ0' a] 
                     ((τ0 b  τ0' b)  𝖺[τ0 b, F f, τ0' a]) 
                     𝖺-1[τ0 b, τ0' b, (τ0 b  F f)  τ0' a] 
                     (τ0 b  𝖺[τ0' b, τ0 b  F f, τ0' a]) 
                     (τ0 b  𝖺[τ0' b, τ0 b, F f]  τ0' a) 
                     (τ0 b  𝖺-1[τ0' b  τ0 b, F f, τ0' a]) 
                     𝖺[τ0 b, τ0' b  τ0 b, F f  τ0' a]"
              using a b f ide_f D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by auto
            also have "... = 𝖺-1[τ0 b, τ0' b, τ0 b]  F f  τ0' a"
              using a b f ide_f by (intro EV.eval_eqI, auto)
            also have "... = 𝖺D-1[τ0 b, τ0' b, τ0 b] D F f D τ0' a"
              using a b f ide_f D.α_def D.α'.map_ide_simp D.VVV.ide_charSbC D.VVV.arr_charSbC
                    D.VV.ide_charSbC D.VV.arr_charSbC
              by auto
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by auto
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         (G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         ((G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                         (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                         (𝗅D-1[τ0 b] D 𝗋D[τ0 b] D F f D τ0' a) D
                         𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                         (τ0 b D 𝖺D[F0 b, F f, τ0' a]) D
                         (τ0 b D 𝗅D-1[F f] D τ0' a) D
                         𝖺D[τ0 b, F f, τ0' a]) D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "((ε 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)
                  = 𝗅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 b chosen_adjoint_equivalence by simp
            have "((ε 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)
                    = (ε 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 a b f ide_f D.whisker_right by auto
            also have "... = 𝗅D-1[τ0 b] D 𝗋D[τ0 b] D F f D τ0' a"
              using triangle_left by simp
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         ((G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                         𝗅D-1[(τ0 b D F f) D τ0' a]) D
                         (τ1 f D τ0' a) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                (𝗅D-1[τ0 b] D 𝗋D[τ0 b] D F f D τ0' a) D
                𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                (τ0 b D 𝖺D[F0 b, F f, τ0' a]) D
                (τ0 b D 𝗅D-1[F f] D τ0' a) D
                𝖺D[τ0 b, F f, τ0' a]
                  = 𝗅D-1[(τ0 b D F f) D τ0' a]"
          proof -
            have "(G0 b D 𝖺D-1[τ0 b, F f, τ0' a]) D
                  (𝖺D[G0 b, τ0 b, F f D τ0' a] D
                  (𝗅D-1[τ0 b] D 𝗋D[τ0 b] D F f D τ0' a) D
                  𝖺D-1[τ0 b, F0 b, F f D τ0' a]) D
                  (τ0 b D 𝖺D[F0 b, F f, τ0' a]) D
                  (τ0 b D 𝗅D-1[F f] D τ0' a) D
                  𝖺D[τ0 b, F f, τ0' a]
                    = (G0 b0  𝖺-1[τ0 b, F f, τ0' a]) 
                      (𝖺[G0 b0, τ0 b, F f  τ0' a] 
                      (𝗅-1[τ0 b]  𝗋[τ0 b]  F f  τ0' a) 
                      𝖺-1[τ0 b, F0 b0, F f  τ0' a]) 
                      (τ0 b  𝖺[F0 b0, F f, τ0' a]) 
                      (τ0 b  𝗅-1[F f]  τ0' a) 
                      𝖺[τ0 b, F f, τ0' a]"
              using a b f ide_f 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 auto
            also have "... = 𝗅-1[(τ0 b  F f)  τ0' a]"
              using a b f ide_f by (intro EV.eval_eqI, auto)
            also have "... = 𝗅D-1[(τ0 b D F f) D τ0' a]"
              using a b f ide_f 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
              by auto
            finally show ?thesis by blast
          qed
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         𝗅D-1[G f D τ0 a D τ0' a] D
                         𝖺D[G f, τ0 a, τ0' a] D
                         ((D.inv (τ1 f) D τ0' a) D
                         (τ1 f D τ0' a)) D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "(G0 b D 𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)) D
                𝗅D-1[(τ0 b D F f) D τ0' a]
                  = 𝗅D-1[G f D τ0 a D τ0' a] D
                    𝖺D[G f, τ0 a, τ0' a] D
                    (D.inv (τ1 f) D τ0' a)"
            using a b f ide_f τ.iso_map1_ide
                  D.lunit'_naturality [of "𝖺D[G f, τ0 a, τ0' a] D (D.inv (τ1 f) D τ0' a)"]
            by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         𝗅D-1[G f D τ0 a D τ0' a] D
                         𝖺D[G f, τ0 a, τ0' a] D
                         𝖺D-1[G f, τ0 a, τ0' a]"
        proof -
          have "((D.inv (τ1 f) D τ0' a) D (τ1 f D τ0' a)) D 𝖺D-1[G f, τ0 a, τ0' a] =
                ((D.inv (τ1 f) D τ1 f) D τ0' a) D 𝖺D-1[G f, τ0 a, τ0' a]"
            using a b f ide_f τ.iso_map1_ide D.whisker_right [of "τ0' a"] by simp
          also have "... = 𝖺D-1[G f, τ0 a, τ0' a]"
            using a b f ide_f τ.iso_map1_ide D.comp_inv_arr' D.comp_cod_arr by auto
          finally show ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (G0 b D 𝗋D[G f]) D
                         (G0 b D G f D ε a) D
                         𝗅D-1[G f D τ0 a D τ0' a]"
        proof -
          have "𝗅D-1[G f D τ0 a D τ0' a] D 𝖺D[G f, τ0 a, τ0' a] D 𝖺D-1[G f, τ0 a, τ0' a] =
                𝗅D-1[G f D τ0 a D τ0' a]"
            using a b f ide_f D.comp_arr_inv' D.comp_arr_dom by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = ((G0 b D 𝗋D[G f]) D 𝗅D-1[G f D G0 a]) D (G f D ε a)"
        proof -
          have "(G0 b D 𝗋D[G f]) D (G0 b D G f D ε a) D 𝗅D-1[G f D τ0 a D τ0' a] =
                (G0 b D 𝗋D[G f]) D 𝗅D-1[G f D G0 a] D (G f D ε a)"
            using a b f ide_f D.lunit'_naturality [of "G f D ε a"] by auto
          thus ?thesis
            using D.comp_assoc by simp
        qed
        also have "... = (𝗅D-1[G f] D 𝗋D[G f]) D (G f D ε a)"
          using a b f ide_f D.lunit'_naturality [of "𝗋D[G f]"] by auto
        finally show "(𝗅D-1[G f] D 𝗋D[G f]) D (G f D ε a) = (ε b D G f) D ττ'.map1 f"
          by simp
      qed
    qed

    lemma counit_is_invertible_modification:
    shows "invertible_modification
             VC HC 𝖺C 𝗂C srcC trgC VD HD 𝖺D 𝗂D srcD trgD G ΦG G ΦG
             ττ'.map0 ττ'.map1 ιG.map0 ιG.map1 ε"
      ..

  end

end