blob: 597146032cbc092c0fd7ebf12274495270576d2f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
module Examples where
open import Data.Nat using (ℕ ; zero ; suc ; _⊓_ ; _∸_ ; ⌈_/2⌉)
open import Data.Vec using (Vec ; [] ; _∷_ ; reverse ; _++_)
import GetTypes
import FreeTheorems
open GetTypes.VecVec using (Get)
open FreeTheorems.VecVec using (assume-get)
reverse' : Get
reverse' = assume-get reverse
double' : Get
double' = assume-get f
where g : ℕ → ℕ
g zero = zero
g (suc n) = suc (suc (g n))
f : {A : Set} {n : ℕ} → Vec A n → Vec A (g n)
f [] = []
f (x ∷ v) = x ∷ x ∷ f v
double'' : Get
double'' = assume-get (λ v → v ++ v)
take' : ℕ → Get
take' n = assume-get (f n)
where f : (n : ℕ) → {A : Set} {m : ℕ} → Vec A m → Vec A (m ⊓ n)
f n [] = []
f zero (x ∷ xs) = []
f (suc n) (x ∷ xs) = x ∷ f n xs
drop' : ℕ → Get
drop' n = assume-get (f n)
where f : (n : ℕ) → {A : Set} {m : ℕ} → Vec A m → Vec A (m ∸ n)
f zero xs = xs
f (suc n) [] = []
f (suc n) (x ∷ xs) = f n xs
sieve' : Get
sieve' = assume-get f
where f : {A : Set} {n : ℕ} → Vec A n → Vec A ⌈ n /2⌉
f [] = []
f (x ∷ []) = x ∷ []
f (x ∷ _ ∷ xs) = x ∷ f xs
|