pisigma-0.1.0.1: examples/Conat.pi
:l Empty.pi
:l Unit.pi
Nat' : Type;
Nat' = (l : { z s }) * case l of {
z -> Unit
| s -> [^ Nat'] };
zero : Nat';
zero = ('z,'unit);
succ : ^Nat' -> Nat';
succ = \ n -> ('s,n);
one : Nat';
one = succ [zero];
two : Nat';
two = succ [one];
omega : Nat';
omega = succ [omega];
add : Nat' -> Nat' -> Nat';
add = \ m n -> split m with (lm , m') ->
case lm of {
z -> n
| s -> succ [add (!m') n] };
eq : Nat' -> Nat' -> Type;
eq = \ m n -> split m with (lm , m') ->
split n with (ln , n') ->
case lm of {
z -> case ln of {
z -> Unit
| s -> Empty }
| s -> case ln of {
z -> Empty
| s -> [^ (eq (! m') (! n'))]}};
refl : (n:Nat') -> eq n n;
refl = \ n -> split n with (ln , n') ->
case ln of {
z -> 'unit
| s -> [refl (!n')] };
sym : (m:Nat') -> (n:Nat') -> eq m n -> eq n m;
sym = \ m n p ->
split m with (lm , m') ->
split n with (ln , n') ->
case lm of {
z -> case ln of {
z -> 'unit
| s -> case p of {}}
| s -> case ln of {
z -> case p of {}
| s -> [sym (! m') (! n') (! p)] }};
{-
subst : (P : Nat' -> Type)
-> (m : Nat') -> (n : Nat')
-> (eq m n)
-> P m -> ^ (P n);
subst = \ P m n q x ->
split m with (lm , m') ->
split n with (ln , n') ->
case lm of {
z -> case ln of {
z -> case m' of {
unit -> case n' of {
unit -> [x] }}
| s -> case q of {}}
| s -> case ln of {
z -> case q of {}
| s -> [subst (\ i -> P (succ i)) (! m') (! n') (! q) x]}};
-}
{- seems we need an eliminator for boxes, e.g. unbox
-}