26 Addsimps [diff_0_eq_0, diff_Suc_Suc]; |
26 Addsimps [diff_0_eq_0, diff_Suc_Suc]; |
27 |
27 |
28 (* Could be (and is, below) generalized in various ways; |
28 (* Could be (and is, below) generalized in various ways; |
29 However, none of the generalizations are currently in the simpset, |
29 However, none of the generalizations are currently in the simpset, |
30 and I dread to think what happens if I put them in *) |
30 and I dread to think what happens if I put them in *) |
31 Goal "!!n. 0 < n ==> Suc(n-1) = n"; |
31 Goal "0 < n ==> Suc(n-1) = n"; |
32 by (asm_simp_tac (simpset() addsplits [split_nat_case]) 1); |
32 by (asm_simp_tac (simpset() addsplits [split_nat_case]) 1); |
33 qed "Suc_pred"; |
33 qed "Suc_pred"; |
34 Addsimps [Suc_pred]; |
34 Addsimps [Suc_pred]; |
35 |
35 |
36 Delsimps [diff_Suc]; |
36 Delsimps [diff_Suc]; |
109 by (ALLGOALS (fast_tac (claset() addss (simpset())))); |
109 by (ALLGOALS (fast_tac (claset() addss (simpset())))); |
110 qed "pred_add_is_0"; |
110 qed "pred_add_is_0"; |
111 Addsimps [pred_add_is_0]; |
111 Addsimps [pred_add_is_0]; |
112 |
112 |
113 (* Could be generalized, eg to "!!n. k<n ==> m+(n-(Suc k)) = (m+n)-(Suc k)" *) |
113 (* Could be generalized, eg to "!!n. k<n ==> m+(n-(Suc k)) = (m+n)-(Suc k)" *) |
114 Goal "!!n. 0<n ==> m + (n-1) = (m+n)-1"; |
114 Goal "0<n ==> m + (n-1) = (m+n)-1"; |
115 by (exhaust_tac "m" 1); |
115 by (exhaust_tac "m" 1); |
116 by (ALLGOALS (asm_simp_tac (simpset() addsimps [diff_Suc] |
116 by (ALLGOALS (asm_simp_tac (simpset() addsimps [diff_Suc] |
117 addsplits [split_nat_case]))); |
117 addsplits [split_nat_case]))); |
118 qed "add_pred"; |
118 qed "add_pred"; |
119 Addsimps [add_pred]; |
119 Addsimps [add_pred]; |
126 |
126 |
127 |
127 |
128 (**** Additional theorems about "less than" ****) |
128 (**** Additional theorems about "less than" ****) |
129 |
129 |
130 (*Deleted less_natE; instead use less_eq_Suc_add RS exE*) |
130 (*Deleted less_natE; instead use less_eq_Suc_add RS exE*) |
131 Goal "!!m. m<n --> (? k. n=Suc(m+k))"; |
131 Goal "m<n --> (? k. n=Suc(m+k))"; |
132 by (induct_tac "n" 1); |
132 by (induct_tac "n" 1); |
133 by (ALLGOALS (simp_tac (simpset() addsimps [less_Suc_eq]))); |
133 by (ALLGOALS (simp_tac (simpset() addsimps [less_Suc_eq]))); |
134 by (blast_tac (claset() addSEs [less_SucE] |
134 by (blast_tac (claset() addSEs [less_SucE] |
135 addSIs [add_0_right RS sym, add_Suc_right RS sym]) 1); |
135 addSIs [add_0_right RS sym, add_Suc_right RS sym]) 1); |
136 qed_spec_mp "less_eq_Suc_add"; |
136 qed_spec_mp "less_eq_Suc_add"; |
160 bind_thm ("trans_less_add1", le_add1 RSN (2,less_le_trans)); |
160 bind_thm ("trans_less_add1", le_add1 RSN (2,less_le_trans)); |
161 |
161 |
162 (*"i < j ==> i < m+j"*) |
162 (*"i < j ==> i < m+j"*) |
163 bind_thm ("trans_less_add2", le_add2 RSN (2,less_le_trans)); |
163 bind_thm ("trans_less_add2", le_add2 RSN (2,less_le_trans)); |
164 |
164 |
165 Goal "!!i. i+j < (k::nat) ==> i<k"; |
165 Goal "i+j < (k::nat) ==> i<k"; |
166 by (etac rev_mp 1); |
166 by (etac rev_mp 1); |
167 by (induct_tac "j" 1); |
167 by (induct_tac "j" 1); |
168 by (ALLGOALS Asm_simp_tac); |
168 by (ALLGOALS Asm_simp_tac); |
169 by (blast_tac (claset() addDs [Suc_lessD]) 1); |
169 by (blast_tac (claset() addDs [Suc_lessD]) 1); |
170 qed "add_lessD1"; |
170 qed "add_lessD1"; |
326 Goal "~ m<n --> n+(m-n) = (m::nat)"; |
326 Goal "~ m<n --> n+(m-n) = (m::nat)"; |
327 by (res_inst_tac [("m","m"),("n","n")] diff_induct 1); |
327 by (res_inst_tac [("m","m"),("n","n")] diff_induct 1); |
328 by (ALLGOALS Asm_simp_tac); |
328 by (ALLGOALS Asm_simp_tac); |
329 qed_spec_mp "add_diff_inverse"; |
329 qed_spec_mp "add_diff_inverse"; |
330 |
330 |
331 Goal "!!m. n<=m ==> n+(m-n) = (m::nat)"; |
331 Goal "n<=m ==> n+(m-n) = (m::nat)"; |
332 by (asm_simp_tac (simpset() addsimps [add_diff_inverse, not_less_iff_le]) 1); |
332 by (asm_simp_tac (simpset() addsimps [add_diff_inverse, not_less_iff_le]) 1); |
333 qed "le_add_diff_inverse"; |
333 qed "le_add_diff_inverse"; |
334 |
334 |
335 Goal "!!m. n<=m ==> (m-n)+n = (m::nat)"; |
335 Goal "n<=m ==> (m-n)+n = (m::nat)"; |
336 by (asm_simp_tac (simpset() addsimps [le_add_diff_inverse, add_commute]) 1); |
336 by (asm_simp_tac (simpset() addsimps [le_add_diff_inverse, add_commute]) 1); |
337 qed "le_add_diff_inverse2"; |
337 qed "le_add_diff_inverse2"; |
338 |
338 |
339 Addsimps [le_add_diff_inverse, le_add_diff_inverse2]; |
339 Addsimps [le_add_diff_inverse, le_add_diff_inverse2]; |
340 |
340 |
370 Goal "(Suc m - n) - Suc k = m - n - k"; |
370 Goal "(Suc m - n) - Suc k = m - n - k"; |
371 by (simp_tac (simpset() addsimps [diff_diff_left]) 1); |
371 by (simp_tac (simpset() addsimps [diff_diff_left]) 1); |
372 qed "Suc_diff_diff"; |
372 qed "Suc_diff_diff"; |
373 Addsimps [Suc_diff_diff]; |
373 Addsimps [Suc_diff_diff]; |
374 |
374 |
375 Goal "!!n. 0<n ==> n - Suc i < n"; |
375 Goal "0<n ==> n - Suc i < n"; |
376 by (res_inst_tac [("n","n")] natE 1); |
376 by (res_inst_tac [("n","n")] natE 1); |
377 by Safe_tac; |
377 by Safe_tac; |
378 by (asm_simp_tac (simpset() addsimps [le_eq_less_Suc RS sym]) 1); |
378 by (asm_simp_tac (simpset() addsimps [le_eq_less_Suc RS sym]) 1); |
379 qed "diff_Suc_less"; |
379 qed "diff_Suc_less"; |
380 Addsimps [diff_Suc_less]; |
380 Addsimps [diff_Suc_less]; |
555 by (Simp_tac 1); |
555 by (Simp_tac 1); |
556 by (fast_tac (claset() addss simpset()) 1); |
556 by (fast_tac (claset() addss simpset()) 1); |
557 qed "mult_eq_1_iff"; |
557 qed "mult_eq_1_iff"; |
558 Addsimps [mult_eq_1_iff]; |
558 Addsimps [mult_eq_1_iff]; |
559 |
559 |
560 Goal "!!k. 0<k ==> (m*k < n*k) = (m<n)"; |
560 Goal "0<k ==> (m*k < n*k) = (m<n)"; |
561 by (safe_tac (claset() addSIs [mult_less_mono1])); |
561 by (safe_tac (claset() addSIs [mult_less_mono1])); |
562 by (cut_facts_tac [less_linear] 1); |
562 by (cut_facts_tac [less_linear] 1); |
563 by (blast_tac (claset() addIs [mult_less_mono1] addEs [less_asym]) 1); |
563 by (blast_tac (claset() addIs [mult_less_mono1] addEs [less_asym]) 1); |
564 qed "mult_less_cancel2"; |
564 qed "mult_less_cancel2"; |
565 |
565 |
566 Goal "!!k. 0<k ==> (k*m < k*n) = (m<n)"; |
566 Goal "0<k ==> (k*m < k*n) = (m<n)"; |
567 by (dtac mult_less_cancel2 1); |
567 by (dtac mult_less_cancel2 1); |
568 by (asm_full_simp_tac (simpset() addsimps [mult_commute]) 1); |
568 by (asm_full_simp_tac (simpset() addsimps [mult_commute]) 1); |
569 qed "mult_less_cancel1"; |
569 qed "mult_less_cancel1"; |
570 Addsimps [mult_less_cancel1, mult_less_cancel2]; |
570 Addsimps [mult_less_cancel1, mult_less_cancel2]; |
571 |
571 |
577 Goalw [le_def] "(Suc k * m <= Suc k * n) = (m <= n)"; |
577 Goalw [le_def] "(Suc k * m <= Suc k * n) = (m <= n)"; |
578 by (simp_tac (simpset_of HOL.thy) 1); |
578 by (simp_tac (simpset_of HOL.thy) 1); |
579 by (rtac Suc_mult_less_cancel1 1); |
579 by (rtac Suc_mult_less_cancel1 1); |
580 qed "Suc_mult_le_cancel1"; |
580 qed "Suc_mult_le_cancel1"; |
581 |
581 |
582 Goal "!!k. 0<k ==> (m*k = n*k) = (m=n)"; |
582 Goal "0<k ==> (m*k = n*k) = (m=n)"; |
583 by (cut_facts_tac [less_linear] 1); |
583 by (cut_facts_tac [less_linear] 1); |
584 by Safe_tac; |
584 by Safe_tac; |
585 by (assume_tac 2); |
585 by (assume_tac 2); |
586 by (ALLGOALS (dtac mult_less_mono1 THEN' assume_tac)); |
586 by (ALLGOALS (dtac mult_less_mono1 THEN' assume_tac)); |
587 by (ALLGOALS Asm_full_simp_tac); |
587 by (ALLGOALS Asm_full_simp_tac); |
588 qed "mult_cancel2"; |
588 qed "mult_cancel2"; |
589 |
589 |
590 Goal "!!k. 0<k ==> (k*m = k*n) = (m=n)"; |
590 Goal "0<k ==> (k*m = k*n) = (m=n)"; |
591 by (dtac mult_cancel2 1); |
591 by (dtac mult_cancel2 1); |
592 by (asm_full_simp_tac (simpset() addsimps [mult_commute]) 1); |
592 by (asm_full_simp_tac (simpset() addsimps [mult_commute]) 1); |
593 qed "mult_cancel1"; |
593 qed "mult_cancel1"; |
594 Addsimps [mult_cancel1, mult_cancel2]; |
594 Addsimps [mult_cancel1, mult_cancel2]; |
595 |
595 |
599 qed "Suc_mult_cancel1"; |
599 qed "Suc_mult_cancel1"; |
600 |
600 |
601 |
601 |
602 (** Lemma for gcd **) |
602 (** Lemma for gcd **) |
603 |
603 |
604 Goal "!!m n. m = m*n ==> n=1 | m=0"; |
604 Goal "m = m*n ==> n=1 | m=0"; |
605 by (dtac sym 1); |
605 by (dtac sym 1); |
606 by (rtac disjCI 1); |
606 by (rtac disjCI 1); |
607 by (rtac nat_less_cases 1 THEN assume_tac 2); |
607 by (rtac nat_less_cases 1 THEN assume_tac 2); |
608 by (fast_tac (claset() addSEs [less_SucE] addss simpset()) 1); |
608 by (fast_tac (claset() addSEs [less_SucE] addss simpset()) 1); |
609 by (best_tac (claset() addDs [mult_less_mono2] addss simpset()) 1); |
609 by (best_tac (claset() addDs [mult_less_mono2] addss simpset()) 1); |
624 by (dtac diff_less_mono 1); |
624 by (dtac diff_less_mono 1); |
625 by (rtac le_add2 1); |
625 by (rtac le_add2 1); |
626 by (Asm_full_simp_tac 1); |
626 by (Asm_full_simp_tac 1); |
627 qed "add_less_imp_less_diff"; |
627 qed "add_less_imp_less_diff"; |
628 |
628 |
629 Goal "!! n. n <= m ==> Suc m - n = Suc (m - n)"; |
629 Goal "n <= m ==> Suc m - n = Suc (m - n)"; |
630 by (asm_full_simp_tac (simpset() addsimps [Suc_diff_n, le_eq_less_Suc]) 1); |
630 by (asm_full_simp_tac (simpset() addsimps [Suc_diff_n, le_eq_less_Suc]) 1); |
631 qed "Suc_diff_le"; |
631 qed "Suc_diff_le"; |
632 |
632 |
633 Goal "!! n. Suc i <= n ==> Suc (n - Suc i) = n - i"; |
633 Goal "Suc i <= n ==> Suc (n - Suc i) = n - i"; |
634 by (asm_full_simp_tac |
634 by (asm_full_simp_tac |
635 (simpset() addsimps [Suc_diff_n RS sym, le_eq_less_Suc]) 1); |
635 (simpset() addsimps [Suc_diff_n RS sym, le_eq_less_Suc]) 1); |
636 qed "Suc_diff_Suc"; |
636 qed "Suc_diff_Suc"; |
637 |
637 |
638 Goal "!! i::nat. i <= n ==> n - (n - i) = i"; |
638 Goal "!! i::nat. i <= n ==> n - (n - i) = i"; |