\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}