packages feed

MiniAgda-0.2014.1.9: test/succeed/Mu.ma

-- 2010-06-20
-- sized inductive types
-- 2012-01-22 parameters gone from constructors

data Empty : Set {}
data Unit  : Set { unit : Unit }
data Sum ++(A : Set) ++(B : Set) : Set
{ inl : A -> Sum A B
; inr : B -> Sum A B
}
data Prod ++(A : Set) ++(B : Set) : Set
{ pair : (fst : A) -> (snd : B) -> Prod A B 
}

sized data Mu ++(F : ++Set -> Set) : +Size -> Set
{ inn : [i : Size] -> (out : F (Mu F i)) -> Mu F ($ i)
}

fun myout : [F : ++Set -> Set] -> [i : Size] -> Mu F ($ i) -> F (Mu F i)
{ myout F i (inn .i t) = t
}

-- iteration (universal property of Mu)
fun iter : [F : ++Set -> Set] -> 
           (mapF : [A : Set] -> [B : Set] -> (A -> B) -> F A -> F B) ->
           [G : Set] -> (step : F G -> G) ->
           [i : Size] -> Mu F i -> G
{- iter F mapF G step .($ j) (inn .F j t) =
   step (mapF (Mu F j) G (iter F mapF G step j) t)
-}
{ iter F mapF G step i (inn (i > j) t) =
   step (mapF (Mu F j) G (iter F mapF G step j) t)
}

let NatF : ++Set -> Set         = \ X -> Sum Unit X
let Nat  : +Size -> Set         = Mu NatF

let zero : [i : Size] -> Nat ($ i)
         = \ i -> inn i (inl unit) 

let succ : [i : Size] -> Nat i -> Nat ($ i)
         = \ i -> \ n -> inn i (inr n) 


let ListF : ++Set -> ++Set -> Set = \ A -> \ X -> Sum Unit (Prod A X)
let List  : ++Set -> +Size -> Set = \ A -> Mu (ListF A)