equal
deleted
inserted
replaced
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 |