{-# 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