{-# OPTIONS --cubical --postfix-projections #-}
open import Prelude
open import Algebra
open import Container
module Control.Monad.ListT
(π½ : Container)
(is-mon : Monad β¦ π½ β§)
where
open Monad {ββ = βzero} is-mon
postulate
cmap-return : (f : A β B) (x : β¦ π½ β§ A) β
(cmap f x β‘ (x >>= return β f))
infixr 5 _β·_
mutual
List : Type β Type
List A = β¦ π½ β§ (Cons A)
data Cons (A : Type) : Type where
[] : Cons A
_β·_ : (x : A) β (xs : List A) β Cons A
data βπ¬π«π° (A : Type) (P : List A β Type) : Type where
[] : βπ¬π«π° A P
_β·_β¨_β© : (x : A) β (xs : List A) β (Pβ¨xsβ© : P xs) β βπ¬π«π° A P
module _ {A : Type} (P : List A β Type) where
wrapc : βπ¬π«π° A P β Cons A
wrapc [] = []
wrapc (x β· xs β¨ Pβ¨xsβ© β©) = x β· xs
wrap : β¦ π½ β§ (βπ¬π«π° A P) β List A
wrap = cmap wrapc
{-# INLINE wrap #-}
-- module _ (Ο : (x : β¦ π½ β§ (βπ¬π«π° A P)) β P (wrap x)) where
-- elim : (x : List A) β P x
-- elim (n , k) = {!!}
-- elimc : Cons A β βπ¬π«π° A P
-- wrapc-elimc : (c : Cons A) β wrapc (elimc c) β‘ c
-- wrapc-elimc [] i = []
-- wrapc-elimc (x β· xs) i = x β· xs
-- elimc [] = []
-- elimc (x β· xs) = x β· xs β¨ elim xs β©
-- elim xs =
-- subst
-- P
-- (cong (xs .fst ,_) (funExt (Ξ» x β wrapc-elimc (xs .snd x))))
-- (Ο (cmap elimc xs))
-- module _ (Ο : β¦ π½ β§ (βπ¬π«π° A (const B)) β B) where
-- para : List A β B
-- parac : Cons A β βπ¬π«π° A (const B)
-- para xs = Ο (cmap parac xs)
-- parac [] = []
-- parac (x β· xs) = x β· xs β¨ para xs β©
-- ++-Ο : List A β β¦ π½ β§ (βπ¬π«π° A (const (List A))) β List A
-- ++-Ο ys xs = xs >>= Ξ» { [] β ys ; (x β· _ β¨ xs β©) β return (x β· xs) }
-- infixr 5 _++_
-- _++_ : List A β List A β List A
-- xs ++ ys = para (++-Ο ys) xs
-- cmap-comp : (f : B β C) (g : A β B) (x : β¦ π½ β§ A) β cmap f (cmap g x) β‘ cmap (f β g) x
-- cmap-comp f g x = refl
-- cmap-id : (x : β¦ π½ β§ A) β cmap id x β‘ x
-- cmap-id x = refl
-- open import Path.Reasoning
-- ++-id : (xs : List A) β xs ++ return [] β‘ xs
-- ++-id {A = A} = elim P Ο
-- where
-- P : List A β Type
-- P xs = xs ++ return [] β‘ xs
-- Ο : β¦ π½ β§ (βπ¬π«π° A (const (List A))) β List A
-- Ο = ++-Ο (return [])
-- Οβ² : βπ¬π«π° A (const (List A)) β Cons A
-- Οβ² [] = []
-- Οβ² (x β· xs β¨ Pβ¨xsβ© β©) = x β· Pβ¨xsβ©
-- Οβ‘ : β xs β Ο xs β‘ (xs >>= return ββ² Οβ²)
-- Οβ‘ xs = cong (xs >>=_) (funExt (Ξ» { [] β refl ; (x β· xs β¨ Pβ¨xsβ© β©) β refl }))
-- lemma : (xs : βπ¬π«π° A P) β Οβ² (parac Ο (wrapc P xs)) β‘ wrapc P xs
-- lemma [] = refl
-- lemma (x β· xs β¨ Pβ¨xsβ© β©) = cong (x β·_) Pβ¨xsβ©
-- Ο : (xs : β¦ π½ β§ (βπ¬π«π° A P)) β P (wrap P xs)
-- Ο xs =
-- wrap P xs ++ return [] β‘β¨β©
-- para Ο (wrap P xs) β‘β¨β©
-- Ο (cmap (parac Ο) (wrap P xs)) β‘β¨ Οβ‘ _ β©
-- (cmap (parac Ο) (wrap P xs) >>= return ββ² Οβ²) β‘Λβ¨ cmap-return Οβ² _ β©
-- cmap Οβ² (cmap (parac Ο) (wrap P xs)) β‘β¨β©
-- cmap (Οβ² β parac Ο) (wrap P xs) β‘β¨β©
-- cmap (Οβ² β parac Ο) (cmap (wrapc P) xs) β‘β¨β©
-- cmap (Οβ² β parac Ο β wrapc P) xs β‘β¨ cong (flip cmap xs) (funExt lemma) β©
-- wrap P xs β
-- -- open import Cubical.Data.Sigma.Properties
-- -- ++-assoc : (xs ys zs : List A) β (xs ++ ys) ++ zs β‘ xs ++ (ys ++ zs)
-- -- ++-assoc {A = A} xs ys zs = elim P Ο xs
-- -- where
-- -- P : List A β Type
-- -- P xsβ² = (xsβ² ++ ys) ++ zs β‘ xsβ² ++ (ys ++ zs)
-- -- {-# INLINE P #-}
-- -- Ο : (x : β¦ π½ β§ (βπ¬π«π° A P)) β P (wrap P x)
-- -- Ο xs = Ξ£PathTransportβPathΞ£ _ _ ({!refl!} , {!!})
-- -- _>>=β²_ : List A β (A β List B) β List B
-- -- _>>=β²_ {A = A} {B = B} xs k = para Ο xs
-- -- where
-- -- Ο : β¦ π½ β§ (βπ¬π«π° A (List B)) β List B
-- -- Ο xs = xs >>= Ξ» { [] β return [] ; (x β· xs) β k x ++ xs }