packages feed

MiniAgda-0.2014.1.9: test/fail/lengthCoList.ma

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


sized codata Colist (A : Set) : Size -> Set
{
  nil  : [i : Size] -> Colist A ($ i);
  cons : [i : Size] -> A -> Colist A i -> Colist A ($ i)
}

cofun olist' : [i : Size] -> Colist (Nat #) i
{
olist' ($ i) = cons i (zero #) (olist' i)
}

-- not allowed because no inductive argument with i 
fun length : [i : Size] -> [A : Set] -> Colist A i -> Nat i
{
length .($ i) A (nil i) = zero i ;
length .($ i) A (cons i a as) = succ i (length i A as)
}

eval let diverge : Nat # = length # (Nat #) (olist' #)


-- the rest is fine --------------------------------------------------

sized codata CoNat : Size -> Set
{
  cozero : [i : Size] -> CoNat ($ i);
  cosucc : [i : Size] -> CoNat i -> CoNat ($ i)
}

let z : CoNat # = cozero #

-- allowed because i used in coinductive result
cofun length2 : [i : Size] -> [A : Set] -> Colist A i -> CoNat i
{
length2 ($ i) A (nil .i) = cozero i;
length2 ($ i) A (cons .i a as) = cosucc i (length2 i A as) 
}

cofun omega' : [i : Size] -> CoNat i
{
omega' ($ i) = cosucc i (omega' i)
}

let omega : CoNat # = omega' #

-- not ok because size not used in inductive argument 
-- fun convert1 : [i : Size] -> CoNat i -> Nat i
-- {
-- convert1 ($ i) (cozero .i) = zero i;
-- convert1 ($ i) (cosucc i x) = succ i (convert1 i x) 
-- }

-- ok 
fun convert2 : [i : Size] -> Nat i -> CoNat i
{
convert2 ($ i) (zero .i) = cozero i;
convert2 ($ i) (succ .i x) = cosucc i (convert2 i x) 
}

-- also ok
fun convert2' : [i : Size] -> Nat i -> CoNat i
{ convert2' i (zero (i > j))   = cozero j
; convert2' i (succ (i > j) x) = cosucc j (convert2' j x)
}

-- also ok
fun convert3 : [i : Size] -> Nat i -> CoNat #
{
convert3 i (zero (i > j)) = cozero #;
convert3 i (succ (i > j) x) = omega' #
}

-- also ok
cofun convert4 : [i : Size] -> Nat i -> CoNat i
{
convert4 ($ i) (zero .i) = cozero ($ i) ;
convert4 ($ i) (succ .i x) = cosucc i (convert4 i x) 
}