packages feed

pisigma-0.2: examples/Parser.pi

:l Bool.pi

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

inftyOpt : Type -> Bool -> Type
   = \ A b -> case b of {
                 true -> A
               | false -> ^ A };

boxOpt : (b:Bool) -> (A:Type) -> A -> inftyOpt A b
       = \ b A a -> case b of { true -> a
		              | false -> [a] };

forceOpt : (b:Bool) -> (A:Type) -> inftyOpt A b -> A 
       = \ b A a -> case b of { true -> a
		              | false -> !a };

Tok : Type;

P : Bool -> Type
  = \ b -> (l : { fail empty sat alt seq } ) *
           case l of {
             fail -> EqBool 'false b
           | empty -> EqBool 'true b
           | sat -> (Tok -> Bool) * (EqBool 'false b)
           | alt -> (n1 n2 : Bool) * Rec [P n1] * Rec [P n2] * (EqBool (orb n1 n2) b)
           | seq -> (n1 n2 : Bool) * inftyOpt (Rec [P n1]) n2 *
                                     inftyOpt (Rec [P n2]) n1 * (EqBool (andb' n1 n2) b) };


star : P 'false -> P 'true;
plus : P 'false -> P 'false;

star = \ p -> ('alt , ('true, ('false, (fold ('empty, reflBool 'true),
                                       (fold (plus p),
                                       reflBool 'false)))));

plus = \ p -> ('seq, ('false, ('true, (fold p, ([fold (star p)], reflBool 'false)) )) );