/-- Bicategory structure on the free bicategory. -/
instance bicategory : Bicategory (FreeBicategory B) where
  homCategory := @fun (a b : B) => FreeBicategory.homCategory a b
  whiskerLeft := @fun a b c f g h η => Quot.map (Hom₂.whisker_left f) (Rel.whisker_left f g h) η
  whiskerLeft_id := @fun a b c f g => Quot.sound (Rel.whisker_left_id f g)
  associator := @fun a b c d f g h =>
    { hom := Quot.mk Rel (Hom₂.associator f g h)
      inv := Quot.mk Rel (Hom₂.associator_inv f g h)
      hom_inv_id := Quot.sound (Rel.associator_hom_inv f g h)
      inv_hom_id := Quot.sound (Rel.associator_inv_hom f g h) }
  leftUnitor := @fun a b f =>
    { hom := Quot.mk Rel (Hom₂.left_unitor f)
      inv := Quot.mk Rel (Hom₂.left_unitor_inv f)
      hom_inv_id := Quot.sound (Rel.left_unitor_hom_inv f)
      inv_hom_id := Quot.sound (Rel.left_unitor_inv_hom f) }
  rightUnitor := @fun a b f =>
    { hom := Quot.mk Rel (Hom₂.right_unitor f)
      inv := Quot.mk Rel (Hom₂.right_unitor_inv f)
      hom_inv_id := Quot.sound (Rel.right_unitor_hom_inv f)
      inv_hom_id := Quot.sound (Rel.right_unitor_inv_hom f) }
  whiskerLeft_comp := by
    rintro a b c f g h i ⟨η⟩ ⟨θ⟩
    exact Quot.sound (Rel.whisker_left_comp f η θ)
  id_whiskerLeft := by
    rintro a b f g ⟨η⟩
    exact Quot.sound (Rel.id_whisker_left η)
  comp_whiskerLeft := by
    rintro a b c d f g h h' ⟨η⟩
    exact Quot.sound (Rel.comp_whisker_left f g η)
  whiskerRight := @fun a b c f g η h => Quot.map (Hom₂.whisker_right h) (Rel.whisker_right f g h) η
  id_whiskerRight := @fun a b c f g => Quot.sound (Rel.id_whisker_right f g)
  comp_whiskerRight := by
    rintro a b c f g h ⟨η⟩ ⟨θ⟩ i
    exact Quot.sound (Rel.comp_whisker_right i η θ)
  whiskerRight_id := by
    rintro a b f g ⟨η⟩
    exact Quot.sound (Rel.whisker_right_id η)
  whiskerRight_comp := by
    rintro a b c d f f' ⟨η⟩ g h
    exact Quot.sound (Rel.whisker_right_comp g h η)
  whisker_assoc := by
    rintro a b c d f g g' ⟨η⟩ h
    

Proof state:
case mk
B : Type u
inst✝ : Quiver B
a b c d : FreeBicategory B
f : a ⟶ b
g g' : b ⟶ c
η✝ : g ⟶ g'
η : Hom₂ g g'
h : c ⟶ d
⊢ (fun a b c f g η h =>
        Quot.map (Hom₂.whisker_right h)
          (_ : ∀ (η η' : Hom₂ f g), Rel η η' → Rel (Hom₂.whisker_right h η) (Hom₂.whisker_right h η')) η)
      a c d (f ≫ g) (f ≫ g')
      ((fun a b c f g h η =>
          Quot.map (Hom₂.whisker_left f)
            (_ : ∀ (η η' : Hom₂ g h), Rel η η' → Rel (Hom₂.whisker_left f η) (Hom₂.whisker_left f η')) η)
        a b c f g g' (Quot.mk Rel η))
      h =
    ((fun a b c d f g h => Iso.mk (Quot.mk Rel (Hom₂.associator f g h)) (Quot.mk Rel (Hom₂.associator_inv f g h))) a b c
          d f g h).hom ≫
      (fun a b c f g h η =>
            Quot.map (Hom₂.whisker_left f)
              (_ : ∀ (η η' : Hom₂ g h), Rel η η' → Rel (Hom₂.whisker_left f η) (Hom₂.whisker_left f η')) η)
          a b d f (g ≫ h) (g' ≫ h)
          ((fun a b c f g η h =>
              Quot.map (Hom₂.whisker_right h)
                (_ : ∀ (η η' : Hom₂ f g), Rel η η' → Rel (Hom₂.whisker_right h η) (Hom₂.whisker_right h η')) η)
            b c d g g' (Quot.mk Rel η) h) ≫
        ((fun a b c d f g h => Iso.mk (Quot.mk Rel (Hom₂.associator f g h)) (Quot.mk Rel (Hom₂.associator_inv f g h))) a
            b c d f g' h).inv

Next tactic:
exact Quot.sound (Rel.whisker_assoc f η h)