36 "0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1" |
36 "0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1" |
37 by presburger |
37 by presburger |
38 |
38 |
39 lemma neq_one_mod_two [simp, presburger]: |
39 lemma neq_one_mod_two [simp, presburger]: |
40 "((x::int) mod 2 ~= 0) = (x mod 2 = 1)" by presburger |
40 "((x::int) mod 2 ~= 0) = (x mod 2 = 1)" by presburger |
|
41 |
41 |
42 |
42 subsection {* Behavior under integer arithmetic operations *} |
43 subsection {* Behavior under integer arithmetic operations *} |
43 |
44 |
44 lemma even_times_anything: "even (x::int) ==> even (x * y)" |
45 lemma even_times_anything: "even (x::int) ==> even (x * y)" |
45 by (simp add: even_def zmod_zmult1_eq') |
46 by (simp add: even_def zmod_zmult1_eq') |
308 lemma power_minus_odd [simp]: "odd n ==> |
310 lemma power_minus_odd [simp]: "odd n ==> |
309 (- x)^n = - (x^n::'a::{recpower,comm_ring_1})" |
311 (- x)^n = - (x^n::'a::{recpower,comm_ring_1})" |
310 apply (subst power_minus) |
312 apply (subst power_minus) |
311 apply simp |
313 apply simp |
312 done |
314 done |
|
315 |
|
316 |
|
317 subsection {* General Lemmas About Division *} |
|
318 |
|
319 lemma Suc_times_mod_eq: "1<k ==> Suc (k * m) mod k = 1" |
|
320 apply (induct "m") |
|
321 apply (simp_all add: mod_Suc) |
|
322 done |
|
323 |
|
324 declare Suc_times_mod_eq [of "number_of w", standard, simp] |
|
325 |
|
326 lemma [simp]: "n div k \<le> (Suc n) div k" |
|
327 by (simp add: div_le_mono) |
|
328 |
|
329 lemma Suc_n_div_2_gt_zero [simp]: "(0::nat) < n ==> 0 < (n + 1) div 2" |
|
330 by arith |
|
331 |
|
332 lemma div_2_gt_zero [simp]: "(1::nat) < n ==> 0 < n div 2" |
|
333 by arith |
|
334 |
|
335 lemma mod_mult_self3 [simp]: "(k*n + m) mod n = m mod (n::nat)" |
|
336 by (simp add: mult_ac add_ac) |
|
337 |
|
338 lemma mod_mult_self4 [simp]: "Suc (k*n + m) mod n = Suc m mod n" |
|
339 proof - |
|
340 have "Suc (k * n + m) mod n = (k * n + Suc m) mod n" by simp |
|
341 also have "... = Suc m mod n" by (rule mod_mult_self3) |
|
342 finally show ?thesis . |
|
343 qed |
|
344 |
|
345 lemma mod_Suc_eq_Suc_mod: "Suc m mod n = Suc (m mod n) mod n" |
|
346 apply (subst mod_Suc [of m]) |
|
347 apply (subst mod_Suc [of "m mod n"], simp) |
|
348 done |
|
349 |
|
350 |
|
351 subsection {* More Even/Odd Results *} |
|
352 |
|
353 lemma even_mult_two_ex: "even(n) = (\<exists>m::nat. n = 2*m)" |
|
354 by (simp add: even_nat_equiv_def2 numeral_2_eq_2) |
|
355 |
|
356 lemma odd_Suc_mult_two_ex: "odd(n) = (\<exists>m. n = Suc (2*m))" |
|
357 by (simp add: odd_nat_equiv_def2 numeral_2_eq_2) |
|
358 |
|
359 lemma even_add [simp]: "even(m + n::nat) = (even m = even n)" |
|
360 by auto |
|
361 |
|
362 lemma odd_add [simp]: "odd(m + n::nat) = (odd m \<noteq> odd n)" |
|
363 by auto |
|
364 |
|
365 lemma div_Suc: "Suc a div c = a div c + Suc 0 div c + |
|
366 (a mod c + Suc 0 mod c) div c" |
|
367 apply (subgoal_tac "Suc a = a + Suc 0") |
|
368 apply (erule ssubst) |
|
369 apply (rule div_add1_eq, simp) |
|
370 done |
|
371 |
|
372 lemma lemma_even_div2 [simp]: "even (n::nat) ==> (n + 1) div 2 = n div 2" |
|
373 apply (simp add: numeral_2_eq_2) |
|
374 apply (subst div_Suc) |
|
375 apply (simp add: even_nat_mod_two_eq_zero) |
|
376 done |
|
377 |
|
378 lemma lemma_not_even_div2 [simp]: "~even n ==> (n + 1) div 2 = Suc (n div 2)" |
|
379 apply (simp add: numeral_2_eq_2) |
|
380 apply (subst div_Suc) |
|
381 apply (simp add: odd_nat_mod_two_eq_one) |
|
382 done |
|
383 |
|
384 lemma even_num_iff: "0 < n ==> even n = (~ even(n - 1 :: nat))" |
|
385 by (case_tac "n", auto) |
|
386 |
|
387 lemma even_even_mod_4_iff: "even (n::nat) = even (n mod 4)" |
|
388 apply (induct n, simp) |
|
389 apply (subst mod_Suc, simp) |
|
390 done |
|
391 |
|
392 lemma lemma_odd_mod_4_div_2: "n mod 4 = (3::nat) ==> odd((n - 1) div 2)" |
|
393 apply (rule_tac t = n and n1 = 4 in mod_div_equality [THEN subst]) |
|
394 apply (simp add: even_num_iff) |
|
395 done |
|
396 |
|
397 lemma lemma_even_mod_4_div_2: "n mod 4 = (1::nat) ==> even ((n - 1) div 2)" |
|
398 by (rule_tac t = n and n1 = 4 in mod_div_equality [THEN subst], simp) |
313 |
399 |
314 |
400 |
315 text {* Simplify, when the exponent is a numeral *} |
401 text {* Simplify, when the exponent is a numeral *} |
316 |
402 |
317 lemmas power_0_left_number_of = power_0_left [of "number_of w", standard] |
403 lemmas power_0_left_number_of = power_0_left [of "number_of w", standard] |
360 qed |
446 qed |
361 |
447 |
362 |
448 |
363 subsection {* Miscellaneous *} |
449 subsection {* Miscellaneous *} |
364 |
450 |
|
451 lemma odd_pos: "odd (n::nat) \<Longrightarrow> 0 < n" |
|
452 by (cases n, simp_all) |
|
453 |
365 lemma [presburger]:"(x + 1) div 2 = x div 2 \<longleftrightarrow> even (x::int)" by presburger |
454 lemma [presburger]:"(x + 1) div 2 = x div 2 \<longleftrightarrow> even (x::int)" by presburger |
366 lemma [presburger]: "(x + 1) div 2 = x div 2 + 1 \<longleftrightarrow> odd (x::int)" by presburger |
455 lemma [presburger]: "(x + 1) div 2 = x div 2 + 1 \<longleftrightarrow> odd (x::int)" by presburger |
367 lemma even_plus_one_div_two: "even (x::int) ==> (x + 1) div 2 = x div 2" by presburger |
456 lemma even_plus_one_div_two: "even (x::int) ==> (x + 1) div 2 = x div 2" by presburger |
368 lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1" by presburger |
457 lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1" by presburger |
369 |
458 |
370 lemma div_Suc: "Suc a div c = a div c + Suc 0 div c + |
|
371 (a mod c + Suc 0 mod c) div c" |
|
372 apply (subgoal_tac "Suc a = a + Suc 0") |
|
373 apply (erule ssubst) |
|
374 apply (rule div_add1_eq, simp) |
|
375 done |
|
376 |
|
377 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger |
459 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger |
378 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger |
460 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger |
379 lemma even_nat_plus_one_div_two: "even (x::nat) ==> |
461 lemma even_nat_plus_one_div_two: "even (x::nat) ==> |
380 (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" by presburger |
462 (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" by presburger |
381 |
463 |