src/HOL/Power.thy
changeset 25134 3d4953e88449
parent 25062 af5ef0d4d655
child 25162 ad4d5365d9d8
equal deleted inserted replaced
25133:b933700f0384 25134:3d4953e88449
   138 apply (auto simp add: mult_strict_mono zero_le_power power_Suc
   138 apply (auto simp add: mult_strict_mono zero_le_power power_Suc
   139                       order_le_less_trans [of 0 a b])
   139                       order_le_less_trans [of 0 a b])
   140 done
   140 done
   141 
   141 
   142 lemma power_eq_0_iff [simp]:
   142 lemma power_eq_0_iff [simp]:
   143      "(a^n = 0) = (a = (0::'a::{ring_1_no_zero_divisors,recpower}) & 0<n)"
   143   "(a^n = 0) = (a = (0::'a::{ring_1_no_zero_divisors,recpower}) & n\<noteq>0)"
   144 apply (induct "n")
   144 apply (induct "n")
   145 apply (auto simp add: power_Suc zero_neq_one [THEN not_sym])
   145 apply (auto simp add: power_Suc zero_neq_one [THEN not_sym])
   146 done
   146 done
   147 
   147 
   148 lemma field_power_eq_0_iff:
   148 lemma field_power_not_zero:
   149      "(a^n = 0) = (a = (0::'a::{division_ring,recpower}) & 0<n)"
   149   "a \<noteq> (0::'a::{ring_1_no_zero_divisors,recpower}) ==> a^n \<noteq> 0"
   150 by simp (* TODO: delete *)
       
   151 
       
   152 lemma field_power_not_zero: "a \<noteq> (0::'a::{ring_1_no_zero_divisors,recpower}) ==> a^n \<noteq> 0"
       
   153 by force
   150 by force
   154 
   151 
   155 lemma nonzero_power_inverse:
   152 lemma nonzero_power_inverse:
   156   fixes a :: "'a::{division_ring,recpower}"
   153   fixes a :: "'a::{division_ring,recpower}"
   157   shows "a \<noteq> 0 ==> inverse (a ^ n) = (inverse a) ^ n"
   154   shows "a \<noteq> 0 ==> inverse (a ^ n) = (inverse a) ^ n"
   277 apply (rule mult_strict_mono)
   274 apply (rule mult_strict_mono)
   278 apply (auto simp add: order_less_trans [OF zero_less_one] zero_le_power
   275 apply (auto simp add: order_less_trans [OF zero_less_one] zero_le_power
   279                  order_less_imp_le)
   276                  order_less_imp_le)
   280 done
   277 done
   281 
   278 
   282 lemma power_increasing_iff [simp]: 
   279 lemma power_increasing_iff [simp]:
   283      "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x \<le> b ^ y) = (x \<le> y)"
   280   "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x \<le> b ^ y) = (x \<le> y)"
   284   by (blast intro: power_le_imp_le_exp power_increasing order_less_imp_le) 
   281 by (blast intro: power_le_imp_le_exp power_increasing order_less_imp_le) 
   285 
   282 
   286 lemma power_strict_increasing_iff [simp]:
   283 lemma power_strict_increasing_iff [simp]:
   287      "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x < b ^ y) = (x < y)"
   284   "1 < (b::'a::{ordered_semidom,recpower}) ==> (b ^ x < b ^ y) = (x < y)"
   288   by (blast intro: power_less_imp_less_exp power_strict_increasing) 
   285 by (blast intro: power_less_imp_less_exp power_strict_increasing) 
   289 
   286 
   290 lemma power_le_imp_le_base:
   287 lemma power_le_imp_le_base:
   291   assumes le: "a ^ Suc n \<le> b ^ Suc n"
   288 assumes le: "a ^ Suc n \<le> b ^ Suc n"
   292       and ynonneg: "(0::'a::{ordered_semidom,recpower}) \<le> b"
   289     and ynonneg: "(0::'a::{ordered_semidom,recpower}) \<le> b"
   293   shows "a \<le> b"
   290 shows "a \<le> b"
   294  proof (rule ccontr)
   291 proof (rule ccontr)
   295    assume "~ a \<le> b"
   292   assume "~ a \<le> b"
   296    then have "b < a" by (simp only: linorder_not_le)
   293   then have "b < a" by (simp only: linorder_not_le)
   297    then have "b ^ Suc n < a ^ Suc n"
   294   then have "b ^ Suc n < a ^ Suc n"
   298      by (simp only: prems power_strict_mono)
   295     by (simp only: prems power_strict_mono)
   299    from le and this show "False"
   296   from le and this show "False"
   300       by (simp add: linorder_not_less [symmetric])
   297     by (simp add: linorder_not_less [symmetric])
   301  qed
   298 qed
   302 
   299 
   303 lemma power_less_imp_less_base:
   300 lemma power_less_imp_less_base:
   304   fixes a b :: "'a::{ordered_semidom,recpower}"
   301   fixes a b :: "'a::{ordered_semidom,recpower}"
   305   assumes less: "a ^ n < b ^ n"
   302   assumes less: "a ^ n < b ^ n"
   306   assumes nonneg: "0 \<le> b"
   303   assumes nonneg: "0 \<le> b"
   343 by (induct n, simp_all add: power_Suc of_nat_mult)
   340 by (induct n, simp_all add: power_Suc of_nat_mult)
   344 
   341 
   345 lemma nat_one_le_power [simp]: "1 \<le> i ==> Suc 0 \<le> i^n"
   342 lemma nat_one_le_power [simp]: "1 \<le> i ==> Suc 0 \<le> i^n"
   346 by (insert one_le_power [of i n], simp)
   343 by (insert one_le_power [of i n], simp)
   347 
   344 
   348 lemma nat_zero_less_power_iff [simp]: "(0 < x^n) = (x \<noteq> (0::nat) | n=0)"
   345 lemma nat_zero_less_power_iff [simp]: "(x^n = 0) = (x = (0::nat) & n\<noteq>0)"
   349 by (induct "n", auto)
   346 by (induct "n", auto)
   350 
   347 
   351 text{*Valid for the naturals, but what if @{text"0<i<1"}?
   348 text{*Valid for the naturals, but what if @{text"0<i<1"}?
   352 Premises cannot be weakened: consider the case where @{term "i=0"},
   349 Premises cannot be weakened: consider the case where @{term "i=0"},
   353 @{term "m=1"} and @{term "n=0"}.*}
   350 @{term "m=1"} and @{term "n=0"}.*}
   391 val power_inject_exp = thm"power_inject_exp";
   388 val power_inject_exp = thm"power_inject_exp";
   392 val power_less_imp_less_exp = thm"power_less_imp_less_exp";
   389 val power_less_imp_less_exp = thm"power_less_imp_less_exp";
   393 val power_mono = thm"power_mono";
   390 val power_mono = thm"power_mono";
   394 val power_strict_mono = thm"power_strict_mono";
   391 val power_strict_mono = thm"power_strict_mono";
   395 val power_eq_0_iff = thm"power_eq_0_iff";
   392 val power_eq_0_iff = thm"power_eq_0_iff";
   396 val field_power_eq_0_iff = thm"field_power_eq_0_iff";
   393 val field_power_eq_0_iff = thm"power_eq_0_iff";
   397 val field_power_not_zero = thm"field_power_not_zero";
   394 val field_power_not_zero = thm"field_power_not_zero";
   398 val power_inverse = thm"power_inverse";
   395 val power_inverse = thm"power_inverse";
   399 val nonzero_power_divide = thm"nonzero_power_divide";
   396 val nonzero_power_divide = thm"nonzero_power_divide";
   400 val power_divide = thm"power_divide";
   397 val power_divide = thm"power_divide";
   401 val power_abs = thm"power_abs";
   398 val power_abs = thm"power_abs";