9 Goal "number_of v + (number_of v' + (k::nat)) = \ |
9 Goal "number_of v + (number_of v' + (k::nat)) = \ |
10 \ (if neg (number_of v) then number_of v' + k \ |
10 \ (if neg (number_of v) then number_of v' + k \ |
11 \ else if neg (number_of v') then number_of v + k \ |
11 \ else if neg (number_of v') then number_of v + k \ |
12 \ else number_of (bin_add v v') + k)"; |
12 \ else number_of (bin_add v v') + k)"; |
13 by (Simp_tac 1); |
13 by (Simp_tac 1); |
14 qed "add_nat_number_of_add"; |
14 qed "nat_number_of_add_left"; |
15 |
15 |
16 |
16 |
17 (** For cancel_numerals **) |
17 (** For cancel_numerals **) |
18 |
18 |
19 Goal "j <= (i::nat) ==> ((i*u + m) - (j*u + n)) = (((i-j)*u + m) - n)"; |
19 Goal "j <= (i::nat) ==> ((i*u + m) - (j*u + n)) = (((i-j)*u + m) - n)"; |
20 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] |
20 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] |
21 addsimps [add_mult_distrib]) 1); |
21 addsimps [add_mult_distrib]) 1); |
22 qed "diff_add_eq1"; |
22 qed "nat_diff_add_eq1"; |
23 |
23 |
24 Goal "i <= (j::nat) ==> ((i*u + m) - (j*u + n)) = (m - ((j-i)*u + n))"; |
24 Goal "i <= (j::nat) ==> ((i*u + m) - (j*u + n)) = (m - ((j-i)*u + n))"; |
25 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] |
25 by (asm_simp_tac (simpset() addsplits [nat_diff_split'] |
26 addsimps [add_mult_distrib]) 1); |
26 addsimps [add_mult_distrib]) 1); |
27 qed "diff_add_eq2"; |
27 qed "nat_diff_add_eq2"; |
28 |
28 |
29 Goal "j <= (i::nat) ==> (i*u + m = j*u + n) = ((i-j)*u + m = n)"; |
29 Goal "j <= (i::nat) ==> (i*u + m = j*u + n) = ((i-j)*u + m = n)"; |
30 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
30 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
31 addsimps [add_mult_distrib])); |
31 addsimps [add_mult_distrib])); |
32 qed "eq_add_iff1"; |
32 qed "nat_eq_add_iff1"; |
33 |
33 |
34 Goal "i <= (j::nat) ==> (i*u + m = j*u + n) = (m = (j-i)*u + n)"; |
34 Goal "i <= (j::nat) ==> (i*u + m = j*u + n) = (m = (j-i)*u + n)"; |
35 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
35 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
36 addsimps [add_mult_distrib])); |
36 addsimps [add_mult_distrib])); |
37 qed "eq_add_iff2"; |
37 qed "nat_eq_add_iff2"; |
38 |
38 |
39 Goal "j <= (i::nat) ==> (i*u + m < j*u + n) = ((i-j)*u + m < n)"; |
39 Goal "j <= (i::nat) ==> (i*u + m < j*u + n) = ((i-j)*u + m < n)"; |
40 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
40 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
41 addsimps [add_mult_distrib])); |
41 addsimps [add_mult_distrib])); |
42 qed "less_add_iff1"; |
42 qed "nat_less_add_iff1"; |
43 |
43 |
44 Goal "i <= (j::nat) ==> (i*u + m < j*u + n) = (m < (j-i)*u + n)"; |
44 Goal "i <= (j::nat) ==> (i*u + m < j*u + n) = (m < (j-i)*u + n)"; |
45 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
45 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
46 addsimps [add_mult_distrib])); |
46 addsimps [add_mult_distrib])); |
47 qed "less_add_iff2"; |
47 qed "nat_less_add_iff2"; |
48 |
48 |
49 Goal "j <= (i::nat) ==> (i*u + m <= j*u + n) = ((i-j)*u + m <= n)"; |
49 Goal "j <= (i::nat) ==> (i*u + m <= j*u + n) = ((i-j)*u + m <= n)"; |
50 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
50 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
51 addsimps [add_mult_distrib])); |
51 addsimps [add_mult_distrib])); |
52 qed "le_add_iff1"; |
52 qed "nat_le_add_iff1"; |
53 |
53 |
54 Goal "i <= (j::nat) ==> (i*u + m <= j*u + n) = (m <= (j-i)*u + n)"; |
54 Goal "i <= (j::nat) ==> (i*u + m <= j*u + n) = (m <= (j-i)*u + n)"; |
55 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
55 by (auto_tac (claset(), simpset() addsplits [nat_diff_split'] |
56 addsimps [add_mult_distrib])); |
56 addsimps [add_mult_distrib])); |
57 qed "le_add_iff2"; |
57 qed "nat_le_add_iff2"; |
58 |
58 |
59 structure Nat_Numeral_Simprocs = |
59 structure Nat_Numeral_Simprocs = |
60 struct |
60 struct |
61 |
61 |
62 (*Utilities for simproc inverse_fold*) |
62 (*Utilities*) |
63 |
63 |
64 fun mk_numeral n = HOLogic.number_of_const $ NumeralSyntax.mk_bin n; |
64 fun mk_numeral n = HOLogic.number_of_const HOLogic.natT $ |
|
65 NumeralSyntax.mk_bin n; |
65 |
66 |
66 (*Decodes a unary or binary numeral to a NATURAL NUMBER*) |
67 (*Decodes a unary or binary numeral to a NATURAL NUMBER*) |
67 fun dest_numeral (Const ("0", _)) = 0 |
68 fun dest_numeral (Const ("0", _)) = 0 |
68 | dest_numeral (Const ("Suc", _) $ t) = 1 + dest_numeral t |
69 | dest_numeral (Const ("Suc", _) $ t) = 1 + dest_numeral t |
69 | dest_numeral (Const("Numeral.number_of", _) $ w) = |
70 | dest_numeral (Const("Numeral.number_of", _) $ w) = |
108 (K tacs)) |
111 (K tacs)) |
109 handle ERROR => error |
112 handle ERROR => error |
110 ("The error(s) above occurred while trying to prove " ^ |
113 ("The error(s) above occurred while trying to prove " ^ |
111 (string_of_cterm (cterm_of sg (mk_eqv (t, u)))))); |
114 (string_of_cterm (cterm_of sg (mk_eqv (t, u)))))); |
112 |
115 |
113 fun all_simp_tac ss rules = ALLGOALS (simp_tac (ss addsimps rules)); |
116 val bin_simps = [add_nat_number_of, nat_number_of_add_left, |
|
117 diff_nat_number_of, le_nat_number_of_eq_not_less, |
|
118 less_nat_number_of, Let_number_of, nat_number_of] @ |
|
119 bin_arith_simps @ bin_rel_simps; |
114 |
120 |
115 val add_norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_ac)); |
121 val add_norm_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_ac)); |
|
122 |
116 |
123 |
117 (****combine_coeffs will make this obsolete****) |
124 (****combine_coeffs will make this obsolete****) |
118 structure FoldSucData = |
125 structure FoldSucData = |
119 struct |
126 struct |
120 val mk_numeral = mk_numeral |
127 val mk_numeral = mk_numeral |
183 |
190 |
184 (*Simplify #1*n and n*#1 to n*) |
191 (*Simplify #1*n and n*#1 to n*) |
185 val add_0s = map (rename_numerals NatBin.thy) [add_0, add_0_right]; |
192 val add_0s = map (rename_numerals NatBin.thy) [add_0, add_0_right]; |
186 val mult_1s = map (rename_numerals NatBin.thy) [mult_1, mult_1_right]; |
193 val mult_1s = map (rename_numerals NatBin.thy) [mult_1, mult_1_right]; |
187 |
194 |
188 val bin_simps = [add_nat_number_of, add_nat_number_of_add] @ |
|
189 bin_arith_simps @ bin_rel_simps; |
|
190 |
|
191 structure CancelNumeralsCommon = |
195 structure CancelNumeralsCommon = |
192 struct |
196 struct |
193 val mk_sum = mk_sum |
197 val mk_sum = mk_sum |
194 val dest_sum = dest_Sucs_sum |
198 val dest_sum = dest_Sucs_sum |
195 val mk_coeff = mk_coeff |
199 val mk_coeff = mk_coeff |
196 val dest_coeff = dest_coeff |
200 val dest_coeff = dest_coeff |
197 val find_first_coeff = find_first_coeff [] |
201 val find_first_coeff = find_first_coeff [] |
198 val prove_conv = prove_conv |
202 val prove_conv = prove_conv |
199 val numeral_simp_tac = ALLGOALS (simp_tac (simpset() addsimps [numeral_0_eq_0 RS sym])) |
|
200 val norm_tac = ALLGOALS |
203 val norm_tac = ALLGOALS |
201 (simp_tac (HOL_ss addsimps add_0s@mult_1s@bin_simps@ |
204 (simp_tac (HOL_ss addsimps add_0s@mult_1s@bin_simps@ |
202 [Suc_eq_add_numeral_1]@add_ac)) |
205 [Suc_eq_add_numeral_1]@add_ac)) |
203 THEN ALLGOALS (simp_tac (HOL_ss addsimps mult_ac)) |
206 THEN ALLGOALS (simp_tac (HOL_ss addsimps mult_ac)) |
|
207 val numeral_simp_tac = ALLGOALS |
|
208 (simp_tac (HOL_ss addsimps [numeral_0_eq_0 RS sym]@add_0s@bin_simps)) |
204 end; |
209 end; |
205 |
210 |
206 |
211 |
207 (* nat eq *) |
212 (* nat eq *) |
208 structure EqCancelNumerals = CancelNumeralsFun |
213 structure EqCancelNumerals = CancelNumeralsFun |
209 (open CancelNumeralsCommon |
214 (open CancelNumeralsCommon |
210 val mk_bal = HOLogic.mk_eq |
215 val mk_bal = HOLogic.mk_eq |
211 val dest_bal = HOLogic.dest_bin "op =" HOLogic.natT |
216 val dest_bal = HOLogic.dest_bin "op =" HOLogic.natT |
212 val bal_add1 = eq_add_iff1 RS trans |
217 val bal_add1 = nat_eq_add_iff1 RS trans |
213 val bal_add2 = eq_add_iff2 RS trans |
218 val bal_add2 = nat_eq_add_iff2 RS trans |
214 ); |
219 ); |
215 |
220 |
216 (* nat less *) |
221 (* nat less *) |
217 structure LessCancelNumerals = CancelNumeralsFun |
222 structure LessCancelNumerals = CancelNumeralsFun |
218 (open CancelNumeralsCommon |
223 (open CancelNumeralsCommon |
219 val mk_bal = HOLogic.mk_binrel "op <" |
224 val mk_bal = HOLogic.mk_binrel "op <" |
220 val dest_bal = HOLogic.dest_bin "op <" HOLogic.natT |
225 val dest_bal = HOLogic.dest_bin "op <" HOLogic.natT |
221 val bal_add1 = less_add_iff1 RS trans |
226 val bal_add1 = nat_less_add_iff1 RS trans |
222 val bal_add2 = less_add_iff2 RS trans |
227 val bal_add2 = nat_less_add_iff2 RS trans |
223 ); |
228 ); |
224 |
229 |
225 (* nat le *) |
230 (* nat le *) |
226 structure LeCancelNumerals = CancelNumeralsFun |
231 structure LeCancelNumerals = CancelNumeralsFun |
227 (open CancelNumeralsCommon |
232 (open CancelNumeralsCommon |
228 val mk_bal = HOLogic.mk_binrel "op <=" |
233 val mk_bal = HOLogic.mk_binrel "op <=" |
229 val dest_bal = HOLogic.dest_bin "op <=" HOLogic.natT |
234 val dest_bal = HOLogic.dest_bin "op <=" HOLogic.natT |
230 val bal_add1 = le_add_iff1 RS trans |
235 val bal_add1 = nat_le_add_iff1 RS trans |
231 val bal_add2 = le_add_iff2 RS trans |
236 val bal_add2 = nat_le_add_iff2 RS trans |
232 ); |
237 ); |
233 |
238 |
234 (* nat diff *) |
239 (* nat diff *) |
235 structure DiffCancelNumerals = CancelNumeralsFun |
240 structure DiffCancelNumerals = CancelNumeralsFun |
236 (open CancelNumeralsCommon |
241 (open CancelNumeralsCommon |
237 val mk_bal = HOLogic.mk_binop "op -" |
242 val mk_bal = HOLogic.mk_binop "op -" |
238 val dest_bal = HOLogic.dest_bin "op -" HOLogic.natT |
243 val dest_bal = HOLogic.dest_bin "op -" HOLogic.natT |
239 val bal_add1 = diff_add_eq1 RS trans |
244 val bal_add1 = nat_diff_add_eq1 RS trans |
240 val bal_add2 = diff_add_eq2 RS trans |
245 val bal_add2 = nat_diff_add_eq2 RS trans |
241 ); |
246 ); |
242 |
247 |
243 |
248 |
244 val cancel_numerals = |
249 val cancel_numerals = |
245 map prep_simproc |
250 map prep_simproc |