123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- module PreludeNat where
- open import AlonzoPrelude
- import PreludeBool as Bool
- open Bool
- infix 40 _==_ _<_
- infixl 60 _+_ _-_
- infixl 70 _*_
- infixr 80 _^_
- infix 100 _!
- _+_ : Nat -> Nat -> Nat
- zero + m = m
- suc n + m = suc (n + m)
- _-_ : Nat -> Nat -> Nat
- zero - m = zero
- suc n - zero = suc n
- suc n - suc m = n - m
- _*_ : Nat -> Nat -> Nat
- zero * m = zero
- suc n * m = m + n * m
- _^_ : Nat -> Nat -> Nat
- n ^ zero = 1
- n ^ suc m = n * n ^ m
- _! : Nat -> Nat
- zero ! = 1
- suc n ! = suc n * n !
- {-# BUILTIN NATPLUS _+_ #-}
- {-# BUILTIN NATMINUS _-_ #-}
- {-# BUILTIN NATTIMES _*_ #-}
- divSuc : Nat -> Nat -> Nat
- divSuc zero _ = zero
- divSuc (suc n) m = 1 + divSuc (n - m) m
- modSuc : Nat -> Nat -> Nat
- modSuc zero _ = zero
- modSuc (suc n) m = modSuc (n - m) m
- {-# BUILTIN NATDIVSUC divSuc #-}
- {-# BUILTIN NATMODSUC modSuc #-}
- div : Nat -> Nat -> Nat
- div n zero = zero
- div n (suc m) = divSuc n m
- mod : Nat -> Nat -> Nat
- mod n zero = zero
- mod n (suc m) = modSuc n m
- gcd : Nat -> Nat -> Nat
- gcd a 0 = a
- gcd a b = gcd b (mod a b)
- lcm : Nat -> Nat -> Nat
- lcm a b = div (a * b) (gcd a b)
- _==_ : Nat -> Nat -> Bool
- zero == zero = true
- zero == suc _ = false
- suc _ == zero = false
- suc n == suc m = n == m
- _<_ : Nat -> Nat -> Bool
- n < zero = false
- zero < suc m = true
- suc n < suc m = n < m
- _≤_ : Nat -> Nat -> Bool
- n ≤ m = n < suc m
- _>_ = flip _<_
- _≥_ = flip _≤_
- even : Nat -> Bool
- even n = mod n 2 == 0
- odd : Nat -> Bool
- odd n = mod n 2 == 1
- _≡_ : Nat -> Nat -> Set
- n ≡ m = IsTrue (n == m)
- {-# BUILTIN NATEQUALS _==_ #-}
- {-# BUILTIN NATLESS _<_ #-}
|