bsc-leon-vatthauer/slides/code-examples/reverse.agda

40 lines
1.3 KiB
Agda
Raw Normal View History

2024-01-03 19:51:04 +01:00
{-# OPTIONS --guardedness #-}
open import Codata.Musical.Colist hiding (_++_)
open import Codata.Musical.Colist.Bisimilarity
open import Codata.Musical.Notation
open import Data.Nat
open import Data.Nat.Show renaming (show to show)
open import Function.Base
open import Relation.Binary.PropositionalEquality
open import Data.String using (String; _++_)
module reverse where
data Delay (A : Set) : Set where
now : A Delay A
later : (Delay A) Delay A
foldl : {A B : Set} (A B A) A Colist B Delay A
foldl c n [] = now n
foldl c n (x xs) = later ( foldl c (c n x) ( xs))
-- reversing possibly infinite lists
reverse : {A : Set} Colist A Delay (Colist A)
reverse {A} = reverseAcc []
where
reverseAcc : Colist A Colist A Delay (Colist A)
reverseAcc = foldl (λ xs x x ( xs)) -- 'flip _∷_' with extra steps
run_for_steps : {A : Set} Delay A Delay A
run now x for n steps = now x
run later x for zero steps = later x
run later x for suc n steps = run x for n steps
fin-colist : Colist
fin-colist = 1 (2 (3 []))
inf-colist : Colist
inf-colist = 1 inf-colist
-- run reverse fin-colist for 5 steps
-- run reverse inf-colist for 1000 steps