src/ZF/ArithSimp.thy
changeset 13356 c9cfe1638bf2
parent 13328 703de709a64b
child 13611 2edf034c902a
equal deleted inserted replaced
13355:d19cdbd8b559 13356:c9cfe1638bf2
     8 header{*Arithmetic with simplification*}
     8 header{*Arithmetic with simplification*}
     9 
     9 
    10 theory ArithSimp = Arith
    10 theory ArithSimp = Arith
    11 files "arith_data.ML":
    11 files "arith_data.ML":
    12 
    12 
    13 (*** Difference ***)
    13 subsection{*Difference*}
    14 
    14 
    15 lemma diff_self_eq_0: "m #- m = 0"
    15 lemma diff_self_eq_0: "m #- m = 0"
    16 apply (subgoal_tac "natify (m) #- natify (m) = 0")
    16 apply (subgoal_tac "natify (m) #- natify (m) = 0")
    17 apply (rule_tac [2] natify_in_nat [THEN nat_induct], auto)
    17 apply (rule_tac [2] natify_in_nat [THEN nat_induct], auto)
    18 done
    18 done
    58 lemma diff_mult_distrib2: "k #* (m #- n) = (k #* m) #- (k #* n)"
    58 lemma diff_mult_distrib2: "k #* (m #- n) = (k #* m) #- (k #* n)"
    59 apply (simp (no_asm) add: mult_commute [of k] diff_mult_distrib)
    59 apply (simp (no_asm) add: mult_commute [of k] diff_mult_distrib)
    60 done
    60 done
    61 
    61 
    62 
    62 
    63 (*** Remainder ***)
    63 subsection{*Remainder*}
    64 
    64 
    65 (*We need m:nat even with natify*)
    65 (*We need m:nat even with natify*)
    66 lemma div_termination: "[| 0<n;  n le m;  m:nat |] ==> m #- n < m"
    66 lemma div_termination: "[| 0<n;  n le m;  m:nat |] ==> m #- n < m"
    67 apply (frule lt_nat_in_nat, erule nat_succI)
    67 apply (frule lt_nat_in_nat, erule nat_succI)
    68 apply (erule rev_mp)
    68 apply (erule rev_mp)
   129  apply (simp add: DIVISION_BY_ZERO_MOD)
   129  apply (simp add: DIVISION_BY_ZERO_MOD)
   130 apply (simp add: mod_def raw_mod_geq nat_into_Ord [THEN Ord_0_lt_iff])
   130 apply (simp add: mod_def raw_mod_geq nat_into_Ord [THEN Ord_0_lt_iff])
   131 done
   131 done
   132 
   132 
   133 
   133 
   134 (*** Division ***)
   134 subsection{*Division*}
   135 
   135 
   136 lemma raw_div_type: "[| m:nat;  n:nat |] ==> raw_div (m, n) : nat"
   136 lemma raw_div_type: "[| m:nat;  n:nat |] ==> raw_div (m, n) : nat"
   137 apply (unfold raw_div_def)
   137 apply (unfold raw_div_def)
   138 apply (rule Ord_transrec_type)
   138 apply (rule Ord_transrec_type)
   139 apply (auto simp add: nat_into_Ord [THEN Ord_0_lt_iff])
   139 apply (auto simp add: nat_into_Ord [THEN Ord_0_lt_iff])
   194 lemma mod_div_equality: "m: nat ==> (m div n)#*n #+ m mod n = m"
   194 lemma mod_div_equality: "m: nat ==> (m div n)#*n #+ m mod n = m"
   195 apply (simp (no_asm_simp) add: mod_div_equality_natify)
   195 apply (simp (no_asm_simp) add: mod_div_equality_natify)
   196 done
   196 done
   197 
   197 
   198 
   198 
   199 (*** Further facts about mod (mainly for mutilated chess board) ***)
   199 subsection{*Further Facts about Remainder*}
       
   200 
       
   201 text{*(mainly for mutilated chess board)*}
   200 
   202 
   201 lemma mod_succ_lemma:
   203 lemma mod_succ_lemma:
   202      "[| 0<n;  m:nat;  n:nat |]  
   204      "[| 0<n;  m:nat;  n:nat |]  
   203       ==> succ(m) mod n = (if succ(m mod n) = n then 0 else succ(m mod n))"
   205       ==> succ(m) mod n = (if succ(m mod n) = n then 0 else succ(m mod n))"
   204 apply (erule complete_induct)
   206 apply (erule complete_induct)
   256 
   258 
   257 lemma mod2_add_self [simp]: "(m#+m) mod 2 = 0"
   259 lemma mod2_add_self [simp]: "(m#+m) mod 2 = 0"
   258 by (cut_tac n = "0" in mod2_add_more, auto)
   260 by (cut_tac n = "0" in mod2_add_more, auto)
   259 
   261 
   260 
   262 
   261 (**** Additional theorems about "le" ****)
   263 subsection{*Additional theorems about @{text "\<le>"}*}
   262 
   264 
   263 lemma add_le_self: "m:nat ==> m le (m #+ n)"
   265 lemma add_le_self: "m:nat ==> m le (m #+ n)"
   264 apply (simp (no_asm_simp))
   266 apply (simp (no_asm_simp))
   265 done
   267 done
   266 
   268 
   331 apply (cut_tac m = "natify (m) " and n = "natify (n) " in mult_is_zero)
   333 apply (cut_tac m = "natify (m) " and n = "natify (n) " in mult_is_zero)
   332 apply auto
   334 apply auto
   333 done
   335 done
   334 
   336 
   335 
   337 
   336 (** Cancellation laws for common factors in comparisons **)
   338 subsection{*Cancellation Laws for Common Factors in Comparisons*}
   337 
   339 
   338 lemma mult_less_cancel_lemma:
   340 lemma mult_less_cancel_lemma:
   339      "[| k: nat; m: nat; n: nat |] ==> (m#*k < n#*k) <-> (0<k & m<n)"
   341      "[| k: nat; m: nat; n: nat |] ==> (m#*k < n#*k) <-> (0<k & m<n)"
   340 apply (safe intro!: mult_lt_mono1)
   342 apply (safe intro!: mult_lt_mono1)
   341 apply (erule natE, auto)
   343 apply (erule natE, auto)
   406        in div_cancel_raw)
   408        in div_cancel_raw)
   407 apply auto
   409 apply auto
   408 done
   410 done
   409 
   411 
   410 
   412 
   411 (** Distributive law for remainder (mod) **)
   413 subsection{*More Lemmas about Remainder*}
   412 
   414 
   413 lemma mult_mod_distrib_raw:
   415 lemma mult_mod_distrib_raw:
   414      "[| k:nat; m:nat; n:nat |] ==> (k#*m) mod (k#*n) = k #* (m mod n)"
   416      "[| k:nat; m:nat; n:nat |] ==> (k#*m) mod (k#*n) = k #* (m mod n)"
   415 apply (case_tac "k=0")
   417 apply (case_tac "k=0")
   416  apply (simp add: DIVISION_BY_ZERO_MOD)
   418  apply (simp add: DIVISION_BY_ZERO_MOD)
   490 
   492 
   491 lemma less_iff_succ_add:
   493 lemma less_iff_succ_add:
   492      "[| m: nat; n: nat |] ==> (m<n) <-> (EX k: nat. n = succ(m#+k))"
   494      "[| m: nat; n: nat |] ==> (m<n) <-> (EX k: nat. n = succ(m#+k))"
   493 by (auto intro: less_imp_succ_add)
   495 by (auto intro: less_imp_succ_add)
   494 
   496 
   495 (* on nat *)
   497 
       
   498 subsubsection{*More Lemmas About Difference*}
   496 
   499 
   497 lemma diff_is_0_lemma:
   500 lemma diff_is_0_lemma:
   498      "[| m: nat; n: nat |] ==> m #- n = 0 <-> m le n"
   501      "[| m: nat; n: nat |] ==> m #- n = 0 <-> m le n"
   499 apply (rule_tac m = "m" and n = "n" in diff_induct, simp_all)
   502 apply (rule_tac m = "m" and n = "n" in diff_induct, simp_all)
   500 done
   503 done