12 | module Data.Recursion.Free
15 | import Data.InductionRecursion.DybjerSetzer
24 | data General : (a : Type) -> (b : a -> Type) -> (x : Type) -> Type where
26 | Tell : x -> General a b x
30 | Ask : (i : a) -> (b i -> General a b x) -> General a b x
34 | PiG : (a : Type) -> (b : a -> Type) -> Type
35 | PiG a b = (i : a) -> General a b (b i)
39 | fold : (x -> y) -> ((i : a) -> (b i -> y) -> y) -> General a b x -> y
40 | fold pure ask (Tell x) = pure x
41 | fold pure ask (Ask i k) = ask i (\ o => fold pure ask (k o))
54 | bind : General a b x -> (x -> General a b y) -> General a b y
55 | bind m f = fold f Ask m
60 | monadMorphism : Monad m => (t : (i : a) -> m (b i)) -> General a b x -> m x
61 | monadMorphism t = fold pure (\ i => (t i >>=))
67 | Functor (General a b) where
68 | map f = fold (Tell . f) Ask
71 | Applicative (General a b) where
73 | gf <*> gv = bind gf (\ f => map (f $
) gv)
76 | Monad (General a b) where
84 | already : General a b x -> Maybe x
85 | already = monadMorphism (\ i => Nothing)
89 | expand : PiG a b -> General a b x -> General a b x
90 | expand f = monadMorphism f
94 | engine : PiG a b -> Nat -> General a b x -> General a b x
96 | engine f (S n) = engine f n . expand f
101 | petrol : PiG a b -> Nat -> (i : a) -> Maybe (b i)
102 | petrol f n i = already $
engine f n $
f i
110 | late : PiG a b -> General a b x -> Late x
111 | late f = monadMorphism (\ i => Later (assert_total $
late f (f i)))
116 | lazy : PiG a b -> (i : a) -> Late (b i)
117 | lazy f i = late f (f i)
122 | namespace DybjerSetzer
127 | Domain : PiG a b -> (i : a) -> Code b (b i)
128 | Domain f i = monadMorphism ask (f i) where
130 | ask : (i : a) -> Code b (b i)
131 | ask i = Branch () (const i) $
\ t => Yield (t ())
136 | evaluate : (f : PiG a b) -> (i : a) -> Mu (Domain f) i -> b i
137 | evaluate f i inDom = Decode inDom
141 | totally : (f : PiG a b) -> ((i : a) -> Mu (Domain f) i) ->
143 | totally f allInDomain i = evaluate f i (allInDomain i)
157 | data Layer : (f : PiG a b) -> (d : General a b (b i)) -> Type
163 | Domain : (f : PiG a b) -> (i : a) -> Type
168 | evaluateLayer : (f : PiG a b) -> (d : General a b (b i)) -> (0 _ : Layer f d) -> b i
171 | evaluate : (f : PiG a b) -> (i : a) -> (0 _ : Domain f i) -> b i
179 | data Layer : PiG a b -> General a b (b i) -> Type where
181 | MkTell : {0 a : Type} -> {0 b : a -> Type} -> {0 f : PiG a b} -> {0 i : a} ->
182 | (o : b i) -> Layer f (Tell o)
186 | MkAsk : {0 a : Type} -> {0 b : a -> Type} -> {0 f : PiG a b} -> {0 i : a} ->
187 | (j : a) -> (jprf : Domain f j) ->
188 | (k : b j -> General a b (b i)) -> Layer f (k (evaluate f j jprf)) ->
193 | Domain f i = Layer f (f i)
201 | data View : {d : General a b (b i)} -> (l : Layer f d) -> Type where
202 | TView : {0 b : a -> Type} -> {0 f : PiG a b} -> (o : b i) -> View (MkTell {b} {f} o)
203 | AView : {0 f : PiG a b} ->
204 | (j : a) -> (0 jprf : Domain f j) ->
205 | (k : b j -> General a b (b i)) -> (0 kprf : Layer f (k (evaluate f j jprf))) ->
206 | View (MkAsk j jprf k kprf)
213 | view : (d : General a b (b i)) -> (0 l : Layer f d) -> View l
214 | view (Tell o) (MkTell o) = TView o
215 | view (Ask j k) (MkAsk j jprf k kprf) = AView j jprf k kprf
220 | evaluate f i l = evaluateLayer f (f i) l
227 | evaluateLayer f d l = case view d l of
229 | AView j jprf k kprf => evaluateLayer f (k (evaluate f j jprf)) kprf
233 | totally : (f : PiG a b) -> (0 _ : (i : a) -> Domain f i) ->
235 | totally f dom i = evaluate f i (dom i)
242 | irrelevantDomain : (f : PiG a b) -> (i : a) -> (p, q : Domain f i) -> p === q
246 | : (f : PiG a b) -> (d : General a b (b i)) -> (l, m : Layer f d) -> l === m
248 | irrelevantDomain f i p q = irrelevantLayer f (f i) p q
250 | irrelevantLayer f (Tell o)
251 | (MkTell o) (MkTell o) = Refl
252 | irrelevantLayer f (Ask j k)
253 | (MkAsk j jprf1 k kprf1) (MkAsk j jprf2 k kprf2)
254 | with (irrelevantDomain f j jprf1 jprf2)
255 | irrelevantLayer f (Ask j k)
256 | (MkAsk j jprf k kprf1) (MkAsk j jprf k kprf2)
257 | | Refl = cong (MkAsk j jprf k)
258 | $
irrelevantLayer f (k (evaluate f j jprf)) kprf1 kprf2
263 | evaluateLayerIrrelevance
264 | : (f : PiG a b) -> (d : General a b (b i)) -> (0 p, q : Layer f d) ->
265 | evaluateLayer f d p === evaluateLayer f d q
266 | evaluateLayerIrrelevance f d p q
267 | = rewrite irrelevantLayer f d p q in Refl
272 | evaluateIrrelevance
273 | : (f : PiG a b) -> (i : a) -> (0 p, q : Domain f i) ->
274 | evaluate f i p === evaluate f i q
275 | evaluateIrrelevance f i p q
276 | = evaluateLayerIrrelevance f (f i) p q
282 | : (f : PiG a b) -> (0 p, q : (i : a) -> Domain f i) ->
283 | (i : a) -> totally f p i === totally f q i
284 | totallyIrrelevance f p q i = evaluateIrrelevance f i (p i) (q i)