Theory Power_int

section ‹ Integer Powers ›

theory Power_int
  imports "HOL.Real"
begin

text ‹ The standard HOL power operator is only for natural powers. This operator allows integers. ›

definition intpow :: "'a::{linordered_field}  int  'a" (infixr ^Z 80) where
"intpow x n = (if (n < 0) then inverse (x ^ nat (-n)) else (x ^ nat n))"

lemma intpow_zero [simp]: "x ^Z 0 = 1"
  by (simp add: intpow_def)

lemma intpow_spos [simp]: "x > 0  x ^Z n > 0"
  by (simp add: intpow_def)

lemma intpow_one [simp]: "x ^Z 1 = x"
  by (simp add: intpow_def)

lemma one_intpow [simp]: "1 ^Z n = 1"
  by (simp add: intpow_def)

lemma intpow_plus: "x > 0  x ^Z (m + n) = x ^Z m * x ^Z n"
  apply (simp add: intpow_def field_simps power_add)
  apply (metis (no_types, opaque_lifting) abs_ge_zero add.commute add_diff_cancel_right' nat_add_distrib power_add uminus_add_conv_diff zabs_def)
  done

lemma intpow_mult_combine: "x > 0  x ^Z m * (x ^Z n * y) = x ^Z (m + n) * y"
  by (simp add: intpow_plus)

lemma intpow_pos [simp]: "n  0  x ^Z n = x ^ nat n"
  by (simp add: intpow_def)

lemma intpow_uminus: "x ^Z -n = inverse (x ^Z n)"
  by (simp add: intpow_def)

lemma intpow_uminus_nat: "n  0  x ^Z -n = inverse (x ^ nat n)"
  by (simp add: intpow_def)

lemma intpow_inverse: "inverse a ^Z n = inverse (a ^Z n)"
  by (simp add: intpow_def power_inverse)

lemma intpow_mult_distrib: "(x * y) ^Z m = x ^Z m * y ^Z m"
  by (simp add: intpow_def power_mult_distrib)

end