64 by (simp_tac (simpset() addsimps [Suc_nat_number_of]) 1); |
64 by (simp_tac (simpset() addsimps [Suc_nat_number_of]) 1); |
65 qed "Suc_numeral_1_eq_2"; |
65 qed "Suc_numeral_1_eq_2"; |
66 |
66 |
67 (** Addition **) |
67 (** Addition **) |
68 |
68 |
69 Goal "[| (#0::int) <= z; #0 <= z' |] ==> nat z + nat z' = nat (z+z')"; |
69 Goal "[| (#0::int) <= z; #0 <= z' |] ==> nat (z+z') = nat z + nat z'"; |
70 by (rtac (inj_int RS injD) 1); |
70 by (rtac (inj_int RS injD) 1); |
71 by (asm_simp_tac (simpset() addsimps [zadd_int RS sym]) 1); |
71 by (asm_simp_tac (simpset() addsimps [zadd_int RS sym]) 1); |
72 qed "add_nat_eq_nat_zadd"; |
72 qed "nat_add_distrib"; |
73 |
73 |
74 (*"neg" is used in rewrite rules for binary comparisons*) |
74 (*"neg" is used in rewrite rules for binary comparisons*) |
75 Goal "(number_of v :: nat) + number_of v' = \ |
75 Goal "(number_of v :: nat) + number_of v' = \ |
76 \ (if neg (number_of v) then number_of v' \ |
76 \ (if neg (number_of v) then number_of v' \ |
77 \ else if neg (number_of v') then number_of v \ |
77 \ else if neg (number_of v') then number_of v \ |
78 \ else number_of (bin_add v v'))"; |
78 \ else number_of (bin_add v v'))"; |
79 by (simp_tac |
79 by (simp_tac |
80 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
80 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
81 add_nat_eq_nat_zadd, number_of_add]) 1); |
81 nat_add_distrib RS sym, number_of_add]) 1); |
82 qed "add_nat_number_of"; |
82 qed "add_nat_number_of"; |
83 |
83 |
84 Addsimps [add_nat_number_of]; |
84 Addsimps [add_nat_number_of]; |
85 |
85 |
86 |
86 |
87 (** Subtraction **) |
87 (** Subtraction **) |
88 |
88 |
89 Goal "[| (#0::int) <= z'; z' <= z |] ==> nat z - nat z' = nat (z-z')"; |
89 Goal "[| (#0::int) <= z'; z' <= z |] ==> nat (z-z') = nat z - nat z'"; |
90 by (rtac (inj_int RS injD) 1); |
90 by (rtac (inj_int RS injD) 1); |
91 by (asm_simp_tac (simpset() addsimps [zdiff_int RS sym, nat_le_eq_zle]) 1); |
91 by (asm_simp_tac (simpset() addsimps [zdiff_int RS sym, nat_le_eq_zle]) 1); |
92 qed "diff_nat_eq_nat_zdiff"; |
92 qed "nat_diff_distrib"; |
93 |
93 |
94 |
94 |
95 Goal "nat z - nat z' = \ |
95 Goal "nat z - nat z' = \ |
96 \ (if neg z' then nat z \ |
96 \ (if neg z' then nat z \ |
97 \ else let d = z-z' in \ |
97 \ else let d = z-z' in \ |
98 \ if neg d then 0 else nat d)"; |
98 \ if neg d then 0 else nat d)"; |
99 by (simp_tac (simpset() addsimps [Let_def, diff_nat_eq_nat_zdiff, |
99 by (simp_tac (simpset() addsimps [Let_def, nat_diff_distrib RS sym, |
100 neg_eq_less_0, not_neg_eq_ge_0]) 1); |
100 neg_eq_less_0, not_neg_eq_ge_0]) 1); |
101 by (simp_tac (simpset() addsimps zcompare_rls@ |
101 by (simp_tac (simpset() addsimps zcompare_rls@ |
102 [diff_is_0_eq, nat_le_eq_zle]) 1); |
102 [diff_is_0_eq, nat_le_eq_zle]) 1); |
103 qed "diff_nat_eq_if"; |
103 qed "diff_nat_eq_if"; |
104 |
104 |
116 Addsimps [diff_nat_number_of]; |
116 Addsimps [diff_nat_number_of]; |
117 |
117 |
118 |
118 |
119 (** Multiplication **) |
119 (** Multiplication **) |
120 |
120 |
121 Goal "(#0::int) <= z ==> nat z * nat z' = nat (z*z')"; |
121 Goal "(#0::int) <= z ==> nat (z*z') = nat z * nat z'"; |
122 by (case_tac "#0 <= z'" 1); |
122 by (case_tac "#0 <= z'" 1); |
123 by (subgoal_tac "z'*z <= #0" 2); |
123 by (subgoal_tac "z'*z <= #0" 2); |
124 by (rtac (neg_imp_zmult_nonpos_iff RS iffD2) 3); |
124 by (rtac (neg_imp_zmult_nonpos_iff RS iffD2) 3); |
125 by (auto_tac (claset(), |
125 by (auto_tac (claset(), |
126 simpset() addsimps [zmult_commute])); |
126 simpset() addsimps [zmult_commute])); |
127 by (subgoal_tac "#0 <= z*z'" 1); |
127 by (subgoal_tac "#0 <= z*z'" 1); |
128 by (force_tac (claset() addDs [zmult_zle_mono1], simpset()) 2); |
128 by (force_tac (claset() addDs [zmult_zle_mono1], simpset()) 2); |
129 by (rtac (inj_int RS injD) 1); |
129 by (rtac (inj_int RS injD) 1); |
130 by (asm_simp_tac (simpset() addsimps [zmult_int RS sym]) 1); |
130 by (asm_simp_tac (simpset() addsimps [zmult_int RS sym]) 1); |
131 qed "mult_nat_eq_nat_zmult"; |
131 qed "nat_mult_distrib"; |
132 |
132 |
133 Goal "(number_of v :: nat) * number_of v' = \ |
133 Goal "(number_of v :: nat) * number_of v' = \ |
134 \ (if neg (number_of v) then #0 else number_of (bin_mult v v'))"; |
134 \ (if neg (number_of v) then #0 else number_of (bin_mult v v'))"; |
135 by (simp_tac |
135 by (simp_tac |
136 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
136 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
137 mult_nat_eq_nat_zmult, number_of_mult, |
137 nat_mult_distrib RS sym, number_of_mult, |
138 nat_0]) 1); |
138 nat_0]) 1); |
139 qed "mult_nat_number_of"; |
139 qed "mult_nat_number_of"; |
140 |
140 |
141 Addsimps [mult_nat_number_of]; |
141 Addsimps [mult_nat_number_of]; |
142 |
142 |
143 |
143 |
144 (** Quotient **) |
144 (** Quotient **) |
145 |
145 |
146 Goal "(#0::int) <= z ==> nat z div nat z' = nat (z div z')"; |
146 Goal "(#0::int) <= z ==> nat (z div z') = nat z div nat z'"; |
147 by (case_tac "#0 <= z'" 1); |
147 by (case_tac "#0 <= z'" 1); |
148 by (auto_tac (claset(), |
148 by (auto_tac (claset(), |
149 simpset() addsimps [div_nonneg_neg_le0, DIVISION_BY_ZERO_DIV])); |
149 simpset() addsimps [div_nonneg_neg_le0, DIVISION_BY_ZERO_DIV])); |
150 by (zdiv_undefined_case_tac "z' = #0" 1); |
150 by (zdiv_undefined_case_tac "z' = #0" 1); |
151 by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_DIV]) 1); |
151 by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_DIV]) 1); |
154 by (subgoal_tac "#0 <= int m div int m'" 1); |
154 by (subgoal_tac "#0 <= int m div int m'" 1); |
155 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, |
155 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, |
156 pos_imp_zdiv_nonneg_iff]) 2); |
156 pos_imp_zdiv_nonneg_iff]) 2); |
157 by (rtac (inj_int RS injD) 1); |
157 by (rtac (inj_int RS injD) 1); |
158 by (Asm_simp_tac 1); |
158 by (Asm_simp_tac 1); |
159 by (rtac sym 1); |
|
160 by (res_inst_tac [("r", "int (m mod m')")] quorem_div 1); |
159 by (res_inst_tac [("r", "int (m mod m')")] quorem_div 1); |
161 by (Force_tac 2); |
160 by (Force_tac 2); |
162 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, |
161 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, |
163 numeral_0_eq_0, zadd_int, zmult_int, |
162 numeral_0_eq_0, zadd_int, zmult_int, |
164 mod_less_divisor]) 1); |
163 mod_less_divisor]) 1); |
165 by (rtac (mod_div_equality RS sym RS trans) 1); |
164 by (rtac (mod_div_equality RS sym RS trans) 1); |
166 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1); |
165 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1); |
167 qed "div_nat_eq_nat_zdiv"; |
166 qed "nat_div_distrib"; |
168 |
167 |
169 Goal "(number_of v :: nat) div number_of v' = \ |
168 Goal "(number_of v :: nat) div number_of v' = \ |
170 \ (if neg (number_of v) then #0 \ |
169 \ (if neg (number_of v) then #0 \ |
171 \ else nat (number_of v div number_of v'))"; |
170 \ else nat (number_of v div number_of v'))"; |
172 by (simp_tac |
171 by (simp_tac |
173 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, |
172 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, |
174 div_nat_eq_nat_zdiv, nat_0]) 1); |
173 nat_div_distrib RS sym, nat_0]) 1); |
175 qed "div_nat_number_of"; |
174 qed "div_nat_number_of"; |
176 |
175 |
177 Addsimps [div_nat_number_of]; |
176 Addsimps [div_nat_number_of]; |
178 |
177 |
179 |
178 |
180 (** Remainder **) |
179 (** Remainder **) |
181 |
180 |
182 (*Fails if z'<0: the LHS collapses to (nat z) but the RHS doesn't*) |
181 (*Fails if z'<0: the LHS collapses to (nat z) but the RHS doesn't*) |
183 Goal "[| (#0::int) <= z; #0 <= z' |] ==> nat z mod nat z' = nat (z mod z')"; |
182 Goal "[| (#0::int) <= z; #0 <= z' |] ==> nat (z mod z') = nat z mod nat z'"; |
184 by (zdiv_undefined_case_tac "z' = #0" 1); |
183 by (zdiv_undefined_case_tac "z' = #0" 1); |
185 by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_MOD]) 1); |
184 by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_MOD]) 1); |
186 by (auto_tac (claset() addSEs [nonneg_eq_int], simpset())); |
185 by (auto_tac (claset() addSEs [nonneg_eq_int], simpset())); |
187 by (rename_tac "m m'" 1); |
186 by (rename_tac "m m'" 1); |
188 by (subgoal_tac "#0 <= int m mod int m'" 1); |
187 by (subgoal_tac "#0 <= int m mod int m'" 1); |
189 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, |
188 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, |
190 pos_mod_sign]) 2); |
189 pos_mod_sign]) 2); |
191 by (rtac (inj_int RS injD) 1); |
190 by (rtac (inj_int RS injD) 1); |
192 by (Asm_simp_tac 1); |
191 by (Asm_simp_tac 1); |
193 by (rtac sym 1); |
|
194 by (res_inst_tac [("q", "int (m div m')")] quorem_mod 1); |
192 by (res_inst_tac [("q", "int (m div m')")] quorem_mod 1); |
195 by (Force_tac 2); |
193 by (Force_tac 2); |
196 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, |
194 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, |
197 numeral_0_eq_0, zadd_int, zmult_int, |
195 numeral_0_eq_0, zadd_int, zmult_int, |
198 mod_less_divisor]) 1); |
196 mod_less_divisor]) 1); |
199 by (rtac (mod_div_equality RS sym RS trans) 1); |
197 by (rtac (mod_div_equality RS sym RS trans) 1); |
200 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1); |
198 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1); |
201 qed "mod_nat_eq_nat_zmod"; |
199 qed "nat_mod_distrib"; |
202 |
200 |
203 Goal "(number_of v :: nat) mod number_of v' = \ |
201 Goal "(number_of v :: nat) mod number_of v' = \ |
204 \ (if neg (number_of v) then #0 \ |
202 \ (if neg (number_of v) then #0 \ |
205 \ else if neg (number_of v') then number_of v \ |
203 \ else if neg (number_of v') then number_of v \ |
206 \ else nat (number_of v mod number_of v'))"; |
204 \ else nat (number_of v mod number_of v'))"; |
207 by (simp_tac |
205 by (simp_tac |
208 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, |
206 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, |
209 neg_nat, nat_0, DIVISION_BY_ZERO_MOD, |
207 neg_nat, nat_0, DIVISION_BY_ZERO_MOD, |
210 mod_nat_eq_nat_zmod]) 1); |
208 nat_mod_distrib RS sym]) 1); |
211 qed "mod_nat_number_of"; |
209 qed "mod_nat_number_of"; |
212 |
210 |
213 Addsimps [mod_nat_number_of]; |
211 Addsimps [mod_nat_number_of]; |
214 |
212 |
215 |
213 |