src/HOL/NatBin.thy
changeset 30240 5b25fee0362c
parent 29401 94fd5dd918f5
child 30242 aea5d7fa7ef5
equal deleted inserted replaced
30239:179ff9cb160b 30240:5b25fee0362c
   157           else if v' < Int.Pls then number_of v  
   157           else if v' < Int.Pls then number_of v  
   158           else number_of (v + v'))"
   158           else number_of (v + v'))"
   159   unfolding nat_number_of_def number_of_is_id numeral_simps
   159   unfolding nat_number_of_def number_of_is_id numeral_simps
   160   by (simp add: nat_add_distrib)
   160   by (simp add: nat_add_distrib)
   161 
   161 
       
   162 lemma nat_number_of_add_1 [simp]:
       
   163   "number_of v + (1::nat) =
       
   164     (if v < Int.Pls then 1 else number_of (Int.succ v))"
       
   165   unfolding nat_number_of_def number_of_is_id numeral_simps
       
   166   by (simp add: nat_add_distrib)
       
   167 
       
   168 lemma nat_1_add_number_of [simp]:
       
   169   "(1::nat) + number_of v =
       
   170     (if v < Int.Pls then 1 else number_of (Int.succ v))"
       
   171   unfolding nat_number_of_def number_of_is_id numeral_simps
       
   172   by (simp add: nat_add_distrib)
       
   173 
       
   174 lemma nat_1_add_1 [simp]: "1 + 1 = (2::nat)"
       
   175   by (rule int_int_eq [THEN iffD1]) simp
       
   176 
   162 
   177 
   163 subsubsection{*Subtraction *}
   178 subsubsection{*Subtraction *}
   164 
   179 
   165 lemma diff_nat_eq_if:
   180 lemma diff_nat_eq_if:
   166      "nat z - nat z' =  
   181      "nat z - nat z' =  
   174      "(number_of v :: nat) - number_of v' =  
   189      "(number_of v :: nat) - number_of v' =  
   175         (if v' < Int.Pls then number_of v  
   190         (if v' < Int.Pls then number_of v  
   176          else let d = number_of (v + uminus v') in     
   191          else let d = number_of (v + uminus v') in     
   177               if neg d then 0 else nat d)"
   192               if neg d then 0 else nat d)"
   178   unfolding nat_number_of_def number_of_is_id numeral_simps neg_def
   193   unfolding nat_number_of_def number_of_is_id numeral_simps neg_def
       
   194   by auto
       
   195 
       
   196 lemma nat_number_of_diff_1 [simp]:
       
   197   "number_of v - (1::nat) =
       
   198     (if v \<le> Int.Pls then 0 else number_of (Int.pred v))"
       
   199   unfolding nat_number_of_def number_of_is_id numeral_simps
   179   by auto
   200   by auto
   180 
   201 
   181 
   202 
   182 subsubsection{*Multiplication *}
   203 subsubsection{*Multiplication *}
   183 
   204 
   360   fixes x y :: "'a::{ordered_semidom,recpower}"
   381   fixes x y :: "'a::{ordered_semidom,recpower}"
   361   shows "\<lbrakk>x\<twosuperior> = y\<twosuperior>; 0 \<le> x; 0 \<le> y\<rbrakk> \<Longrightarrow> x = y"
   382   shows "\<lbrakk>x\<twosuperior> = y\<twosuperior>; 0 \<le> x; 0 \<le> y\<rbrakk> \<Longrightarrow> x = y"
   362 unfolding numeral_2_eq_2 by (erule (2) power_eq_imp_eq_base, simp)
   383 unfolding numeral_2_eq_2 by (erule (2) power_eq_imp_eq_base, simp)
   363 
   384 
   364 lemma power_minus1_even[simp]: "(- 1) ^ (2*n) = (1::'a::{comm_ring_1,recpower})"
   385 lemma power_minus1_even[simp]: "(- 1) ^ (2*n) = (1::'a::{comm_ring_1,recpower})"
   365 apply (induct "n")
   386 proof (induct n)
   366 apply (auto simp add: power_Suc power_add)
   387   case 0 show ?case by simp
   367 done
   388 next
       
   389   case (Suc n) then show ?case by (simp add: power_Suc power_add)
       
   390 qed
       
   391 
       
   392 lemma power_minus1_odd: "(- 1) ^ Suc(2*n) = -(1::'a::{comm_ring_1,recpower})"
       
   393   by (simp add: power_Suc) 
   368 
   394 
   369 lemma power_even_eq: "(a::'a::recpower) ^ (2*n) = (a^n)^2"
   395 lemma power_even_eq: "(a::'a::recpower) ^ (2*n) = (a^n)^2"
   370 by (subst mult_commute) (simp add: power_mult)
   396 by (subst mult_commute) (simp add: power_mult)
   371 
   397 
   372 lemma power_odd_eq: "(a::int) ^ Suc(2*n) = a * (a^n)^2"
   398 lemma power_odd_eq: "(a::int) ^ Suc(2*n) = a * (a^n)^2"
   435 by (simp add: numerals)
   461 by (simp add: numerals)
   436 
   462 
   437 (* These two can be useful when m = number_of... *)
   463 (* These two can be useful when m = number_of... *)
   438 
   464 
   439 lemma add_eq_if: "(m::nat) + n = (if m=0 then n else Suc ((m - 1) + n))"
   465 lemma add_eq_if: "(m::nat) + n = (if m=0 then n else Suc ((m - 1) + n))"
   440 apply (case_tac "m")
   466   unfolding One_nat_def by (cases m) simp_all
   441 apply (simp_all add: numerals)
       
   442 done
       
   443 
   467 
   444 lemma mult_eq_if: "(m::nat) * n = (if m=0 then 0 else n + ((m - 1) * n))"
   468 lemma mult_eq_if: "(m::nat) * n = (if m=0 then 0 else n + ((m - 1) * n))"
   445 apply (case_tac "m")
   469   unfolding One_nat_def by (cases m) simp_all
   446 apply (simp_all add: numerals)
       
   447 done
       
   448 
   470 
   449 lemma power_eq_if: "(p ^ m :: nat) = (if m=0 then 1 else p * (p ^ (m - 1)))"
   471 lemma power_eq_if: "(p ^ m :: nat) = (if m=0 then 1 else p * (p ^ (m - 1)))"
   450 apply (case_tac "m")
   472   unfolding One_nat_def by (cases m) simp_all
   451 apply (simp_all add: numerals)
       
   452 done
       
   453 
   473 
   454 
   474 
   455 subsection{*Comparisons involving (0::nat) *}
   475 subsection{*Comparisons involving (0::nat) *}
   456 
   476 
   457 text{*Simplification already does @{term "n<0"}, @{term "n\<le>0"} and @{term "0\<le>n"}.*}
   477 text{*Simplification already does @{term "n<0"}, @{term "n\<le>0"} and @{term "0\<le>n"}.*}