# HG changeset patch # User paulson # Date 966506521 -7200 # Node ID 47d39a31eb2f6bf0a7f3d9c61daee7e3d7705fcc # Parent a0d4d9de9893744b93616dbb914832b985f7ff9b better rules for cancellation of common factors across comparisons diff -r a0d4d9de9893 -r 47d39a31eb2f src/HOL/Divides.ML --- a/src/HOL/Divides.ML Thu Aug 17 12:01:09 2000 +0200 +++ b/src/HOL/Divides.ML Thu Aug 17 12:02:01 2000 +0200 @@ -424,7 +424,6 @@ Goalw [dvd_def] "!!k::nat. [| (k*m) dvd (k*n); 0 m dvd n"; by (etac exE 1); by (asm_full_simp_tac (simpset() addsimps mult_ac) 1); -by (Blast_tac 1); qed "dvd_mult_cancel"; Goalw [dvd_def] "[| i dvd m; j dvd n|] ==> (i*j) dvd (m*n :: nat)"; diff -r a0d4d9de9893 -r 47d39a31eb2f src/HOL/Nat.ML --- a/src/HOL/Nat.ML Thu Aug 17 12:01:09 2000 +0200 +++ b/src/HOL/Nat.ML Thu Aug 17 12:02:01 2000 +0200 @@ -256,14 +256,6 @@ qed "add_gr_0"; AddIffs [add_gr_0]; -(* Could be generalized, eg to "k m+(n-(Suc k)) = (m+n)-(Suc k)" *) -Goal "!!m::nat. 0 m + (n-1) = (m+n)-1"; -by (case_tac "m" 1); -by (ALLGOALS (asm_simp_tac (simpset() addsimps [diff_Suc, Suc_n_not_n] - addsplits [nat.split]))); -qed "add_pred"; -Addsimps [add_pred]; - Goal "!!m::nat. m + n = m ==> n = 0"; by (dtac (add_0_right RS ssubst) 1); by (asm_full_simp_tac (simpset() addsimps [add_assoc] @@ -673,54 +665,57 @@ qed "mult_eq_1_iff"; Addsimps [mult_eq_1_iff]; -Goal "!!m::nat. 0 (m*k < n*k) = (m (k*m < k*n) = (m (m*k <= n*k) = (m<=n)"; -by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1); +Goal "!!m::nat. (m*k <= n*k) = (0 m<=n)"; +by (simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1); +by Auto_tac; qed "mult_le_cancel2"; -Goal "!!m::nat. 0 (k*m <= k*n) = (m<=n)"; -by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1); +Goal "!!m::nat. (k*m <= k*n) = (0 m<=n)"; +by (simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1); +by Auto_tac; qed "mult_le_cancel1"; Addsimps [mult_le_cancel1, mult_le_cancel2]; -Goal "(Suc k * m < Suc k * n) = (m < n)"; -by (rtac mult_less_cancel1 1); -by (Simp_tac 1); -qed "Suc_mult_less_cancel1"; - -Goalw [le_def] "(Suc k * m <= Suc k * n) = (m <= n)"; -by (simp_tac (simpset_of HOL.thy) 1); -by (rtac Suc_mult_less_cancel1 1); -qed "Suc_mult_le_cancel1"; - -Goal "0 < (k::nat) ==> (m*k = n*k) = (m=n)"; +Goal "(m*k = n*k) = (m=n | (k = (0::nat)))"; by (cut_facts_tac [less_linear] 1); by Safe_tac; -by (assume_tac 2); +by Auto_tac; by (ALLGOALS (dtac mult_less_mono1 THEN' assume_tac)); by (ALLGOALS Asm_full_simp_tac); qed "mult_cancel2"; -Goal "0 < (k::nat) ==> (k*m = k*n) = (m=n)"; -by (dtac mult_cancel2 1); -by (asm_full_simp_tac (simpset() addsimps [mult_commute]) 1); +Goal "(k*m = k*n) = (m=n | (k = (0::nat)))"; +by (simp_tac (simpset() addsimps [mult_cancel2, inst "m" "k" mult_commute]) 1); qed "mult_cancel1"; Addsimps [mult_cancel1, mult_cancel2]; +Goal "(Suc k * m < Suc k * n) = (m < n)"; +by (stac mult_less_cancel1 1); +by (Simp_tac 1); +qed "Suc_mult_less_cancel1"; + +Goal "(Suc k * m <= Suc k * n) = (m <= n)"; +by (stac mult_le_cancel1 1); +by (Simp_tac 1); +qed "Suc_mult_le_cancel1"; + Goal "(Suc k * m = Suc k * n) = (m = n)"; -by (rtac mult_cancel1 1); +by (stac mult_cancel1 1); by (Simp_tac 1); qed "Suc_mult_cancel1"; diff -r a0d4d9de9893 -r 47d39a31eb2f src/HOL/Power.ML --- a/src/HOL/Power.ML Thu Aug 17 12:01:09 2000 +0200 +++ b/src/HOL/Power.ML Thu Aug 17 12:02:01 2000 +0200 @@ -34,7 +34,6 @@ Goalw [dvd_def] "!!i::nat. m<=n ==> i^m dvd i^n"; by (etac (not_less_iff_le RS iffD2 RS add_diff_inverse RS subst) 1); by (asm_simp_tac (simpset() addsimps [power_add]) 1); -by (Blast_tac 1); qed "le_imp_power_dvd"; Goal "!!i::nat. [| 0 < i; i^m < i^n |] ==> m < n";