Skip to main content

Natural Numbers

warning

Type signatures are provisional and may contain errors.

Basic Operations

isNat

(isNat n)
> n : a
> Bool

Checks if a value is a natural number.

isNat 5       == 1
isNat 0 == 1
isNat SOME == 0
isNat b#hi == 0

toNat

(toNat n)
> n : a
> Nat

Converts a value to a natural number. If the input is already a natural number, it returns it unchanged.

toNat 5       == 5
toNat 0 == 0
toNat SOME == 0 ; Non-numbers become 0
toNat b#hi == 0

times

(times f z n)
> f : (a > b)
> z : a
> n : Nat
> b

Applies a function f to an initial value z, x times.

times inc 0 3        == 3
times (mul 2) 1 4 == 16
times (add 2) 0 3 == 6

inc

(inc n)
> n : Nat
> Nat

Increments a natural number by 1.

inc 0      == 1
inc 5 == 6
inc 255 == 256

dec

(dec n)
> n : Nat
> Nat

Decrements a natural number by 1. Returns 0 if the input is 0.

dec 0      == 0
dec 1 == 0
dec 5 == 4
dec 256 == 255

add

(add x y)
> x : Nat
> y : Nat
> Nat

Adds two natural numbers.

add 3 4      == 7
add 0 5 == 5
add 255 1 == 256

sub

(sub x y)
> x : Nat
> y : Nat
> Nat

Subtracts one natural number from another. Returns 0 if the result would be negative.

sub 5 3      == 2
sub 3 5 == 0
sub 0 1 == 0
sub 256 1 == 255

mod

(mod x y)
> x : Nat
> y : Nat
> Nat

Calculates the modulus of two natural numbers.

mod 7 3     == 1
mod 6 3 == 0
mod 5 10 == 5
mod 0 5 == 0

mul

(mul x y)
> x : Nat
> y : Nat
> Nat

Multiplies two natural numbers.

mul 3 4      == 12
mul 0 5 == 0
mul 255 2 == 510

div

(div x y)
> x : Nat
> y : Nat
> Nat

Performs integer division on two natural numbers. Division by zero returns 0.

div 6 3     == 2
div 7 3 == 2
div 5 10 == 0
div 5 0 == 0

divMod

(divMod x y)
> x : Nat
> y : Nat
> SOME

Performs both division and modulus in one operation. Returns a tuple of (quotient, remainder).

divMod 7 3     == (0 2 1)
divMod 6 3 == (0 2 0)
divMod 5 10 == (0 0 5)
divMod 5 0 ; Division by zero, this will crash the REPL

isOne

(isOne n)
> x : Nat
> Nat

Checks if a natural number is equal to 1.

isOne 1    == 1
isOne 0 == 0
isOne 2 == 0

Bitwise Operations

lsh

(lsh x y)
> x : Nat
> y : Nat
> Nat

Left-shifts a natural number by a given amount.

lsh 1 3    == 8     ; 1 << 3 = 8
lsh 5 2 == 20 ; 5 << 2 = 20
lsh 8 1 == 16 ; 8 << 1 = 16

rsh

(rsh x y)
> x : Nat
> y : Nat
> Nat

Right-shifts a natural number by a given amount.

rsh 8 3     == 1    ; 8 >> 3 = 1
rsh 20 2 == 5 ; 20 >> 2 = 5
rsh 16 1 == 8 ; 16 >> 1 = 8

con

(con x y)
> x : Nat
> y : Nat
> Nat

Performs a bitwise AND operation on two natural numbers.

con 5 3      == 1    ; 0101 & 0011 = 0001
con 12 10 == 8 ; 1100 & 1010 = 1000
con 15 7 == 7 ; 1111 & 0111 = 0111

mix

(mix x y)
> x : Nat
> y : Nat
> Nat

Performs a bitwise XOR operation on two natural numbers.

mix 5 3      == 6    ; 0101 ^ 0011 = 0110
mix 12 10 == 6 ; 1100 ^ 1010 = 0110
mix 15 7 == 8 ; 1111 ^ 0111 = 1000

dis

(dis x y)
> x : Nat
> y : Nat
> Nat

Performs a bitwise OR operation on two natural numbers.

dis 5 3      == 7     ; 0101 | 0011 = 0111
dis 12 10 == 14 ; 1100 | 1010 = 1110
dis 15 7 == 15 ; 1111 | 0111 = 1111

pow

(pow b p)
> b : Nat
> p : Nat
> Nat

Raises a base to a power.

pow 2 3    == 8
pow 3 2 == 9
pow 5 0 == 1
pow 0 5 == 0

bex

(bex p)
> p : Nat
> Nat

Calculates 2 raised to a given power.

bex 3    == 8     ; 2^3 = 8
bex 5 == 32 ; 2^5 = 32
bex 0 == 1 ; 2^0 = 1

bix

(bix i n)
> i : Nat
> n : Nat
> Nat

Extracts a specific bit from a natural number.

bix 0 8    == 0    ; Least significant bit of 8 (1000) is 0
bix 3 8 == 1 ; 4th bit of 8 (1000) is 1
bix 2 7 == 1 ; 3rd bit of 7 (0111) is 1

natEql

(natEql x y)
> x : Nat
> y : Nat
> Bool

Checks if two natural numbers are equal.

natEql 5 5     == 1    ; TRUE
natEql 3 5 == 0 ; FALSE
natEql 0 0 == 1 ; TRUE

natCmp

(natCmp x y)
> x : Nat
> y : Nat
> Nat

Compares two natural numbers, returning an ordering result.

natCmp 3 5    == 0    ; LT
natCmp 5 3 == 2 ; GT
natCmp 4 4 == 1 ; EQ

Advanced Bitwise Operations

bitwise

(bitwise f x y)
> f : (Nat > Nat > Nat)
> x : Nat
> y : Nat
> Nat

Applies a bitwise operation to two natural numbers.

bitwise and 5 3    == 1    ; 0101 & 0011 = 0001
bitwise or 5 3 == 7 ; 0101 | 0011 = 0111
bitwise xor 5 3 == 6 ; 0101 ^ 0011 = 0110

natFold

(natFold f z n)
> f : (a > Nat > a)
> z : a
> n : Nat
> a

Folds a function over the bits of a natural number.

natFold add 0 5     == 2    ; Sum of bits in 5 (0101)
natFold or 0 10 == 1 ; OR of all bits in 10 (1010)

met

(met n)
> n : Nat
> Nat

Calculates the number of bits required to represent a natural number.

met 0      == 0
met 1 == 1
met 7 == 3
met 8 == 4
met 255 == 8
met 256 == 9

popCount

(popCount n)
> n : Nat
> Nat

Counts the number of set bits in a natural number.

popCount 0     == 0
popCount 1 == 1
popCount 7 == 3 ; 0111 has 3 set bits
popCount 15 == 4 ; 1111 has 4 set bits

trunc

(trunc w n)
> w : Nat
> n : Nat
> Nat

Truncates a natural number to a given bit width.

trunc 3 13    == 5
trunc 2 7 == 3 ; 7 (111) truncated to 2 bits is 3 (11)
trunc 4 15 == 15 ; 15 (1111) truncated to 4 bits is still 15

bitSlice

(bitSlice o w n)
> o : Nat
> w : Nat
> n : Nat
> Nat

Extracts a slice of bits from a natural number.

bitSlice 0 3 13    == 5
bitSlice 1 2 13 == 2 ; Bits 1-2 of 13 (1101) is 2 (10)
bitSlice 2 2 13 == 3 ; Bits 2-3 of 13 (1101) is 3 (11)

setBit

(setBit i n)
> i : Nat
> n : Nat
> Nat

Sets a specific bit in a natural number.

setBit 0 4    == 5
setBit 2 1 == 5 ; Set 3rd bit of 1 (001) to get 5 (101)
setBit 1 6 == 6 ; Setting already-set bit changes nothing

clearBit

(clearBit i n)
> i : Nat
> n : Nat
> Nat

Clears a specific bit in a natural number.

clearBit 0 5    == 4
clearBit 2 7 == 3 ; Clear 3rd bit of 7 (111) to get 3 (011)
clearBit 1 4 == 4 ; Clearing already-clear bit changes nothing

testBit

(testBit i n)
> i : Nat
> n : Nat
> Nat

Tests if a specific bit is set in a natural number.

testBit 0 5    == 1
testBit 1 5 == 0 ; 2nd bit of 5 (101) is not set
testBit 2 5 == 1 ; 3rd bit of 5 (101) is set

Miscellaneous

roundUp

(roundUp x y)
> x : Nat
> y : Nat
> Nat

Rounds a number up to the nearest multiple of another number.

```sire
roundUp 5 3 == 6
roundUp 6 3 == 6
roundUp 7 3 == 9
roundUp 0 3 == 0

even

(even n)
> n : Nat
> Bool

Checks if a natural number is even.

even 0     == 1
even 1 == 0
even 2 == 1
even 15 == 0

odd

(odd n)
> n : Nat
> Bool

Checks if a natural number is odd.

odd 0     == 0
odd 1 == 1
odd 2 == 0
odd 15 == 1