remove the very last admit (missing proof) from GeneralizedArrowFromReification
[coq-hetmet.git] / src / GeneralizedArrowFromReification.v
index 810e862..9ff0d4d 100644 (file)
@@ -265,13 +265,633 @@ Section GArrowFromReification.
        (garrow_functor >>>> bin_second(BinoidalCat:=enr_c_bin C) (R' a))
     <~~~>  (bin_second(BinoidalCat:=enr_v_pmon K) a >>>> garrow_functor) :=
     { ni_iso := fun a => iso_id _ }.
-    admit.
+
+    intros.
+      etransitivity.  apply iso_id_lemma1.  symmetry.
+      etransitivity.  apply iso_id_lemma2.  symmetry.
+
+    Opaque Underlying.
+    unfold garrow_functor.
+      unfold functor_comp at 1.
+      unfold functor_comp at 1.
+      Opaque functor_comp. simpl. Transparent functor_comp.
+
+    symmetry.
+      eapply transitivity.
+      apply (functor_comp_assoc (RestrictToImage reification) (R' >>>> step2_functor) (ebc_second (R' a)) f).
+      unfold functor_comp at 1.
+      unfold functor_comp at 1.
+      Opaque functor_comp. simpl. Transparent functor_comp.
+
+    symmetry.
+      eapply transitivity.
+      set (ni_commutes (mf_second(PreMonoidalFunctor:=reification_rstar reification) a) f) as qq.
+      unfold functor_comp in qq.
+      simpl in qq.
+      apply iso_shift_right' in qq.
+      apply (fmor_respects(R' >>>> step2_functor) _ _ qq).
+
+    apply (me_faithful(MonicEnrichment:=CMon)).
+      symmetry.
+      unfold fmor at 1.
+      eapply transitivity.
+      set (ni_commutes (mf_second(PreMonoidalFunctor:=CM) (R' a))) as zz.
+      unfold functor_comp in zz; unfold functor_fobj in zz; simpl in zz.
+      set (zz _ _ ((R' >>>> step2_functor) \ (reification \ f))) as zz'.
+      apply iso_shift_right' in zz'.
+      apply zz'.
+
+    unfold functor_comp; simpl.
+
+    symmetry.
+      eapply transitivity.
+      set full_roundtrip as full_roundtrip'.
+      unfold fmor in full_roundtrip'.
+      simpl in full_roundtrip'.
+      apply full_roundtrip'.
+
+    set (@iso_shift_right') as q. simpl in q. apply q. clear q.
+
+    set (@iso_shift_left) as q.   simpl in q. apply q. clear q.
+
+    symmetry.
+      eapply transitivity.
+      set full_roundtrip as full_roundtrip'.
+      unfold fmor in full_roundtrip'.
+      simpl in full_roundtrip'.
+      apply (fun a' b' f z => fmor_respects (bin_second(BinoidalCat:=enr_v_bin C) z) _ _ (full_roundtrip' a' b' f)).
+      symmetry.
+
+    intros.
+      unfold bin_obj.
+      unfold senr_v_bobj.
+
+    setoid_rewrite <- associativity.
+      setoid_rewrite <- associativity.
+      setoid_rewrite <- associativity.
+      setoid_rewrite <- associativity.
+      simpl.
+      setoid_rewrite <- associativity.
+      etransitivity.
+      eapply transitivity.
+        apply associativity.
+        eapply transitivity; [ idtac | apply right_identity ].
+        apply comp_respects; [ reflexivity | idtac ].
+        etransitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        apply (mf_consistent(PreMonoidalFunctor:=CM)).
+        apply iso_comp1.
+
+    eapply transitivity.
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply transitivity.
+        eapply symmetry.
+        eapply associativity.
+      eapply transitivity; [ idtac | apply left_identity ].
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply transitivity.
+        eapply comp_respects; [ idtac | reflexivity ].
+        eapply symmetry.
+        apply (mf_consistent(PreMonoidalFunctor:=CM)).
+        apply iso_comp1.
+
+    eapply symmetry.
+      eapply transitivity.
+      setoid_rewrite <- fmor_preserves_comp.
+      setoid_rewrite <- fmor_preserves_comp.
+      eapply reflexivity.
+      eapply symmetry.
+
+    apply comp_respects; try reflexivity.
+
+    eapply transitivity.
+      apply associativity.
+      eapply transitivity.
+      apply associativity.
+      eapply transitivity.
+      apply associativity.
+      eapply transitivity.
+      apply associativity.
+      apply comp_respects; try reflexivity.
+
+    eapply transitivity.
+      eapply comp_respects; [ reflexivity | idtac ].
+      eapply transitivity.
+      eapply comp_respects; [ idtac | reflexivity ].
+      apply mf_consistent.
+      eapply transitivity.
+      eapply comp_respects; [ reflexivity | idtac ].
+        apply associativity.
+      apply iso_comp1_right.
+
+    eapply transitivity.
+      eapply comp_respects; [ reflexivity | idtac ].
+      eapply transitivity.
+        apply associativity.
+      eapply comp_respects; [ reflexivity | idtac ].
+      eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+      eapply transitivity; [ idtac | apply left_identity ].
+      eapply comp_respects; [ idtac | reflexivity ].
+      eapply transitivity.
+        eapply comp_respects; [ idtac | reflexivity ].
+        eapply symmetry.
+        eapply (mf_consistent(PreMonoidalFunctor:=reification)).
+      apply iso_comp1.
+
+    eapply transitivity.
+      eapply comp_respects; [ reflexivity | idtac ].
+      eapply symmetry.
+      apply (centralmor_first(CentralMorphism:=commutative_central(CommutativeCat:=enr_v_mon C) _)).
+      eapply transitivity; [ idtac | apply right_identity ].
+
+    eapply transitivity.
+      eapply symmetry.
+      apply associativity.
+    eapply transitivity.
+      eapply comp_respects; [ idtac | reflexivity ].
+      unfold functor_fobj.
+      apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) (reification_rstar_obj reification A))).
+
+    apply symmetry.
+      eapply transitivity.
+      apply right_identity.
+      apply symmetry.
+      eapply transitivity; [ idtac | apply left_identity ].
+      apply comp_respects; [ idtac | reflexivity ].
+
+    eapply transitivity.
+      Focus 2.
+      eapply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) (reification_rstar_obj reification A))).
+      idtac.
+      apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) (reification_rstar_obj reification A))).
+      apply iso_comp2.
     Defined.
 
 Implicit Arguments mf_first [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0] [C2] [bin_obj'0] [bc0] [I2] [PM2] [fobj] [F]].
 Implicit Arguments mf_second [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0] [C2] [bin_obj'0] [bc0] [I2] [PM2] [fobj] [F]].
 Implicit Arguments mf_i [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0] [C2] [bin_obj'0] [bc0] [I2] [PM2] [fobj] [F]].
 
+  Lemma assoc_lemma1 : forall a b c,
+       iso_backward ((mf_first reification c) (a ⊗ b)) >>>
+       iso_backward ((mf_second reification a) b) ⋉ reification c >>>
+      #(pmon_assoc(PreMonoidalCat:=enr_v_mon C) (reification a) (reification c) (reification_rstar_obj reification b)) >>>
+      reification a ⋊ #((mf_first reification c) b) >>>
+      #((mf_second reification a) (b ⊗ c)) ~~
+      reification \ #((pmon_assoc(PreMonoidalCat:=enr_v_mon K) a c) b).
+
+    intros.
+      eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply associativity.
+        apply symmetry.
+        set (@iso_shift_right') as q.
+        simpl in q.
+        apply q.
+        clear q.
+        
+      eapply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        set (mf_assoc(PreMonoidalFunctor:=reification)) as q.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply q.
+
+      eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; try reflexivity.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        eapply transitivity; [ idtac | apply left_identity ].
+        apply comp_respects; try reflexivity.
+      
+      eapply transitivity.
+        apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+      eapply transitivity; [ idtac |
+        apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) _)) ].
+      apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) _)).
+      apply iso_comp2.
+      Qed.
+
+  Lemma assoc_lemma2 : forall a b c,
+       iso_backward ((mf_first CM (garrow_fobj c)) _) >>>
+       (bin_first(BinoidalCat:=enr_v_bin C) _ \ iso_backward ((mf_second CM (garrow_fobj a)) (garrow_fobj b))) >>> 
+       (#((pmon_assoc(PreMonoidalCat:=enr_v_mon C) _ _) _) >>>
+        (bin_second(BinoidalCat:=enr_v_bin C) _ \ 
+         #((mf_first CM (garrow_fobj c)) (garrow_fobj b)))) >>>
+       #((mf_second CM (garrow_fobj a)) _) ~~
+       HomFunctor C _ \ #((pmon_assoc(PreMonoidalCat:=enr_c_pm C) (garrow_fobj a) (garrow_fobj c)) (garrow_fobj b)).
+    intros.
+      eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply associativity.
+        set (@iso_shift_right') as q.
+        apply symmetry.
+        simpl in q.
+        apply q.
+        clear q.
+        
+      eapply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        set (mf_assoc(PreMonoidalFunctor:=CM)) as q.
+        apply q.
+
+      eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; try reflexivity.
+        eapply transitivity.
+          eapply symmetry.
+          apply associativity.
+        eapply transitivity; [ idtac | apply left_identity ].
+        apply comp_respects; try reflexivity.
+
+      eapply transitivity.
+        apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+      eapply transitivity; [ idtac |
+        apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) _)) ].
+      apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) _)).
+      apply iso_comp2.
+      Qed.
+
+  Lemma assoc_coherent (a b c : enr_v K) :
+   (#((pmon_assoc(PreMonoidalCat:=enr_c_pm C)
+     (garrow_functor a) (garrow_functor c)) (garrow_fobj b)) >>> garrow_functor a ⋊ #((garrow_first c) b)) >>>
+   #((garrow_second a) (b ⊗ c)) ~~
+   (#((garrow_second a) b) ⋉ garrow_functor c >>>
+     #((garrow_first c) (a ⊗ b))) >>> garrow_functor \ #((pmon_assoc(PreMonoidalCat:=enr_v_mon K) a c) b).
+    Opaque Underlying.
+    eapply transitivity.
+      eapply transitivity; [ idtac | apply right_identity ].
+      eapply comp_respects; [ eapply reflexivity | idtac ].
+      reflexivity.
+
+    apply symmetry.
+      eapply transitivity.
+      eapply transitivity; [ idtac | apply left_identity ].
+      eapply comp_respects; [ idtac | eapply reflexivity ].
+      eapply transitivity; [ idtac | apply right_identity ].
+      apply comp_respects.
+      simpl.
+      apply (fmor_preserves_id (ebc_first (garrow_functor c))).
+      reflexivity.
+
+    symmetry.
+      eapply transitivity.
+      eapply transitivity; [ idtac | apply right_identity ].
+      apply comp_respects. 
+      reflexivity.
+      simpl.
+      apply (fmor_preserves_id (ebc_second (garrow_functor a))).
+      symmetry.
+
+    unfold functor_fobj.
+      unfold garrow_functor.
+      unfold step2_functor.
+      Opaque R'.
+      Opaque ff_functor_section_functor.
+      unfold functor_comp.
+      simpl.
+      Transparent R'.
+      Transparent ff_functor_section_functor.
+      idtac.
+      apply (me_faithful(MonicEnrichment:=CMon)).
+      eapply transitivity; [ eapply full_roundtrip | idtac ].
+
+    unfold fmor at 1.
+      unfold R'.
+      unfold me_homfunctor.
+      eapply transitivity.
+        eapply comp_respects; [ idtac | apply reflexivity ].
+        eapply comp_respects; [ apply reflexivity | idtac ].
+        eapply symmetry.
+        apply assoc_lemma1.
+
+      apply symmetry.
+        eapply transitivity.
+        eapply symmetry.
+        apply assoc_lemma2.
+
+      simpl.
+        eapply transitivity.
+        eapply comp_respects; [ apply reflexivity | idtac ].
+        eapply symmetry.
+        eapply (mf_consistent(PreMonoidalFunctor:=CM)).
+        apply symmetry.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; [ idtac | apply reflexivity ].
+
+      eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply associativity.
+        symmetry.
+        eapply transitivity.
+        apply associativity.
+        apply comp_respects; [ reflexivity | idtac ].
+
+      apply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply symmetry.
+        apply (mf_consistent(PreMonoidalFunctor:=reification)).
+        apply comp_respects; [ reflexivity | idtac ].
+        apply iso_comp1.
+        apply right_identity.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply associativity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply symmetry.
+        eapply (centralmor_first(CentralMorphism:=commutative_central(CommutativeCat:=enr_v_mon C) _)).        
+        eapply transitivity.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+          eapply symmetry.
+          apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_mon C) _)).
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply symmetry.
+          apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_mon C) _)).
+        apply comp_respects; [ reflexivity | idtac ].
+          apply associativity.
+        eapply transitivity.
+          eapply symmetry.
+          apply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        eapply transitivity.
+        apply associativity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        apply associativity.
+        eapply transitivity; [ idtac | apply right_identity ].
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_mon C) _)).
+        eapply transitivity; [ idtac |
+        apply (fmor_preserves_id (bin_second(BinoidalCat:=enr_v_mon C) _)) ].
+        apply (fmor_respects (bin_second(BinoidalCat:=enr_v_mon C) _)).
+        apply iso_comp1.
+        apply reflexivity.
+
+      eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        eapply symmetry.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+
+      apply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply associativity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        apply associativity.
+        apply iso_comp1_right.
+
+      eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        apply associativity.
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        eapply symmetry.
+        apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply symmetry.
+        apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+        eapply symmetry.
+        apply associativity.
+        eapply symmetry.
+        apply associativity.
+        apply reflexivity.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+          apply associativity.
+        eapply transitivity; [ idtac | apply right_identity ].
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+        eapply transitivity; [ idtac | apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_mon C) _)) ].
+        apply (fmor_respects (bin_first(BinoidalCat:=enr_v_mon C) _)).
+        eapply transitivity.
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply mf_consistent.
+          apply iso_comp1.
+
+      eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        eapply symmetry.
+        apply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply symmetry.
+        eapply (centralmor_first(CentralMorphism:=commutative_central(CommutativeCat:=enr_v_mon C) _)).
+        eapply transitivity.
+        apply associativity.
+        eapply transitivity.
+        apply associativity.
+        set (fun a b => isos_forward_equal_then_backward_equal _ _ (mf_consistent(PreMonoidalFunctor:=CM) a b)) as q.
+        apply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ idtac | reflexivity ].
+        set (q (garrow_fobj b) (garrow_fobj a)) as q'.
+        simpl in q'.
+        set (fun qq => fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) qq) _ _ q') as q''.
+        eapply symmetry.
+        apply q''.
+        apply comp_respects; [ reflexivity | idtac ].
+
+      apply symmetry.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        apply comp_respects; [ reflexivity | idtac ].
+        apply comp_respects; [ idtac | reflexivity ].
+        set (ni_commutes (pmon_assoc_rr(PreMonoidalCat:=enr_v_mon C) (reification b) (reification c))
+                          #(homset_tensor_iso a)) as xx.
+        unfold functor_comp in xx.
+        simpl in xx.
+        set (pmon_coherent_r(PreMonoidalCat:=enr_v_mon C) (reification a) (reification b) (reification c)) as yy.
+          set (isos_forward_equal_then_backward_equal _ _ yy) as yy'.
+          eapply transitivity.
+          apply comp_respects; [ idtac | reflexivity ].
+          apply symmetry in yy'.
+          eapply transitivity; [ idtac | apply yy' ].
+          eapply symmetry.
+          apply iso_inv_inv.
+        clear yy' yy.
+          apply iso_shift_right' in xx.
+          apply symmetry in xx.
+          idtac.
+          assert (#((pmon_assoc_rr(PreMonoidalCat:=enr_v_mon C) (reification b) (reification c)) (reification a)) ⁻¹ >>>
+       #(homset_tensor_iso a) ⋉ (reification b ⊗ reification c)
+         ~~
+       (#(homset_tensor_iso a) ⋉ reification b) ⋉ reification c >>>
+       #((pmon_assoc_rr(PreMonoidalCat:=enr_v_mon C) (reification b) (reification c)) _)⁻¹).
+          apply iso_shift_left.
+          eapply transitivity.
+          apply associativity.
+          apply xx.
+          apply H.
+          clear q.
+        eapply transitivity.
+          apply comp_respects; [ reflexivity | idtac ].
+          eapply transitivity.
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply symmetry.
+          apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_mon C) _)).
+          eapply transitivity.
+          apply associativity.
+          apply comp_respects; [ reflexivity | idtac ].
+          eapply transitivity.
+          eapply symmetry.
+          apply associativity.
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply transitivity.
+          eapply symmetry.
+          apply associativity.
+          eapply transitivity; [ idtac | apply left_identity ].
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply transitivity.
+            apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+          eapply transitivity; [ idtac |
+            apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) _)) ].
+          apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) _)).
+          eapply transitivity.
+            apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+          eapply transitivity; [ idtac |
+            apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) _)) ].
+          apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) _)).
+          apply iso_comp2.
+          
+      set (fun a' => ni_commutes (pmon_assoc(PreMonoidalCat:=enr_v_mon C) a' (reification c))
+        (iso_backward (homset_tensor_iso b))) as xx.
+        unfold fmor in xx; unfold functor_comp in xx; simpl in xx.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+        eapply symmetry.
+        eapply associativity.
+        apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+          eapply isos_forward_equal_then_backward_equal.
+          apply (pmon_coherent_r(PreMonoidalCat:=enr_v_mon C)).
+          apply iso_inv_inv.
+          eapply symmetry.
+          eapply xx.
+          clear xx.
+        eapply transitivity.
+          apply comp_respects; [ reflexivity | idtac ].
+          eapply transitivity.
+          eapply associativity.
+          apply comp_respects; [ reflexivity | idtac ].
+          eapply transitivity.
+          apply comp_respects; [ reflexivity | idtac ].
+          eapply symmetry.
+          apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_bin C) _)).
+          eapply transitivity.
+          eapply symmetry.
+          eapply associativity.
+          eapply transitivity; [ idtac | apply left_identity ].
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply transitivity.
+            apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_bin C) _)).
+            eapply transitivity; [ idtac |
+            apply (fmor_preserves_id (bin_second(BinoidalCat:=enr_v_bin C) _)) ].
+            apply fmor_respects.
+          eapply transitivity.
+            apply (fmor_preserves_comp (bin_first(BinoidalCat:=enr_v_bin C) _)).
+            eapply transitivity; [ idtac |
+            apply (fmor_preserves_id (bin_first(BinoidalCat:=enr_v_bin C) _)) ].
+            apply (fmor_respects (bin_first(BinoidalCat:=enr_v_bin C) _)).
+          apply iso_comp2.
+        
+      set (fun a b => ni_commutes (pmon_assoc_ll(PreMonoidalCat:=enr_v_mon C) a b)) as xx.
+        unfold functor_comp in xx.
+        simpl in xx.
+        eapply transitivity.
+        apply comp_respects; [ reflexivity | idtac ].
+        eapply transitivity.
+          apply comp_respects; [ idtac | reflexivity ].
+          eapply symmetry.
+          apply (pmon_coherent_l(PreMonoidalCat:=enr_v_mon C)).
+          apply xx.
+        eapply transitivity.
+          eapply symmetry.
+          apply associativity.
+        apply symmetry.
+          eapply transitivity.
+          eapply symmetry.
+          apply (pmon_coherent_l(PreMonoidalCat:=enr_v_mon C)).
+        apply symmetry.
+        eapply transitivity; [ idtac | apply left_identity ].
+          apply comp_respects; [ idtac | reflexivity ].
+        eapply transitivity.
+          apply (fmor_preserves_comp (bin_second(BinoidalCat:=enr_v_bin C) _)).
+          eapply transitivity; [ idtac |
+          apply (fmor_preserves_id (bin_second(BinoidalCat:=enr_v_bin C) _)) ].
+          apply fmor_respects.
+          apply iso_comp2.
+      Qed.
+
   Lemma cancell_lemma `(F:PreMonoidalFunctor) b :
     iso_backward (mf_i F) ⋉ (F b) >>> #(pmon_cancell (F b)) ~~
     #((mf_first F b) _) >>>  F \ #(pmon_cancell b).
@@ -296,7 +916,7 @@ Implicit Arguments mf_i [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0]
     apply (fmor_respects (-⋉ F b)).
     apply iso_comp2.
     Qed.
-
+*)
   Lemma cancell_coherent (b:enr_v K) :
    #(pmon_cancell(PreMonoidalCat:=enr_c_pm C) (garrow_functor b)) ~~
    (#(iso_id (enr_c_i C)) ⋉ garrow_functor b >>>
@@ -407,20 +1027,23 @@ Implicit Arguments mf_i [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0]
     set (@comp_respects) as qq.
     unfold Proper in qq.
     unfold respectful in qq.
-    set (qq _ _ _ _ _ _ (iso_backward (mf_i F) ⋉ F b) (iso_backward (mf_i F) ⋉ F b) (reflexivity _) _ _ q) as q'.
+    set (qq _ _ _ _ _ _ (F b ⋊ iso_backward (mf_i F)) (F b ⋊ iso_backward (mf_i F)) (reflexivity _) _ _ q) as q'.
     setoid_rewrite <- associativity in q'.
     clear q qq.
-    setoid_rewrite (fmor_preserves_comp (-⋉ F b)) in q'.
+    setoid_rewrite (fmor_preserves_comp (F b ⋊ -)) in q'.
     eapply transitivity; [ apply q' | idtac ].
     clear q'.
     setoid_rewrite <- associativity.
     apply comp_respects; try reflexivity.
     symmetry.
     apply iso_shift_left.
+    eapply transitivity.
+      apply comp_respects; [ idtac | reflexivity ].
+      apply mf_consistent.
     setoid_rewrite iso_comp1.
     symmetry.
-    eapply transitivity; [ idtac | eapply (fmor_preserves_id (-⋉ F b))].
-    apply (fmor_respects (-⋉ F b)).
+    eapply transitivity; [ idtac | eapply (fmor_preserves_id (F b ⋊ - ))].
+    apply (fmor_respects (F b ⋊ -)).
     apply iso_comp2.
     Qed.
 
@@ -428,7 +1051,6 @@ Implicit Arguments mf_i [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0]
    #(pmon_cancelr(PreMonoidalCat:=enr_c_pm C) (garrow_functor b)) ~~
    (garrow_functor b ⋊ #(iso_id (enr_c_i C)) >>>
     #((garrow_second b) (enr_v_i K))) >>> garrow_functor \ #(pmon_cancelr(PreMonoidalCat:=enr_v_mon K) b).
-
     Opaque Underlying.
     Opaque fmor.
     intros; simpl.
@@ -534,21 +1156,16 @@ Implicit Arguments mf_i [[Ob] [Hom] [C1] [bin_obj'] [bc] [I1] [PM1] [Ob0] [Hom0]
   ; mf_second     := garrow_second
   ; mf_i          := iso_id _ }.
     intros; reflexivity.
-    intros.
-      unfold garrow_functor.
-      unfold fmor.
-      Opaque fmor. simpl.
-      unfold step2_functor.
-      admit.
-      Transparent fmor.
-
+    intros; apply (reification_host_lang_pure _ _ _ reification).
     apply cancell_coherent.
     apply cancelr_coherent.
-    admit.
+    apply assoc_coherent.
     Defined.
 
   Definition garrow_from_reification : GeneralizedArrow K CM :=
-    {| ga_functor_monoidal := garrow_monoidal |}.
+    {| ga_functor_monoidal := garrow_monoidal
+     ; ga_host_lang_pure   := reification_host_lang_pure _ _ _ reification
+    |}.
 
 End GArrowFromReification.