packages feed

lambdacube-2008.12.24: natmisc.cube

-- Predecessor, (provably) takes O(n) with these kind of numbers.
-- pred 0 = 0
pred :: Nat -> Nat;
pred n = 
    let BN :: *;
        BN = Pair Bool Nat;
        step :: BN -> BN;
        step = split Bool Nat BN (\ (b::Bool) (p::Nat) -> PairC Bool Nat True (if Nat b (Succ p) 0));
        bn :: BN;
        bn = natprim BN step (PairC Bool Nat False 0) n;
    in  snd Bool Nat bn;

-- This subtraction is O(m*n).  Wow, it's bad. :)
sub :: Nat -> Nat -> Nat;
sub x y = natprim Nat pred x y;

leNat :: Nat -> Nat -> Bool;
leNat x y = isZero (sub x y);

eqNat :: Nat -> Nat -> Bool;
eqNat x y = and (leNat x y) (leNat y x);