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