pisigma-0.2: examples/Fin.pi
:l Nat.pi
Fin : Nat -> Type;
Fin = \ n -> split n with (ln , n') ->
! case ln of {
z -> [Empty]
| s -> [(l : { z s }) * case l of {
z -> Unit
| s -> Fin (unfold n')}]};
fz : (n:Nat) -> Fin (succ n);
fz = \ n -> ('z , 'unit );
fs : (n:Nat) -> Fin n -> Fin (succ n);
fs = \ n i -> ('s, i);
fmax : (n:Nat) -> Fin (succ n);
fmax = \ n -> split n with (ln , n') ->
! case ln of {
z -> [fz zero]
| s -> [fs n (fmax (unfold n'))] };
femb : (n:Nat) -> Fin n -> Fin (succ n);
femb = \ n i -> split n with (ln , n') ->
! case ln of {
z -> case i of {}
| s -> split i with (li , i') ->
case li of {
z -> [fz n]
| s -> [fs n (femb (unfold n') i')] }};
finv : (n:Nat) -> Fin n -> Fin n;
finv = \ n i -> split n with (ln , n') ->
! case ln of {
z -> case i of {}
| s -> split i with (li , i') ->
case li of {
z -> [fmax (unfold n')]
| s -> [unfold n' as n' ->
fs n' (finv n' i')] }};