int_abs_mod: (all x:Int, y:Int. abs(x % y) = abs(x) % abs(y))

int_div_mod: (all n:Int, m:Int. (if m  +0 then (n / m) * m + n % m = n))

int_div_one: (all n:Int. n / +1 = n)

int_div_self: (all n:Int. (if n  +0 then n / n = +1))

int_div_zero: (all n:Int. n / +0 = +0)

int_mod_less_abs: (all n:Int, m:Int. (if m  +0 then abs(n % m) < abs(m)))

int_mod_neg_divisor: (all n:Int, m:Int. n % - m = n % m)

int_mod_one: (all n:Int. n % +1 = +0)

int_mod_self: (all n:Int. n % n = +0)

int_mod_small: (all n:Int, m:Int. (if abs(n) < abs(m) then n % m = n))

int_mod_zero: (all n:Int. n % +0 = n)

int_zero_div: (all m:Int. +0 / m = +0)

int_zero_mod: (all m:Int. +0 % m = +0)

auto mod_negsuc_negsuc

mod_negsuc_negsuc: (all au:UInt, bu:UInt. negsuc(au) % negsuc(bu) = - pos((1 + au) % (1 + bu)))

auto mod_negsuc_pos

mod_negsuc_pos: (all au:UInt, bu:UInt. negsuc(au) % pos(bu) = - pos((1 + au) % bu))

auto mod_pos_negsuc

mod_pos_negsuc: (all au:UInt, bu:UInt. pos(au) % negsuc(bu) = pos(au % (1 + bu)))

auto mod_pos_pos

mod_pos_pos: (all au:UInt, bu:UInt. pos(au) % pos(bu) = pos(au % bu))

opaque define operator % : (fn (Int, Int) -> Int) = fun n:Int, m:Int {
      sign(n) * (abs(n) % abs(m))
    }