module Library.Nat where

data  : Set where
  zero : 
  succ :  -> 

{-# BUILTIN NATURAL  #-}

infixl 6 _+_ _-_
infixl 7 _*_
infixl 8 _^_

_+_ :  ->  -> 
zero   + y = y
succ x + y = succ (x + y)

_-_ :  ->  -> 
zero   - _      = 0
succ x - zero   = succ x
succ x - succ y = x - y

_*_ :  ->  -> 
zero   * _ = 0
succ x * y = y + (x * y)

_^_ :  ->  -> 
x ^ zero = 1
x ^ succ n = x * x ^ n

min :  ->  -> 
min zero y = zero
min (succ x) zero = zero
min (succ x) (succ y) = succ (min x y)

max :  ->  -> 
max zero y = y
max (succ x) zero = succ x
max (succ x) (succ y) = succ (max x y)

_! :  -> 
zero   ! = 1
succ n ! = succ n * (n !)