\begin{code}
{-# OPTIONS --safe #-}
open import Algebra
open import Prelude
open import Path.Reasoning
module Data.Weighted.Monad {β} {π : Type β} (weight : Weight π) where
open Weight weight
open import Data.Weighted.Definition β-semigroup
open import Data.Weighted.CommutativeMonoid β-semigroup
open import Data.Weighted.Eliminators β-semigroup
open import Data.Weighted.Condition β-semigroup
open import Data.Weighted.Functor
module _ {A : Type a} {B : Type b} (f : A β B) where
wmap-alg : A βΆW B
wmap-alg = record
{ act-w = Ξ» w x β w βΉ f x β· β
β
; coh-w = Ξ» p q x β dup p q (f x) β
β
}
wmap : Weighted A β Weighted B
wmap = [ wmap-alg ]Wβ
wmap-id : (xs : Weighted A) β wmap id xs β‘ xs
wmap-id = β¦ alg β§
where
alg : Ξ¨[ xs β¦ Weighted A ] β¦ (wmap id xs β‘ xs)
alg .fst β
β = refl
alg .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = cong (w βΉ x β·_) Pβ¨xsβ©
alg .snd = eq-coh
wmap-comp : (f : B β C) (g : A β B) (xs : Weighted A) β wmap f (wmap g xs) β‘ wmap (f β g) xs
wmap-comp f g = β¦ alg f g β§
where
alg : (f : B β C) (g : A β B) β Ξ¨[ xs β¦ Weighted A ] β¦ wmap f (wmap g xs) β‘ wmap (f β g) xs
alg f g .fst β
β = refl
alg f g .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = cong (w βΉ _ β·_) Pβ¨xsβ©
alg f g .snd = eq-coh
functorWeighted : Functor (Weighted {a = a})
functorWeighted .Functor.map = wmap
functorWeighted .Functor.map-id = wmap-id
functorWeighted .Functor.map-comp = wmap-comp
private module Display-β where
_β_ = _β_
infixr 5 _β_
_β_ : π β Weighted A β Weighted A
\end{code}
%<*rtimes>
\begin{code}[number=eqn:rtimes]
w β β
β = β
β
w β p βΉ x β· xs = w β p βΉ x β· w β xs
\end{code}
%</rtimes>
\begin{code}
w β com p x q y xs i = com (w β p) x (w β q) y (w β xs) i
w β dup p q x xs i = (dup (w β p) (w β q) x (w β xs) ΝΎ cong (_βΉ x β· w β xs) (sym (ββ¨ββ© w p q))) i
w β trunc xs ys p q i j = trunc (w β xs) (w β ys) (cong (w β_) p) (cong (w β_) q) i j
β-alg : π β A βΆW A
β-alg w = cond-alg (w β_) (Ξ» p q β sym (ββ¨ββ© w p q))
infixr 5 _β_
_β_ : π β Weighted A β Weighted A
w β xs = cond (w β_) (Ξ» p q β sym (ββ¨ββ© w p q)) xs
wmap-β : β w (f : A β B) xs β w β wmap f xs β‘ wmap f (w β xs)
wmap-β w f = β¦ alg w f β§
where
alg : β w (f : A β B) β Ξ¨[ xs β¦ Weighted A ] β¦ w β wmap f xs β‘ wmap f (w β xs)
alg w f .snd = eq-coh
alg w f .fst β
β = refl
alg w f .fst (p βΉ x β· xs β¨ Pβ¨xsβ© β©) = cong (w β p βΉ f x β·_) Pβ¨xsβ©
ββ¨ββ© : β p q (xs : Weighted A) β (p β xs) βͺ (q β xs) β‘ (p β q) β xs
ββ¨ββ© p q = β¦ alg p q β§
where
alg : β p q β Ξ¨[ xs β¦ Weighted A ] β¦ ((p β xs) βͺ (q β xs) β‘ (p β q) β xs)
alg p q .fst β
β = refl
alg p q .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(p β (w βΉ x β· xs)) βͺ (q β (w βΉ x β· xs)) β‘β¨β©
(p β w βΉ x β· p β xs) βͺ (q β w βΉ x β· q β xs) β‘β¨β©
p β w βΉ x β· (p β xs) βͺ (q β w βΉ x β· q β xs) β‘Λβ¨ cong (p β w βΉ x β·_) (βͺ-cons (q β w) x (p β xs) _) β©
p β w βΉ x β· q β w βΉ x β· (p β xs) βͺ (q β xs) β‘β¨ dup (p β w) (q β w) x _ β©
p β w β q β w βΉ x β· (p β xs) βͺ (q β xs) β‘β¨ congβ (_βΉ x β·_) (sym (β¨ββ©β _ _ _)) Pβ¨xsβ© β©
(p β q) β (w βΉ x β· xs) β
alg p q .snd = eq-coh
ββ¨βͺβ© : β w (x y : Weighted A) β w β (x βͺ y) β‘ (w β x) βͺ (w β y)
ββ¨βͺβ© w x y = β¦ alg w y β§ x
where
alg : β w y β Ξ¨[ x β¦ Weighted A ] β¦ (w β (x βͺ y) β‘ (w β x) βͺ (w β y))
alg w y .snd = eq-coh
alg w y .fst β
β = refl
alg w y .fst (u βΉ x β· xs β¨ Pβ¨xsβ© β©) = cong (w β u βΉ x β·_) Pβ¨xsβ©
private module InlineBind where
_>>=_ : Weighted A β (A β Weighted B) β Weighted B
\end{code}
%<*bind>
\begin{code}
β
β >>= k = β
β
(p βΉ x β· xs) >>= k = (p β k x) βͺ (xs >>= k)
\end{code}
%</bind>
\begin{code}
com p x q y xs i >>= k = begin[ i ]
(p β k x) βͺ (q β k y) βͺ (xs >>= k) β‘Λβ¨ βͺ-assoc (p β k x) _ _ β©
((p β k x) βͺ (q β k y)) βͺ (xs >>= k) β‘β¨ cong (_βͺ (xs >>= k)) (βͺ-com (p β k x) _) β©
((q β k y) βͺ (p β k x)) βͺ (xs >>= k) β‘β¨ βͺ-assoc (q β k y) _ _ β©
(q β k y) βͺ (p β k x) βͺ (xs >>= k) β
dup p q x xs i >>= k = begin[ i ]
(p β k x) βͺ (q β k x) βͺ (xs >>= k) β‘Λβ¨ βͺ-assoc (p β k x) _ _ β©
((p β k x) βͺ (q β k x)) βͺ (xs >>= k) β‘β¨ cong (_βͺ (xs >>= k)) (ββ¨ββ© p q (k x)) β©
((p β q) β k x) βͺ (xs >>= k) β
trunc xs ys p q i j >>= k =
trunc (xs >>= k) (ys >>= k) (cong (_>>= k) p) (cong (_>>= k) q) i j
module _ {A : Type a} {B : Type b} where
bind-alg : (A β Weighted B) β A βΆW B
bind-alg k = record
{ act-w = Ξ» w x β w β k x
; coh-w = Ξ» p q x β ββ¨ββ© p q (k x)
}
infixl 4.1 _>>=_
_>>=_ : Weighted A β (A β Weighted B) β Weighted B
xs >>= k = [ bind-alg k ]Wβ xs
>>=-βͺ : (xs ys : Weighted A) (k : A β Weighted B) β (xs βͺ ys) >>= k β‘ (xs >>= k) βͺ (ys >>= k)
>>=-βͺ xs ys k = collect-βͺ (bind-alg k) xs ys
=<<-βͺ : (xs : Weighted A) (ys zs : A β Weighted B) β (xs >>= Ξ» x β ys x βͺ zs x) β‘ (xs >>= ys) βͺ (xs >>= zs)
=<<-βͺ {B = B} xs ys zs = β¦ alg ys zs β§ xs
where
lemma : (w x y z : Weighted B) β (w βͺ x) βͺ (y βͺ z) β‘ (w βͺ y) βͺ (x βͺ z)
lemma w x y z =
(w βͺ x) βͺ (y βͺ z) β‘β¨ βͺ-assoc w x _ ΝΎ cong (w βͺ_) (sym (βͺ-assoc x y z)) β©
w βͺ (x βͺ y) βͺ z β‘β¨ cong (Ξ» e β w βͺ e βͺ z) (βͺ-com x y ) β©
w βͺ (y βͺ x) βͺ z β‘Λβ¨ βͺ-assoc w y _ ΝΎ cong (w βͺ_) (sym (βͺ-assoc y x z)) β©
(w βͺ y) βͺ (x βͺ z) β
alg : (ys zs : A β Weighted B) β Ξ¨[ xs β¦ Weighted A ] β¦ (xs >>= Ξ» x β ys x βͺ zs x) β‘ (xs >>= ys) βͺ (xs >>= zs)
alg ys zs .snd = eq-coh
alg ys zs .fst β
β = refl
alg ys zs .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
let k = Ξ» xβ² β ys xβ² βͺ zs xβ² in
(w βΉ x β· xs) >>= k β‘β¨β©
(w β (ys x βͺ zs x)) βͺ (xs >>= k) β‘β¨ congβ _βͺ_ (ββ¨βͺβ© w (ys x) (zs x)) Pβ¨xsβ© β©
((w β ys x) βͺ (w β zs x)) βͺ ((xs >>= ys) βͺ (xs >>= zs)) β‘β¨ lemma (w β ys x) (w β zs x) (xs >>= ys) (xs >>= zs) β©
((w β ys x) βͺ (xs >>= ys)) βͺ ((w β zs x) βͺ (xs >>= zs)) β‘β¨β©
((w βΉ x β· xs) >>= ys) βͺ ((w βΉ x β· xs) >>= zs) β
return : A β Weighted A
return x = π βΉ x β· β
β
β-assoc : β w v (s : Weighted A) β w β v β s β‘ (w β v) β s
β-assoc w v = β¦ alg β§
where
alg : Ξ¨[ s β¦ Weighted A ] β¦ w β v β s β‘ (w β v) β s
alg .snd = eq-coh
alg .fst β
β = refl
alg .fst (p βΉ x β· xs β¨ Pβ¨xsβ© β©) = congβ (_βΉ x β·_) (sym (β-assoc w v p)) Pβ¨xsβ©
Ξ΅β : (x : Weighted A) β π β x β‘ x
Ξ΅β = β¦ alg β§
where
alg : Ξ¨[ s β¦ Weighted A ] β¦ π β s β‘ s
alg .snd = eq-coh
alg .fst β
β = refl
alg .fst (p βΉ x β· xs β¨ Pβ¨xsβ© β©) = congβ (_βΉ x β·_) (πβ p) Pβ¨xsβ©
ββ
β : β w (x : Weighted A) β w β x β‘ β
β β x β‘ β
β
ββ
β w = β¦ alg β§
where
alg : Ξ¨[ x β¦ Weighted A ] β¦ (w β x β‘ β
β β x β‘ β
β)
alg .fst β
β _ = refl
alg .fst (p βΉ x β· xs β¨ Pβ¨xsβ© β©) e = absurd (falseβ’true (cong null e))
alg .snd = prop-coh Ξ» _ β isPropβ (trunc _ _)
β->>= : β p (xs : Weighted A) (k : A β Weighted B) β (p β xs) >>= k β‘ p β (xs >>= k)
β->>= p xs k = β¦ alg p k β§ xs
where
alg : β p (k : A β Weighted B) β Ξ¨[ xs β¦ Weighted A ] β¦ (p β xs) >>= k β‘ p β (xs >>= k)
alg p k .snd = eq-coh
alg p k .fst β
β = refl
alg p k .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
((p β w) βΉ x β· (p β xs)) >>= k β‘β¨β©
((p β w) β k x) βͺ ((p β xs) >>= k) β‘β¨ congβ _βͺ_ (sym (β-assoc p w (k x))) Pβ¨xsβ© β©
(p β (w β k x)) βͺ (p β (xs >>= k)) β‘Λβ¨ ββ¨βͺβ© p (w β k x) (xs >>= k) β©
p β ((w β k x) βͺ (xs >>= k)) β
>>=-assoc : (xs : Weighted A) (ys : A β Weighted B) (zs : B β Weighted C)
β (xs >>= ys) >>= zs β‘ xs >>= (Ξ» x β ys x >>= zs)
>>=-assoc xs ys zs = β¦ alg ys zs β§ xs
where
alg : (ys : A β Weighted B) (zs : B β Weighted C) β
Ξ¨[ xs β¦ Weighted A ] β¦ (xs >>= ys) >>= zs β‘ xs >>= (Ξ» x β ys x >>= zs)
alg ys zs .snd = eq-coh
alg ys zs .fst β
β = refl
alg ys zs .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(w βΉ x β· xs) >>= ys >>= zs β‘β¨β©
((w β ys x) βͺ (xs >>= ys)) >>= zs β‘β¨ >>=-βͺ (w β ys x) (xs >>= ys) zs β©
((w β ys x) >>= zs) βͺ ((xs >>= ys) >>= zs) β‘β¨ congβ _βͺ_ (β->>= w (ys x) zs) Pβ¨xsβ© β©
(w β (ys x >>= zs)) βͺ (xs >>= (Ξ» x β ys x >>= zs)) β‘β¨β©
(w βΉ x β· xs) >>= (Ξ» x β ys x >>= zs) β
>>=-idΛ‘ : (x : A) (k : A β Weighted B) β return x >>= k β‘ k x
>>=-idΛ‘ x k = βͺ-idΚ³ (π β k x) ΝΎ Ξ΅β (k x)
>>=-idΚ³ : (xs : Weighted A) β xs >>= return β‘ xs
>>=-idΚ³ = β¦ alg β§
where
alg : Ξ¨[ xs β¦ Weighted A ] β¦ (xs >>= return) β‘ xs
alg .snd = eq-coh
alg .fst β
β = refl
alg .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = congβ (_βΉ x β·_) (βπ w) Pβ¨xsβ©
module _ {A : Type a} {B : Type b} where
>>=-β
β : (xs : Weighted A) β xs >>= const β
β β‘ (β
β β¦ Weighted B)
>>=-β
β = β¦ alg β§
where
alg : Ξ¨[ xs β¦ Weighted A ] β¦ (xs >>= const β
β β‘ (β
β β¦ Weighted B))
alg .snd = eq-coh
alg .fst β
β = refl
alg .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = Pβ¨xsβ©
>>=-wmap : (f : A β B) (k : B β Weighted C) (xs : Weighted A) β wmap f xs >>= k β‘ xs >>= (k β f)
>>=-wmap f k = β¦ alg f k β§
where
alg : (f : A β B) (k : B β Weighted C) β Ξ¨[ xs β¦ Weighted A ] β¦ wmap f xs >>= k β‘ xs >>= (k β f)
alg f k .snd = eq-coh
alg f k .fst β
β = refl
alg f k .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = cong ((w β k (f x)) βͺ_) Pβ¨xsβ©
wmap->>= : (f : A β B) (xs : Weighted A) β wmap f xs β‘ xs >>= (return β f)
wmap->>= f = β¦ alg f β§
where
alg : (f : A β B) β Ξ¨[ xs β¦ Weighted A ] β¦ wmap f xs β‘ xs >>= (return β f)
alg f .snd = eq-coh
alg f .fst β
β = refl
alg f .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) = congβ _βΉ f x β·_ (sym (βπ w)) Pβ¨xsβ©
\end{code}