{-# OPTIONS --lossy-unification --safe #-}
open import Algebra
open import Algebra.Monus
open import Prelude
open import Path.Reasoning
module Data.Weighted.CutoffMonus {β} {π : Type β} (mon : TMAPOM π) where
open TMAPOM mon
open import Data.Weighted.Definition β-semigroup
open import Data.Weighted.CommutativeMonoid β-semigroup
open import Data.Weighted.Monad (weight π tapom)
open import Data.Weighted.Cutoff totalOrder
open import Data.Weighted.Eliminators β-semigroup
open import Data.Weighted.Functor
β’-wmap : β (f : A β B) x w β wmap f x β’ w β‘ wmap f (x β’ w)
β’-wmap f x w = β¦ alg f w β§ x
where
alg : β (f : A β B) w β Ξ¨[ x β¦ Weighted A ] β¦ wmap f x β’ w β‘ wmap f (x β’ w)
alg f w .snd = eq-coh
alg f w .fst β
β = refl
alg f w .fst (q βΉ x β· xs β¨ Pβ¨xsβ© β©) with q β€? w
... | yes _ = cong (q βΉ f x β·_) Pβ¨xsβ©
... | no _ = Pβ¨xsβ©
>-β-β’ : β w (s : Weighted A) v β w > v β (w β s) β’ v β‘ β
β
>-β-β’ w s v w>v = β¦ alg w v w>v β§ s
where
alg : β w v β w > v β Ξ¨[ s β¦ Weighted A ] β¦ (w β s) β’ v β‘ β
β
alg w v w>v .snd = eq-coh
alg w v w>v .fst β
β = refl
alg w v w>v .fst (u βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(w β u βΉ x β· xs) β’ v β‘β¨β©
(w β u βΉ x β· w β xs) β’ v β‘β¨β©
v / w β u βΉ x βͺ (w β xs) β’ v β‘β¨ cong (_βͺ (w β xs) β’ v) (/β° v (w β u) x β²[ <[ w>v ] β²ΝΎ β€[ xβ€xβy ] ]) β©
(w β xs) β’ v β‘β¨ Pβ¨xsβ© β©
β
β β
module Depth where
Deeper : π β Weighted A β Type-
Deeper w x = β y Γ w β y β‘ x
deeper-β₯ : β v w (x : Weighted A) β Deeper v x β v β₯ w β Deeper w x
deeper-β₯ v w x (y , v>|x) (k , vβ‘wβk) = k β y , (β-assoc w k y ΝΎ cong (_β y) (sym vβ‘wβk) ΝΎ v>|x)
Ξ΅-deeper : (x : Weighted A) β Deeper Ξ΅ x
Ξ΅-deeper x = x , Ξ΅β x
return-β’ : β (x : A) w β return x β’ w β‘ return x
return-β’ x w = βͺ-idΚ³ _ ΝΎ /β€ w Ξ΅ x (positive w)
>>=-β’-lemma : β w v (x : A) (k : A β Weighted B) β (w β k x) β’ v β‘ (v / w βΉ x >>= k) β’ v
>>=-β’-lemma w v x k with w β€? v
... | no wβ°v = >-β-β’ w (k x) v wβ°v
... | yes wβ€v = sym (cong (_β’ v) (βͺ-idΚ³ (w β k x)))
>>=-β’Λ‘ : β v (s : Weighted A) (k : A β Weighted B) β
(s >>= k) β’ v β‘ (s β’ v >>= k) β’ v
>>=-β’Λ‘ v s k = β¦ alg v k β§ s
where
alg : β v (k : A β Weighted B) β Ξ¨[ s β¦ Weighted A ] β¦ (s >>= k) β’ v β‘ (s β’ v >>= k) β’ v
alg v k .snd = eq-coh
alg v k .fst β
β = refl
alg v k .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(w βΉ x β· xs >>= k) β’ v β‘β¨β©
((w β k x) βͺ (xs >>= k)) β’ v β‘β¨ β’-βͺ (w β k x) _ _ β©
(w β k x) β’ v βͺ (xs >>= k) β’ v β‘β¨ cong ((w β k x) β’ v βͺ_) Pβ¨xsβ© β©
(w β k x) β’ v βͺ (xs β’ v >>= k) β’ v β‘β¨ cong (_βͺ (xs β’ v >>= k) β’ v) (>>=-β’-lemma w v x k ) β©
(v / w βΉ x >>= k) β’ v βͺ (xs β’ v >>= k) β’ v β‘Λβ¨ β’-βͺ (v / w βΉ x >>= k) _ _ β©
((v / w βΉ x >>= k) βͺ (xs β’ v >>= k)) β’ v β‘Λβ¨ cong (_β’ v) (>>=-βͺ (v / w βΉ x) _ k) β©
(v / w βΉ x βͺ xs β’ v >>= k) β’ v β‘β¨β©
((w βΉ x β· xs) β’ v >>= k) β’ v β
/ββ’ : β u v w (x : A) β v / w β u βΉ x β‘ (w β v / u βΉ x) β’ v
/ββ’ u v w x with u β€? v
... | yes _ = sym (βͺ-idΚ³ (v / w β u βΉ x))
... | no u>v = /β° v (w β u) x β²[ <[ u>v ] β²ΝΎ β€[ xβ€xβy ] β²ΝΎ β‘[ comm u w ] ]
>>=-β’Κ³-lemma : β w (s : Weighted A) v β (w β s) β’ v β‘ (w β s β’ v) β’ v
>>=-β’Κ³-lemma w s v = β¦ alg w v β§ s
where
alg : β w v β Ξ¨[ s β¦ Weighted A ] β¦ (w β s) β’ v β‘ (w β s β’ v) β’ v
alg w v .snd = eq-coh
alg w v .fst β
β = refl
alg w v .fst (u βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(w β u βΉ x β· xs) β’ v β‘β¨β©
(w β u βΉ x β· w β xs) β’ v β‘β¨β©
v / w β u βΉ x βͺ (w β xs) β’ v β‘β¨ cong (v / w β u βΉ x βͺ_) Pβ¨xsβ© β©
v / w β u βΉ x βͺ (w β xs β’ v) β’ v β‘β¨ cong (_βͺ (w β xs β’ v) β’ v) (/ββ’ u v w x) β©
(w β v / u βΉ x) β’ v βͺ (w β xs β’ v) β’ v β‘Λβ¨ β’-βͺ (w β v / u βΉ x) _ v β©
((w β v / u βΉ x) βͺ (w β xs β’ v)) β’ v β‘Λβ¨ cong (_β’ v) (ββ¨βͺβ© w (v / u βΉ x) _) β©
(w β v / u βΉ x βͺ xs β’ v) β’ v β‘β¨β©
(w β (u βΉ x β· xs) β’ v) β’ v β
>>=-β’Κ³ : β v (s : Weighted A) (k : A β Weighted B) β
(s >>= k) β’ v β‘ (s >>= k ββ’ v) β’ v
>>=-β’Κ³ v s k = β¦ alg v k β§ s
where
alg : β v (k : A β Weighted B) β Ξ¨[ s β¦ Weighted A ] β¦ (s >>= k) β’ v β‘ (s >>= k ββ’ v) β’ v
alg v k .snd = eq-coh
alg v k .fst β
β = refl
alg v k .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) =
(w βΉ x β· xs >>= k) β’ v β‘β¨β©
((w β k x) βͺ (xs >>= k)) β’ v β‘β¨ β’-βͺ (w β k x) _ _ β©
(w β k x) β’ v βͺ (xs >>= k) β’ v β‘β¨ cong ((w β k x) β’ v βͺ_) Pβ¨xsβ© β©
(w β k x) β’ v βͺ (xs >>= k ββ’ v) β’ v β‘β¨ cong (_βͺ (xs >>= k ββ’ v) β’ v) (>>=-β’Κ³-lemma w (k x) v) β©
(w β k x β’ v) β’ v βͺ (xs >>= k ββ’ v) β’ v β‘Λβ¨ β’-βͺ (w β k x β’ v) _ _ β©
((w β k x β’ v) βͺ (xs >>= k ββ’ v)) β’ v β‘β¨β©
(w βΉ x β· xs >>= k ββ’ v) β’ v β
module _ {A : Type a} where
β-βͺ-β : β (x y : Weighted A) p q β p β€ q β y β x β q β y β p β x
β-βͺ-β x y p q pβ€q (k , yβx) = βͺ-com (q β y) (p β x) ΝΎ cong (Ξ» e β (p β x) βͺ (q β e)) yβx ΝΎ β¦ alg β§ x
where
alg : Ξ¨[ x β¦ Weighted A ] β¦ (p β x) βͺ (q β x β’ k) β‘ p β x
alg .fst β
β = refl
alg .fst (w βΉ x β· xs β¨ Pβ¨xsβ© β©) with w β€? k
... | yes wβ€k =
(p β w βΉ x β· xs) βͺ (q β w βΉ x β· (xs β’ k)) β‘β¨β©
(p β w βΉ x β· p β xs) βͺ (q β w βΉ x β· q β (xs β’ k)) β‘Λβ¨ cong (p β w βΉ x β·_) (βͺ-cons (q β w) x _ _) β©
p β w βΉ x β· q β w βΉ x β· (p β xs) βͺ (q β xs β’ k) β‘β¨ dup (p β w) (q β w) x _ β©
((p β w) β (q β w)) βΉ x β· (p β xs) βͺ (q β (xs β’ k)) β‘β¨ cong (_βΉ x β· ((p β xs) βͺ (q β xs β’ k))) (ββ€β‘ (p β w) (q β w) (β€-congΚ³ w pβ€q)) β©
(p β w) βΉ x β· (p β xs) βͺ (q β (xs β’ k)) β‘β¨ cong (p β w βΉ x β·_) Pβ¨xsβ© β©
(p β w) βΉ x β· (p β xs) β‘β¨β©
p β w βΉ x β· xs β
... | no wβ°k =
(p β w βΉ x β· xs) βͺ (q β (xs β’ k)) β‘β¨β©
p β w βΉ x β· (p β xs) βͺ (q β (xs β’ k)) β‘β¨ cong (p β w βΉ x β·_) Pβ¨xsβ© β©
p β w βΉ x β· (p β xs) β‘β¨β©
p β w βΉ x β· xs β
alg .snd = eq-coh