int_abs_pow: (all n:Int, k:UInt. abs(n ^ k) = abs(n) ^ k)
int_neg_one_pow_even: (all k:UInt. (if Even(k) then - +1 ^ k = +1))
int_neg_one_pow_odd: (all k:UInt. (if Odd(k) then - +1 ^ k = - +1))
auto int_one_pow
int_one_pow: (all k:UInt. +1 ^ k = +1)
int_pow_add: (all n:Int, j:UInt, k:UInt. n ^ (j + k) = n ^ j * n ^ k)
int_pow_eq_zero: (all n:Int, k:UInt. (if n ^ k = +0 then n = +0))
int_pow_mul_base: (all k:UInt, a:Int, b:Int. (a * b) ^ k = a ^ k * b ^ k)
int_pow_mul_exp: (all n:Int, j:UInt, k:UInt. n ^ (j * k) = (n ^ k) ^ j)
int_pow_neg_base_even: (all m:UInt, n:Int. - n ^ (2 * m) = n ^ (2 * m))
int_pow_neg_base_odd: (all m:UInt, n:Int. - n ^ (1 + 2 * m) = - (n ^ (1 + 2 * m)))
int_pow_neg_base_when_even: (all n:Int, k:UInt. (if Even(k) then - n ^ k = n ^ k))
int_pow_neg_base_when_odd: (all n:Int, k:UInt. (if Odd(k) then - n ^ k = - (n ^ k)))
int_pow_nonneg: (all n:Int, k:UInt. (if +0 ≤ n then +0 ≤ n ^ k))
int_pow_nonzero: (all n:Int, k:UInt. (if n ≠ +0 then n ^ k ≠ +0))
auto int_pow_one
int_pow_one: (all n:Int. n ^ 1 = n)
int_pow_one_add: (all n:Int, k:UInt. n ^ (1 + k) = n * n ^ k)
auto int_pow_pos
int_pow_pos: (all m:UInt, k:UInt. pos(m) ^ k = pos(m ^ k))
int_pow_pos_of_pos: (all n:Int, k:UInt. (if +0 < n then +0 < n ^ k))
int_pow_two: (all n:Int. n ^ 2 = n * n)
auto int_pow_zero
int_pow_zero: (all n:Int. n ^ 0 = +1)
int_zero_pow: (all k:UInt. (if 0 < k then +0 ^ k = +0))
opaque define operator ^ : (fn (Int, UInt) -> Int) = fun a:Int, b:UInt {
expt_nat(toNat(b), a)
}