packages feed

pisigma-0.2: examples/Bool.pi

:l Empty.pi
:l Unit.pi

Bool : Type;
Bool = { true false };

T : Bool -> Type;
T = \ b -> case b of {
             true -> Unit
	   | false -> Empty };

andb : Bool -> Bool -> Bool;
andb = \ b c -> case b of {
                  true -> c
                | false -> 'false };

orb : Bool -> Bool -> Bool;
orb = \ b c -> case b of {
                  true -> 'true
                | false -> c };

eqBool : Bool -> Bool -> Bool;
eqBool = \ b1 b2 -> 
   case b1 of
    { true ->  case b2 of { true -> 'true | false -> 'false}                  
    | false -> case b2 of { true -> 'false | false -> 'true}};                

EqBool : Bool -> Bool -> Type;
EqBool = \b1 b2 -> T(eqBool b1 b2);

reflBool : (b : Bool) -> EqBool b b;
reflBool = \ b -> case b of
 { true -> 'unit
   | false -> 'unit}; 

substBool : (P : Bool -> Type) -> 
	  (b1 b2 : Bool)
	  -> (EqBool b1 b2)
	  -> P b1 -> P b2;
substBool = \ P b1 b2 m m1 ->
   case b1 of
     {true -> case b2 of
          { true -> m1
           | false -> case m of {}}
     | false ->  case b2 of
          { true ->  case m of {}
           | false -> m1}};