packages feed

MiniAgda-0.2014.1.9: test/fail/streamMisc.ma

data Nat : Set  
{
	zero : Nat ;
	succ : Nat -> Nat
}

fun add : Nat -> Nat -> Nat
{
add x zero = x;
add x (succ y) = succ (add x y);
}

eval let one : Nat = succ zero

sized codata Stream (A : Set) : Size -> Set 
{
  cons : (i : Size) -> A -> Stream A i -> Stream A ($ i)
}

cofun zeroes : (i : Size ) -> Stream Nat i
{
zeroes ($ i) = cons Nat i zero (zeroes i)
}
 
cofun ones : (i : Size) -> Stream Nat i
{
ones ($ i) = cons Nat i one (ones i)
}

eval let ones' : Stream Nat # = ones #

cofun map : (A : Set) -> (B : Set) -> (i : Size) ->
          (A -> B) -> Stream A # -> Stream B i
{
map A B ($ i) f (cons .A .# a as) = cons B i (f a) (map A B i f as)
} 

eval let twos : Stream Nat # = map Nat Nat # ( \ x -> succ x) ones'



-- tail is a fun
fun tail : (A : Set) -> Stream A # -> Stream A #
{
tail A (cons .A .# a as) = as
}


eval let twos' : Stream Nat # = tail Nat twos

fun head : (A : Set) -> Stream A # -> A
{
head A (cons .A .# a as) = a
}

eval let two : Nat = head Nat twos 
eval let two' : Nat = head Nat twos'

eval let twos2 : Stream Nat # = map Nat Nat # ( \ x -> succ x) ones'
eval let twos2' : Stream Nat # = tail Nat twos2

cofun zipWith : ( A : Set ) -> ( B : Set ) -> (C : Set) -> ( i : Size ) ->
	(A -> B -> C) -> Stream A # -> Stream B # -> Stream C i
{
zipWith A B C ($ i) f (cons .A .# a as) (cons .B .# b bs) = 
  cons C i (f a b) (zipWith A B C i f as bs)
}



fun nth : Nat -> Stream Nat # -> Nat
{
nth zero ns = head Nat ns;
nth (succ x) ns = nth x (tail Nat ns) 
}

eval let fours : Stream Nat # = zipWith Nat Nat Nat # add twos twos
eval let four : Nat = head Nat fours



cofun fib : (x : Nat ) -> (y : Nat ) -> (i : Size ) -> Stream Nat i
{
fib x y ($ i) = (cons Nat ($ i) x (cons Nat i y (fib y (add x y) i)))
} 

eval let fib' : Stream Nat # = tail Nat (fib zero zero #) 


eval let fib8 : Nat = nth (add four four) (fib zero zero #)

eval let fib2 : Nat  = head Nat (tail Nat (fib zero zero #))

cofun nats : (i : Size ) -> Nat -> Stream Nat i
{
nats ($ i) x = (cons Nat i x (nats i (succ x)))
}

eval let nats' : Stream Nat # = tail Nat (nats # zero)


--- weakening
eval let wkStream : ( A : Set ) -> ( i : Size ) -> Stream A ($ i) -> Stream A i = \ A -> \ i -> \ s -> s

-- should be ok but does not pass admissibility check
cofun wkStream_ok : ( A : Set ) -> (i : Size ) -> Stream A ($ i) -> Stream A i
{
wkStream_ok A ($ i) (cons .A .($ i) x xs) = cons A i x (wkStream A i xs) 
}


     
--bad 
--not admissble
cofun wkStream2 : ( A : Set ) -> ( i : Size ) -> Stream A i -> Stream A ($ i)
{
wkStream2 A ($ i) (cons A .i x xs) = cons A ($ i) x (wkStream2 A i xs)
}


-- an unproductive stream
cofun unp : (i : Size ) -> Stream Nat i 
{
unp i = unp i
}

-- another one, not type correect
{-
cofun unp2 : (i : Size ) -> Stream Nat i
{
unp2 ($ i) = cons Nat i zero (tail Nat (unp2 ($ i)))
}
-} 


--eval let bla2 : Nat = nth four (unp #)

mutual
{

cofun alt1 : ( i : Size ) -> Stream Nat i
{
alt1 ($ i) = cons Nat i zero (alt2 i)
}

cofun alt2 : ( i : Size ) -> Stream Nat i
{
alt2 ($ i) = cons Nat i one (alt1 i)
}

}

data Bool : Set
{
tt : Bool;
ff : Bool
}

-- tt if a stream starts with 2 zeroes
fun twozeroes : Stream Nat # -> Bool
{
twozeroes (cons .Nat .# zero (cons .Nat .# zero str)) = tt;
twozeroes (cons .Nat .# zero (cons .Nat .# (succ x) str)) = ff;
twozeroes (cons .Nat .# (succ x) str) = ff
}

eval let twozeroes'zeroes : Bool = twozeroes (zeroes #) 

data Eq ( A : Set ) : A -> A -> Set
{
refl : (a : A) -> Eq A a a 
}

-- hangs on unproductive stream
--  let zz : Eq (Stream Nat #) (unp #) (cons Nat # zero (unp #)) = refl (Stream Nat #) (unp #) 

sized data Unit : Size -> Set
{
unit : (i : Size ) -> Unit ($ i)
}

-- bad.  2010-03-10 WHY?  I think it is ok!
fun head2 : (i : Size ) -> Unit i -> Stream Nat i -> Nat
{
head2 .($ i) (unit i) (cons .Nat .i x xl) = x 
}