packages feed

MiniAgda-0.2014.1.9: test/succeed/fib.ma

-- 2012-01-22 parameters gone from constructors

data Nat : Set {
  zero : Nat;
  succ : (n : Nat) -> Nat 
}

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

sized codata Stream : Size -> Set {
  cons : (i : Size) -> Nat -> Stream i -> Stream ($ i)
}
 
fun tail : Stream # -> Stream # {
  tail (cons .# x xs) = xs
}

fun head : Stream # -> Nat {
  head (cons .# x xs) = x
}

{-
norec head : (i : Size) -> Stream ($ i) -> Nat {
  head .($ i) (cons i n ns) = n
}

cofun zipWith :  (Nat -> Nat -> Nat ) -> ( i : Size ) 
		-> Stream i -> Stream i -> Stream i {
  zipWith f ($ i) as bs = 
	cons i (f (head i as) (head i bs))  (zipWith f i (tail i as) (tail i bs)) 
}
-}

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

let one : Nat = (succ zero)

cofun fib' : (x : Nat ) -> (y : Nat ) -> (i : Size ) -> Stream i 
{
  fib' x y ($ i) = cons _ x (fib' y (add x y) _)
} 
let fib : Stream # = (fib' one one _)


let four : Nat = (succ (succ (succ one)))

-- fib(four) = 5 
eval let fibfour : Nat = nth four fib 


--------------------------------------------
--------------------------------------------

data Leq : Nat -> Nat -> Set
{
lqz : (x : Nat ) -> Leq zero x ;
lqs : (x : Nat ) -> (y : Nat ) -> Leq x y -> Leq (succ x) (succ y)
}

sized codata Increasing : Size -> Stream # -> Set
{
inc : (i : Size ) -> (x : Nat ) -> (y : Nat ) -> Leq x y -> (tl : Stream # ) -> 
      Increasing i (cons # y tl) ->
      Increasing ($ i) (cons # x (cons # y tl)) 
}


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

let proof : Eq (Stream #) (tail fib) (tail fib) = refl



let double : Stream # -> Stream # = \s -> cons _ (head s) s

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

fun leq : Nat -> Nat -> Bool
{
leq zero y = tt;
leq (succ x) zero = ff ;
leq (succ x) (succ y) = leq x y 
}

fun ite : Bool -> (A : Set ) -> A -> A -> A
{
ite tt A a1 a2 = a1;
ite ff A a1 a2 = a2
}

cofun merge : (i : Size ) -> (Nat -> Nat -> Bool) -> Stream # -> Stream # -> Stream i
{
merge ($ i) le (cons .# x xs) (cons .# y ys) = 
      ite (le x y) (Stream _)
         (cons _ x (merge _ le xs (cons _ y ys)))
	 (cons _ y (merge _ le (cons _ x xs) ys))     
}

fun first : (A : Set ) -> (B : Set ) -> A -> B -> A
{
first A B a b = a
}

--------------------

cofun map : (i : Size) -> (Nat -> Nat) -> Stream i -> Stream i 
{
map ($ i) f (cons .i x xl) = cons _ (f x) (map _ f xl)
}

{-
-- 2012-01-22 constructor are no longer inferable!
let suc : Nat -> Nat = \ x -> succ x
-- 2012-01-25 constructor recognition also for function types
-}

cofun evil : (i : Size) -> Stream i
{
evil ($ i) = map _ succ (cons _ zero (evil _))
}

-- eval const zzz : Nat = head # (z #)