packages feed

pisigma-0.2: examples/Universe.pi

:l Nat.pi
:l Fin.pi
:l Bool.pi

U   :  Type;  
El  :  U -> Type;

U = (l : {enum sigma rec}) * 
     case l of  { enum   -> Nat
                | sigma  -> Rec [(a : U) * (El a ->  U)]
                | rec    -> ^ (Rec [U]) };

El =  \ a ->  split a with (a_l,a_r) -> 
     ! case a_l of
       {  enum   ->  [Fin a_r]
       |  sigma  ->  [unfold a_r as a_r' -> 
                      split a_r' with (b,c) -> 
                      (x : El b) * (El (c x))]
       |  rec    ->  [unfold (! a_r) as a_r' -> 
                     Rec [El a_r']]};

nat : U =  ('sigma, fold (('enum, succ (succ zero)),
           (\ i -> split i with (i_l,i_r) ->   
                    !  case i_l of  
		       {  z  ->  [('enum, succ zero)]
                       |  s  ->  [('rec, [fold nat])]})));

eq : (a : U) -> El a -> El a -> Bool;

refl : (a : U) → (x : El a) → T (eq a x x);

subst : (a : U) → (x y : El a) → T (eq a x y) 
      → (P : El a → Type) → P x → P y;