fun Even(n:Int) {
  some m:Int. n = +2 * m
}

union Int {
  pos(UInt)
  negsuc(UInt)
}

fun Odd(n:Int) {
  some m:Int. n = +1 + +2 * m
}

fun abs(x:Int)

auto abs_lit

abs_lit: (all x:Nat. abs(pos(fromNat(lit(x)))) = fromNat(lit(x)))

abs_neg: (all n:Int. abs(- n) = abs(n))

add_commute_uint_int: (all x:UInt, y:Int. x + y = y + x)

dist_neg_mult: (all x:Int, y:Int. - (x * y) = - x * y)

auto div_negsuc_negsuc

div_negsuc_negsuc: (all au:UInt, bu:UInt. negsuc(au) / negsuc(bu) = pos((1 + au) / (1 + bu)))

auto div_negsuc_pos

div_negsuc_pos: (all au:UInt, bu:UInt. negsuc(au) / pos(bu) = - pos((1 + au) / bu))

auto div_negsuc_uint

div_negsuc_uint: (all au:UInt, bu:UInt. negsuc(au) / bu = - pos((1 + au) / bu))

auto div_pos_negsuc

div_pos_negsuc: (all au:UInt, bu:UInt. pos(au) / negsuc(bu) = - pos(au / (1 + bu)))

auto div_pos_pos

div_pos_pos: (all au:UInt, bu:UInt. pos(au) / pos(bu) = pos(au / bu))

auto div_pos_uint

div_pos_uint: (all au:UInt, bu:UInt. pos(au) / bu = pos(au / bu))

int_Even_iff_abs_Even: (all x:Int. (Even(x)  Even(abs(x))))

int_Even_not_Odd: (all n:Int. (Even(n)  not Odd(n)))

int_Even_or_Odd: (all n:Int. (Even(n) or Odd(n)))

int_Odd_iff_abs_Odd: (all x:Int. (Odd(x)  Odd(abs(x))))

int_add_assoc: (all x:Int, y:Int, z:Int. (x + y) + z = x + (y + z))

int_add_both_sides_of_equal: (all x:Int, y:Int, z:Int. (if x + y = x + z then y = z))

int_add_both_sides_of_equal_iff: (all x:Int, y:Int, z:Int. ((x + y = x + z)  (y = z)))

int_add_both_sides_of_equal_right: (all x:Int, y:Int, z:Int. (if y + x = z + x then y = z))

int_add_commute: (all x:Int, y:Int. x + y = y + x)

int_add_inverse: (all x:Int. x + - x = +0)

int_add_left_inverse: (all x:Int. - x + x = +0)

int_add_sub_cancel: (all x:Int, y:Int. (x + y) - y = x)

auto int_add_zero

int_add_zero: (all n:Int. n + +0 = n)

int_dist_mult_add: (all a:Int, x:Int, y:Int. a * (x + y) = a * x + a * y)

int_dist_mult_add_right: (all a:Int, x:Int, y:Int. (x + y) * a = x * a + y * a)

int_dist_mult_sub: (all a:Int, x:Int, y:Int. a * (x - y) = a * x - a * y)

int_even_add_even: (all x:Int, y:Int. (if (Even(x) and Even(y)) then Even(x + y)))

int_even_add_odd: (all x:Int, y:Int. (if (Even(x) and Odd(y)) then Odd(x + y)))

int_even_mult_left: (all x:Int, y:Int. (if Even(x) then Even(x * y)))

int_even_mult_right: (all x:Int, y:Int. (if Even(y) then Even(x * y)))

int_even_neg: (all x:Int. (Even(x)  Even(- x)))

int_even_one_odd: (all n:Int. (if Even(+1 + n) then Odd(n)))

int_less_iff_diff_pos: (all a:Int, b:Int. ((a < b)  (+0 < b - a)))

int_mult_assoc: (all x:Int, y:Int, z:Int. (x * y) * z = x * (y * z))

int_mult_commute: (all x:Int, y:Int. x * y = y * x)

auto int_mult_one

int_mult_one: (all x:Int. x * +1 = x)

auto int_mult_zero

int_mult_zero: (all x:Int. x * +0 = +0)

int_neg_injective: (all x:Int, y:Int. (if - x = - y then x = y))

int_neg_mult_left_cancel_le: (all n:Int, x:Int, y:Int. (if (n < +0 and n * x  n * y) then y  x))

int_neg_mult_left_cancel_less: (all n:Int, x:Int, y:Int. (if (n < +0 and n * x < n * y) then y < x))

int_neg_mult_mono_less_left: (all n:Int, x:Int, y:Int. (if (n < +0 and x < y) then n * y < n * x))

int_neg_mult_mono_less_right: (all n:Int, x:Int, y:Int. (if (n < +0 and x < y) then y * n < x * n))

int_neg_mult_right_cancel_le: (all n:Int, x:Int, y:Int. (if (n < +0 and x * n  y * n) then y  x))

int_neg_mult_right_cancel_less: (all n:Int, x:Int, y:Int. (if (n < +0 and x * n < y * n) then y < x))

int_negsuc_eq_pos_false: (all x:UInt, y:UInt. not (negsuc(x) = pos(y)))

int_negsuc_injective: (all x:UInt, y:UInt. (if negsuc(x) = negsuc(y) then x = y))

int_nonneg_mult_mono_le_left: (all n:Int, x:Int, y:Int. (if (+0  n and x  y) then n * x  n * y))

int_nonneg_mult_mono_le_right: (all n:Int, x:Int, y:Int. (if (+0  n and x  y) then x * n  y * n))

int_nonpos_mult_mono_le_left: (all n:Int, x:Int, y:Int. (if (n  +0 and x  y) then n * y  n * x))

int_nonpos_mult_mono_le_right: (all n:Int, x:Int, y:Int. (if (n  +0 and x  y) then y * n  x * n))

int_odd_add_even: (all x:Int, y:Int. (if (Odd(x) and Even(y)) then Odd(x + y)))

int_odd_add_odd: (all x:Int, y:Int. (if (Odd(x) and Odd(y)) then Even(x + y)))

int_odd_mult_odd: (all x:Int, y:Int. (if (Odd(x) and Odd(y)) then Odd(x * y)))

int_odd_neg: (all x:Int. (Odd(x)  Odd(- x)))

int_odd_one_even: (all n:Int. (if Odd(+1 + n) then Even(n)))

auto int_one_mult

int_one_mult: (all x:Int. +1 * x = x)

int_one_two_odd: (all n:Int. Odd(+1 + +2 * n))

int_pos_eq_negsuc_false: (all x:UInt, y:UInt. not (pos(x) = negsuc(y)))

int_pos_injective: (all x:UInt, y:UInt. (if pos(x) = pos(y) then x = y))

int_pos_mult_left_cancel_le: (all n:Int, x:Int, y:Int. (if (+0 < n and n * x  n * y) then x  y))

int_pos_mult_left_cancel_less: (all n:Int, x:Int, y:Int. (if (+0 < n and n * x < n * y) then x < y))

int_pos_mult_mono_less_left: (all n:Int, x:Int, y:Int. (if (+0 < n and x < y) then n * x < n * y))

int_pos_mult_mono_less_right: (all n:Int, x:Int, y:Int. (if (+0 < n and x < y) then x * n < y * n))

int_pos_mult_right_cancel_le: (all n:Int, x:Int, y:Int. (if (+0 < n and x * n  y * n) then x  y))

int_pos_mult_right_cancel_less: (all n:Int, x:Int, y:Int. (if (+0 < n and x * n < y * n) then x < y))

int_sub_add_cancel: (all x:Int, y:Int. (x - y) + y = x)

int_sub_cancel: (all x:Int. x - x = +0)

int_two_even: (all n:Int. Even(+2 * n))

auto int_zero_add

int_zero_add: (all n:Int. +0 + n = n)

auto int_zero_mult

int_zero_mult: (all x:Int. +0 * x = +0)

auto lit_add_lit_pos

lit_add_lit_pos: (all x:Nat, y:Nat. fromNat(lit(x)) + pos(fromNat(lit(y))) = pos(fromNat(lit(x) + lit(y))))

auto lit_add_negsuc_pos_suc

lit_add_negsuc_pos_suc: (all x:Nat, y:Nat. negsuc(fromNat(lit(suc(x)))) + pos(fromNat(lit(suc(y)))) = negsuc(fromNat(lit(x))) + pos(fromNat(lit(y))))

auto lit_add_negsuc_zero_pos_suc

lit_add_negsuc_zero_pos_suc: (all x:Nat, y:Nat. -1 + pos(fromNat(lit(suc(y)))) = pos(fromNat(lit(y))))

auto lit_add_pos_lit

lit_add_pos_lit: (all x:Nat, y:Nat. pos(fromNat(lit(x))) + fromNat(lit(y)) = pos(fromNat(lit(x) + lit(y))))

auto lit_add_pos_negsuc_suc

lit_add_pos_negsuc_suc: (all x:Nat, y:Nat. pos(fromNat(lit(suc(y)))) + negsuc(fromNat(lit(suc(x)))) = pos(fromNat(lit(y))) + negsuc(fromNat(lit(x))))

auto lit_add_pos_pos

lit_add_pos_pos: (all x:Nat, y:Nat. pos(fromNat(lit(x))) + pos(fromNat(lit(y))) = pos(fromNat(lit(x) + lit(y))))

auto lit_add_pos_suc_negsuc_zero

lit_add_pos_suc_negsuc_zero: (all x:Nat, y:Nat. pos(fromNat(lit(suc(y)))) + -1 = pos(fromNat(lit(y))))

fun max(x:Int, y:Int) {
  if x < y then
    y
  else
    x
}

fun min(x:Int, y:Int) {
  if x < y then
    x
  else
    y
}

auto mult_lit_neg_lit

mult_lit_neg_lit: (all x:Nat, y:Nat. fromNat(lit(x)) * negsuc(fromNat(lit(y))) = - pos(fromNat(lit(x)) + fromNat(lit(x)) * fromNat(lit(y))))

auto mult_lit_pos_lit

mult_lit_pos_lit: (all x:Nat, y:Nat. fromNat(lit(x)) * pos(fromNat(lit(y))) = pos(fromNat(lit(x) * lit(y))))

auto mult_neg_lit_lit

mult_neg_lit_lit: (all x:Nat, y:Nat. negsuc(fromNat(lit(x))) * fromNat(lit(y)) = - pos(fromNat(lit(y)) + fromNat(lit(y)) * fromNat(lit(x))))

auto mult_neg_lit_pos

mult_neg_lit_pos: (all x:Nat, y:Nat. negsuc(fromNat(lit(x))) * pos(fromNat(lit(y))) = - pos(fromNat(lit(y)) + fromNat(lit(y)) * fromNat(lit(x))))

auto mult_pos_lit_lit

mult_pos_lit_lit: (all x:Nat, y:Nat. pos(fromNat(lit(x))) * fromNat(lit(y)) = pos(fromNat(lit(x) * lit(y))))

auto mult_pos_lit_neg_lit

mult_pos_lit_neg_lit: (all x:Nat, y:Nat. pos(fromNat(lit(x))) * negsuc(fromNat(lit(y))) = - pos(fromNat(lit(x)) + fromNat(lit(x)) * fromNat(lit(y))))

auto mult_pos_lit_pos_lit

mult_pos_lit_pos_lit: (all x:Nat, y:Nat. pos(fromNat(lit(x))) * pos(fromNat(lit(y))) = pos(fromNat(lit(x) * lit(y))))

neg_distr_add: (all x:Int, y:Int. - (x + y) = - x + - y)

neg_involutive: (all n:Int. - (- n) = n)

auto neg_lit_suc

neg_lit_suc: (all x:Nat. - fromNat(lit(suc(x))) = negsuc(fromNat(lit(x))))

auto neg_lit_zero

neg_lit_zero: - +0 = +0

auto neg_negsuc_lit

neg_negsuc_lit: (all x:Nat. - negsuc(fromNat(lit(x))) = pos(fromNat(lit(suc(x)))))

auto neg_pos_lit_suc

neg_pos_lit_suc: (all x:Nat. - pos(fromNat(lit(suc(x)))) = negsuc(fromNat(lit(x))))

auto neg_uint_zero

neg_uint_zero: - 0 = +0

neg_zero: - +0 = +0

fun operator *(x:Int, y:Int)

fun operator *(n:UInt, m:Int)

fun operator *(n:Int, m:UInt)

fun operator +(x:Int, m:Int)

fun operator +(n:UInt, m:Int)

fun operator +(n:Int, m:UInt)

fun operator -(x:Int)

fun operator -(n:UInt)

fun operator -(n:Int, m:Int) {
  n + - m
}

fun operator -(n:UInt, m:Int)

fun operator -(n:Int, m:UInt)

fun operator -(x:UInt, y:UInt)

fun operator /(n:Int, m:Int)

fun operator /(n:Int, m:UInt)

fun operator <(a:Int, y:Int)

fun operator >(x:Int, y:Int) {
  y < x
}

fun operator ≤(a:Int, y:Int)

fun operator ≥(x:Int, y:Int) {
  y  x
}

auto sign_neg_lit

sign_neg_lit: (all x:Nat. sign(negsuc(fromNat(lit(x)))) = negative)

auto sign_pos_lit

sign_pos_lit: (all x:Nat. sign(pos(fromNat(lit(x)))) = positive)

suc_uint_monuso: (all x:UInt, y:UInt. (1 + x)  (1 + y) = x  y)