{-# OPTIONS --safe #-}
open import Level
open import Categories.Category.Core
open import Data.Product using (_,_; Σ; Σ-syntax)
open import Categories.Functor.Algebra
open import Categories.Functor.Coalgebra
open import Categories.Object.Terminal
open import Categories.NaturalTransformation.Core hiding (id)
open import Object.FreeObject
open import Categories.Category.Distributive
open import Categories.Object.NaturalNumbers.Parametrized
open import Categories.Functor.Properties using ([_]-resp-Iso)
open import Monad.Instance.Delay
open import Monad.Instance.Delay.Quotient
import Categories.Morphism as M
import Categories.Morphism.Reasoning as MR
import Categories.Morphism.Properties as MP
module Monad.Instance.Delay.Quotient.Theorem.Condition1-2 {o ℓ e} {C : Category o ℓ e} (distributive : Distributive C) (D : DelayM (Distributive.cocartesian distributive)) (PNNO : ParametrizedNNO C (Distributive.cartesian distributive)) (DQ : DelayQ distributive D PNNO) where
open import Categories.Diagram.Coequalizer C
open Category C
open import Category.Distributive.Helper distributive
open Bundles
open import Algebra.Elgot cocartesian
open import Algebra.Elgot.Free cocartesian
open import Algebra.Elgot.Stable distributive
open F-Coalgebra-Morphism using () renaming (f to u; commutes to coalg-commutes)
open DelayM D
open D-Kleisli
open D-Monad
open Later∘Extend
open ParametrizedNNO PNNO
open import Algebra.Search cocartesian D
open import Algebra.Search.Retraction distributive D
open HomReasoning
open M C
open MR C
open MP C using (Iso⇒Epi)
open Equiv
open import Monad.Instance.Delay.Iota distributive D PNNO
open import Monad.Instance.Delay.Strong distributive D
open τ-mod
open import Algebra.Search.Properties cocartesian
open DelayQ DQ
open import Monad.Instance.Delay.Quotient.Theorem.Conditions distributive D PNNO DQ
1⇒2 : cond-1 → (∀ X → cond-2 X)
1⇒2 c-1 X = record { s-alg-on = s-alg-on ; ρ-algebra-morphism = D-universal }
where
open Coequalizer (coeqs X) renaming (universal to coeq-universal)
open IsCoequalizer (c-1 X) using () renaming (equality to D-equality; coequalize to D-coequalize; universal to D-universal; unique to D-unique)
s-alg-on : Search-Algebra-on (Ď₀ X)
s-alg-on = record
{ α = α'
; identity₁ = ρ-epi (α' ∘ now) id (begin
(α' ∘ now) ∘ ρ ≈⟨ pullʳ (D.η.commute ρ) ⟩
α' ∘ D₁ ρ ∘ now ≈⟨ pullˡ (sym D-universal) ⟩
(ρ ∘ D.μ.η X) ∘ now ≈⟨ cancelʳ D.identityʳ ⟩
ρ ≈⟨ sym identityˡ ⟩
id ∘ ρ ∎)
; identity₂ = IsCoequalizer⇒Epi (c-1 X) (α' ∘ later) α' (begin
(α' ∘ later) ∘ D₁ ρ ≈⟨ pullʳ (later-extend-comm (now ∘ ρ)) ⟩
α' ∘ D₁ ρ ∘ later ≈⟨ pullˡ (sym D-universal) ⟩
(ρ ∘ D.μ.η X) ∘ later ≈⟨ pullʳ (sym (later-extend-comm id)) ⟩
ρ ∘ later ∘ extend id ≈⟨ pullˡ ρ-later ⟩
ρ ∘ extend id ≈⟨ D-universal ⟩
α' ∘ D₁ ρ ∎)
}
where
μ∘Dι : D.μ.η X ∘ D₁ ι ≈ extend ι
μ∘Dι = sym DK.assoc ○ extend-≈ (cancelˡ DK.identityʳ)
eq₁ : D₁ (extend ι) ≈ D₁ (D.μ.η X) ∘ D₁ (D₁ ι)
eq₁ = sym (begin
D₁ (D.μ.η X) ∘ D₁ (D₁ ι) ≈⟨ sym D.F.homomorphism ⟩
D₁ (D.μ.η X ∘ D₁ ι) ≈⟨ D.F.F-resp-≈ μ∘Dι ⟩
D₁ (extend ι) ∎)
α' = D-coequalize {h = ρ {X} ∘ D.μ.η X} (begin
(ρ ∘ D.μ.η X) ∘ D₁ (extend ι) ≈⟨ (refl⟩∘⟨ eq₁) ⟩
(ρ ∘ D.μ.η X) ∘ D₁ (D.μ.η X) ∘ D₁ (D₁ ι) ≈⟨ pullʳ (pullˡ D.assoc) ⟩
ρ ∘ (D.μ.η X ∘ D.μ.η (D₀ X)) ∘ D₁ (D₁ ι) ≈⟨ (refl⟩∘⟨ pullʳ (D.μ.commute ι)) ⟩
ρ ∘ D.μ.η X ∘ (D₁ ι) ∘ D.μ.η (X × N) ≈⟨ (refl⟩∘⟨ pullˡ μ∘Dι) ⟩
ρ ∘ extend ι ∘ D.μ.η (X × N) ≈⟨ pullˡ equality ⟩
(ρ ∘ D₁ π₁) ∘ D.μ.η (X × N) ≈⟨ (pullʳ (sym (D.μ.commute π₁)) ○ sym-assoc) ⟩
(ρ ∘ D.μ.η X) ∘ D₁ (D₁ π₁) ∎)