packages feed

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')] }};