equal
deleted
inserted
replaced
12 class even_odd = semiring_div_parity |
12 class even_odd = semiring_div_parity |
13 begin |
13 begin |
14 |
14 |
15 definition even :: "'a \<Rightarrow> bool" |
15 definition even :: "'a \<Rightarrow> bool" |
16 where |
16 where |
17 even_def [presburger]: "even a \<longleftrightarrow> a mod 2 = 0" |
17 [algebra]: "even a \<longleftrightarrow> 2 dvd a" |
18 |
18 |
19 lemma even_iff_2_dvd [algebra]: |
19 lemmas even_iff_2_dvd = even_def |
20 "even a \<longleftrightarrow> 2 dvd a" |
20 |
|
21 lemma even_iff_mod_2_eq_zero [presburger]: |
|
22 "even a \<longleftrightarrow> a mod 2 = 0" |
21 by (simp add: even_def dvd_eq_mod_eq_0) |
23 by (simp add: even_def dvd_eq_mod_eq_0) |
22 |
24 |
23 lemma even_zero [simp]: |
25 lemma even_zero [simp]: |
24 "even 0" |
26 "even 0" |
25 by (simp add: even_def) |
27 by (simp add: even_iff_mod_2_eq_zero) |
26 |
28 |
27 lemma even_times_anything: |
29 lemma even_times_anything: |
28 "even a \<Longrightarrow> even (a * b)" |
30 "even a \<Longrightarrow> even (a * b)" |
29 by (simp add: even_iff_2_dvd) |
31 by (simp add: even_iff_2_dvd) |
30 |
32 |
36 where |
38 where |
37 "odd a \<equiv> \<not> even a" |
39 "odd a \<equiv> \<not> even a" |
38 |
40 |
39 lemma odd_times_odd: |
41 lemma odd_times_odd: |
40 "odd a \<Longrightarrow> odd b \<Longrightarrow> odd (a * b)" |
42 "odd a \<Longrightarrow> odd b \<Longrightarrow> odd (a * b)" |
41 by (auto simp add: even_def mod_mult_left_eq) |
43 by (auto simp add: even_iff_mod_2_eq_zero mod_mult_left_eq) |
42 |
44 |
43 lemma even_product [simp, presburger]: |
45 lemma even_product [simp, presburger]: |
44 "even (a * b) \<longleftrightarrow> even a \<or> even b" |
46 "even (a * b) \<longleftrightarrow> even a \<or> even b" |
45 apply (auto simp add: even_times_anything anything_times_even) |
47 apply (auto simp add: even_times_anything anything_times_even) |
46 apply (rule ccontr) |
48 apply (rule ccontr) |
51 |
53 |
52 instance nat and int :: even_odd .. |
54 instance nat and int :: even_odd .. |
53 |
55 |
54 lemma even_nat_def [presburger]: |
56 lemma even_nat_def [presburger]: |
55 "even x \<longleftrightarrow> even (int x)" |
57 "even x \<longleftrightarrow> even (int x)" |
56 by (auto simp add: even_def int_eq_iff int_mult nat_mult_distrib) |
58 by (auto simp add: even_iff_mod_2_eq_zero int_eq_iff int_mult nat_mult_distrib) |
57 |
59 |
58 lemma transfer_int_nat_relations: |
60 lemma transfer_int_nat_relations: |
59 "even (int x) \<longleftrightarrow> even x" |
61 "even (int x) \<longleftrightarrow> even x" |
60 by (simp add: even_nat_def) |
62 by (simp add: even_nat_def) |
61 |
63 |
70 lemma odd_1_nat [simp]: |
72 lemma odd_1_nat [simp]: |
71 "odd (1::nat)" |
73 "odd (1::nat)" |
72 by presburger |
74 by presburger |
73 |
75 |
74 lemma even_numeral_int [simp]: "even (numeral (Num.Bit0 k) :: int)" |
76 lemma even_numeral_int [simp]: "even (numeral (Num.Bit0 k) :: int)" |
75 unfolding even_def by simp |
77 unfolding even_iff_mod_2_eq_zero by simp |
76 |
78 |
77 lemma odd_numeral_int [simp]: "odd (numeral (Num.Bit1 k) :: int)" |
79 lemma odd_numeral_int [simp]: "odd (numeral (Num.Bit1 k) :: int)" |
78 unfolding even_def by simp |
80 unfolding even_iff_mod_2_eq_zero by simp |
79 |
81 |
80 (* TODO: proper simp rules for Num.Bit0, Num.Bit1 *) |
82 (* TODO: proper simp rules for Num.Bit0, Num.Bit1 *) |
81 declare even_def [of "- numeral v", simp] for v |
83 declare even_iff_mod_2_eq_zero [of "- numeral v", simp] for v |
82 |
84 |
83 lemma even_numeral_nat [simp]: "even (numeral (Num.Bit0 k) :: nat)" |
85 lemma even_numeral_nat [simp]: "even (numeral (Num.Bit0 k) :: nat)" |
84 unfolding even_nat_def by simp |
86 unfolding even_nat_def by simp |
85 |
87 |
86 lemma odd_numeral_nat [simp]: "odd (numeral (Num.Bit1 k) :: nat)" |
88 lemma odd_numeral_nat [simp]: "odd (numeral (Num.Bit1 k) :: nat)" |