18 |
18 |
19 instance int :: even_odd |
19 instance int :: even_odd |
20 even_def: "even x \<equiv> x mod 2 = 0" .. |
20 even_def: "even x \<equiv> x mod 2 = 0" .. |
21 |
21 |
22 instance nat :: even_odd |
22 instance nat :: even_odd |
23 even_nat_def: "even x \<equiv> even (int x)" .. |
23 even_nat_def: "even x \<equiv> even (int_of_nat x)" .. |
24 |
24 |
25 |
25 |
26 subsection {* Even and odd are mutually exclusive *} |
26 subsection {* Even and odd are mutually exclusive *} |
27 |
27 |
28 lemma int_pos_lt_two_imp_zero_or_one: |
28 lemma int_pos_lt_two_imp_zero_or_one: |
133 |
133 |
134 lemma pos_int_even_equiv_nat_even: "0 \<le> x ==> even x = even (nat x)" |
134 lemma pos_int_even_equiv_nat_even: "0 \<le> x ==> even x = even (nat x)" |
135 by (simp add: even_nat_def) |
135 by (simp add: even_nat_def) |
136 |
136 |
137 lemma even_nat_product: "even((x::nat) * y) = (even x | even y)" |
137 lemma even_nat_product: "even((x::nat) * y) = (even x | even y)" |
138 by (simp add: even_nat_def int_mult) |
138 by (simp add: even_nat_def) |
139 |
139 |
140 lemma even_nat_sum: "even ((x::nat) + y) = |
140 lemma even_nat_sum: "even ((x::nat) + y) = |
141 ((even x & even y) | (odd x & odd y))" |
141 ((even x & even y) | (odd x & odd y))" |
142 by (unfold even_nat_def, simp) |
142 by (unfold even_nat_def, simp) |
143 |
143 |
144 lemma even_nat_difference: |
144 lemma even_nat_difference: |
145 "even ((x::nat) - y) = (x < y | (even x & even y) | (odd x & odd y))" |
145 "even ((x::nat) - y) = (x < y | (even x & even y) | (odd x & odd y))" |
146 apply (auto simp add: even_nat_def zdiff_int [symmetric]) |
146 apply (auto simp add: even_nat_def) |
147 apply (case_tac "x < y", auto simp add: zdiff_int [symmetric]) |
147 apply (case_tac "x < y", auto) |
148 apply (case_tac "x < y", auto simp add: zdiff_int [symmetric]) |
148 apply (case_tac "x < y", auto) |
149 done |
149 done |
150 |
150 |
151 lemma even_nat_Suc: "even (Suc x) = odd x" |
151 lemma even_nat_Suc: "even (Suc x) = odd x" |
152 by (simp add: even_nat_def) |
152 by (simp add: even_nat_def) |
153 |
153 |
154 lemma even_nat_power: "even ((x::nat)^y) = (even x & 0 < y)" |
154 lemma even_nat_power: "even ((x::nat)^y) = (even x & 0 < y)" |
155 by (simp add: even_nat_def int_power) |
155 by (simp add: even_nat_def of_nat_power) |
156 |
156 |
157 lemma even_nat_zero: "even (0::nat)" |
157 lemma even_nat_zero: "even (0::nat)" |
158 by (simp add: even_nat_def) |
158 by (simp add: even_nat_def) |
159 |
159 |
160 lemmas even_odd_nat_simps [simp] = even_nat_def[of "number_of v",standard] |
160 lemmas even_odd_nat_simps [simp] = even_nat_def[of "number_of v",standard] |