{-# OPTIONS --safe #-}
module Cubical.Categories.DistributiveLaw.ComonadOverMonad.BiKleisli.Base where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function renaming (_∘_ to _∘f_)
open import Cubical.Categories.Category hiding (isIso)
open import Cubical.Categories.Functor
open import Cubical.Categories.NaturalTransformation
open import Cubical.Categories.NaturalTransformation.More
open import Cubical.Categories.Monad.Base
open import Cubical.Categories.Comonad.Base
open import Cubical.Categories.DistributiveLaw.ComonadOverMonad.Base
open import Cubical.Tactics.FunctorSolver.Reflection
private
variable
ℓ ℓ' : Level
module _ {C : Category ℓ ℓ'}
(D : Comonad C)
(T : Monad C) (law : DistributiveLaw D T) where
open NatTrans
open IsComonad (D .snd)
open IsMonad (T .snd)
open IsDistributiveLaw (law .snd)
open Category C
open Functor
bind' : ∀ {c d} → Hom[ c , T .fst ⟅ d ⟆ ] → Hom[ T .fst ⟅ c ⟆ , T .fst ⟅ d ⟆ ]
bind' {c}{d} f = bind .N-ob _ f
l = law .fst
bind-η : ∀ {c} → bind' (η ⟦ c ⟧) ≡ id
bind-η = λ i → idr-μ i ⟦ _ ⟧
private
variable
x y z : ob
k k' : Hom[ x , y ]
BiKleisli : Category ℓ ℓ'
BiKleisli .Category.ob = ob
BiKleisli .Category.Hom[_,_] x y = Hom[ D .fst ⟅ x ⟆ , T .fst ⟅ y ⟆ ]
BiKleisli .Category.isSetHom = isSetHom
BiKleisli .Category.id {x} = (η ∘ᵛ ε) ⟦ x ⟧
BiKleisli .Category._⋆_ f g = bind' g ∘ (l ⟦ _ ⟧ ∘ extend f)
BiKleisli .Category.⋆IdL f =
cong₂ _∘_ refl (cong₂ _∘_ refl ((cong₂ _∘_ (D .fst .F-seq _ _) refl)
∙ sym (⋆Assoc _ _ _)
∙ cong₂ _∘_ refl extend-ε
∙ ⋆IdL _))
∙ cong₂ _∘_ refl η-law
∙ sym (⋆Assoc _ _ _)
∙ cong₂ _∘_ refl (sym (η .N-hom f))
∙ ⋆Assoc _ _ _
∙ cong₂ _∘_ (λ i → idl-μ i ⟦ _ ⟧) refl
∙ ⋆IdR f
BiKleisli .Category.⋆IdR f =
cong₂ _∘_ (cong₂ _∘_ refl (T .fst .F-seq _ _)
∙ ⋆Assoc _ _ _ ∙ cong₂ _∘_ (λ i → idr-μ i ⟦ _ ⟧) refl
∙ ⋆IdR _)
refl
∙ ⋆Assoc _ _ _
∙ cong₂ _∘_ ε-law refl
∙ ⋆Assoc _ _ _
∙ cong₂ _∘_ (ε .N-hom _) refl
∙ (sym (⋆Assoc _ _ _) ∙ cong₂ _∘_ refl (λ i → idl-δ i ⟦ _ ⟧))
∙ ⋆IdL _
BiKleisli .Category.⋆Assoc f g h =
(cong₂ _⋆_ (cong₂ _⋆_ (cong₂ _⋆_ refl (D .fst .F-seq _ _ ∙
cong₂ _⋆_ (D .fst .F-seq _ _ ∙ cong₂ _⋆_ (D .fst .F-seq _ _) refl)
(D .fst .F-seq _ _))) refl) refl)
∙ cong₂ _⋆_ (cong₂ _⋆_ (sym (⋆Assoc _ _ _) ∙
cong₂ _⋆_ (sym (⋆Assoc _ _ _) ∙ cong₂ _⋆_ (sym (⋆Assoc _ _ _) ∙
cong₂ _∘_ refl assoc-δ) refl) refl) refl) refl
∙ cong₂ _∘_ refl (cong₂ _∘_ refl (cong₂ _∘_
refl (cong₂ _∘_ refl (⋆Assoc _ _ _ ∙ cong₂ _∘_ (sym (δ .N-hom _)) refl))))
∙ cong₂ _⋆_ (⋆Assoc _ _ _ ∙
cong₂ _⋆_ refl (⋆Assoc _ _ _ ∙ cong₂ _⋆_ refl μ-law)) refl
∙ cong₂ _∘_ refl (cong₂ _⋆_ refl (sym (⋆Assoc _ _ _) ∙
cong₂ _∘_ refl (sym (⋆Assoc _ _ _) ∙ cong₂ _∘_ refl (l .N-hom _))))
∙ cong₂ _∘_ refl (sym (⋆Assoc _ _ _) ∙ cong₂ _∘_ refl (sym (⋆Assoc _ _ _) ∙
cong₂ _∘_ refl (⋆Assoc _ _ _ ∙ ⋆Assoc _ _ _ ∙ cong₂ _⋆_ refl
(sym (⋆Assoc _ _ _) ∙ sym (⋆Assoc _ _ _) ∙ cong₂ _∘_
refl ((⋆Assoc _ _ _) ∙ ⋆Assoc _ _ _ ∙ cong₂ _⋆_
refl (sym (⋆Assoc _ _ _) ∙ sym δ-law))))))
∙ (⋆Assoc _ _ _ ∙ cong₂ _⋆_ refl (sym (⋆Assoc _ _ _) ∙
cong₂ _∘_ refl (sym (μ .N-hom _))))
∙ cong₂ _⋆_ refl (⋆Assoc _ _ _ ∙ cong₂ _⋆_ refl (λ i → assoc-μ (~ i) ⟦ _ ⟧))
∙ lem0
where
lem0 : C .Category._⋆_ (C .Category._⋆_ (D .snd .IsComonad.δ .N-ob _)
(C .Category._⋆_ k (law .fst .N-ob _ ⋆ F-hom (T .fst)
(N-ob (D .snd .IsComonad.δ) _)) ⋆ F-hom (T .fst) k') ⋆
F-hom (T .fst) (N-ob (law .fst) _))
(C .Category._⋆_ (F-hom (T .fst) (F-hom (T .fst) h))
(F-hom (T .fst) (N-ob (T .snd .IsMonad.μ) _) ⋆
T .snd .IsMonad.μ .N-ob _)) ≡
((δ .N-ob _ ⋆ k) ⋆ N-ob l _) ⋆ F-hom (T .fst)
(((δ .N-ob _ ⋆ k') ⋆ N-ob l _) ⋆
F-hom (T .fst) h ⋆ N-ob μ _) ⋆ N-ob μ _
lem0 {k}{k'} = solveFunctor! C C (T .fst)