packages feed

MiniAgda-0.2014.1.9: test/fail/Fib2.ma

-- 2010-11-01

-- Nat ---------------------------------------------------------------

sized data SNat : Size -> Set 
{ zero : [i : Size] -> SNat ($ i)
; succ : [i : Size] -> SNat i -> SNat ($ i) 
}

let Nat : Set = SNat #

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

-- Stream ------------------------------------------------------------

sized codata Stream ++(A : Set) : -Size -> Set 
{ cons : [i : Size] -> (head : A) -> (tail : Stream A i) -> Stream A ($ i)
}
fields head, tail

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


-- Fibonacci stream --------------------------------------------------

let n0 : Nat = zero #
let n1 : Nat = succ # n0

cofun fib : [i : Size] -> Stream Nat i
{
  fib ($ i) = cons i n0 (zipWith Nat Nat Nat add i 
    (cons i n1 (fib i)) (fib i))
}

cofun fib2 : [i : Size] -> Stream Nat (i + i)
{
  fib2 ($ i) = -- RHS illtyped, produces only Stream Nat $(i + i)
    cons (i + i) n0 
      (zipWith Nat Nat Nat add (i + i) 
        (cons (i + i) n1 (fib2 i)) 
        (fib2 i))
}