src/ZF/ArithSimp.ML
changeset 9648 35d761c7d934
parent 9548 15bee2731e43
child 9873 ae236a6dc047
equal deleted inserted replaced
9647:e9623f47275b 9648:35d761c7d934
   351  by (res_inst_tac [("n","natify(n)")] natE 4);
   351  by (res_inst_tac [("n","natify(n)")] natE 4);
   352 by Auto_tac;  
   352 by Auto_tac;  
   353 qed "mult_eq_1_iff";
   353 qed "mult_eq_1_iff";
   354 AddIffs [zero_lt_mult_iff, mult_eq_1_iff];
   354 AddIffs [zero_lt_mult_iff, mult_eq_1_iff];
   355 
   355 
       
   356 
       
   357 (** Cancellation laws for common factors in comparisons **)
       
   358 
       
   359 Goal "[| k: nat; m: nat; n: nat |] ==> (m#*k < n#*k) <-> (0<k & m<n)";
       
   360 by (safe_tac (claset() addSIs [mult_lt_mono1]));
       
   361 by (etac natE 1);
       
   362 by Auto_tac;  
       
   363 by (rtac (not_le_iff_lt RS iffD1) 1); 
       
   364 by (dtac (not_le_iff_lt RSN (2,rev_iffD2)) 3); 
       
   365 by (blast_tac (claset() addIs [mult_le_mono1]) 5); 
       
   366 by Auto_tac;  
       
   367 val lemma = result();
       
   368 
       
   369 Goal "(m#*k < n#*k) <-> (0 < natify(k) & natify(m) < natify(n))";
       
   370 by (rtac iff_trans 1);
       
   371 by (rtac lemma 2);
       
   372 by Auto_tac;  
       
   373 qed "mult_less_cancel2";
       
   374 
       
   375 Goal "(k#*m < k#*n) <-> (0 < natify(k) & natify(m) < natify(n))";
       
   376 by (simp_tac (simpset() addsimps [mult_less_cancel2, 
       
   377                                   inst "m" "k" mult_commute]) 1);
       
   378 qed "mult_less_cancel1";
       
   379 Addsimps [mult_less_cancel1, mult_less_cancel2];
       
   380 
       
   381 Goal "(m#*k le n#*k) <-> (0 < natify(k) --> natify(m) le natify(n))";
       
   382 by (asm_simp_tac (simpset() addsimps [not_lt_iff_le RS iff_sym]) 1);
       
   383 by Auto_tac;  
       
   384 qed "mult_le_cancel2";
       
   385 
       
   386 Goal "(k#*m le k#*n) <-> (0 < natify(k) --> natify(m) le natify(n))";
       
   387 by (asm_simp_tac (simpset() addsimps [not_lt_iff_le RS iff_sym]) 1);
       
   388 by Auto_tac;  
       
   389 qed "mult_le_cancel1";
       
   390 Addsimps [mult_le_cancel1, mult_le_cancel2];
       
   391 
       
   392 Goal "[| Ord(m); Ord(n) |] ==> m=n <-> (m le n & n le m)";
       
   393 by (blast_tac (claset() addIs [le_anti_sym]) 1); 
       
   394 qed "Ord_eq_iff_le";
       
   395 
       
   396 Goal "[| k: nat; m: nat; n: nat |] ==> (m#*k = n#*k) <-> (m=n | k=0)";
       
   397 by (asm_simp_tac (simpset() addsimps [inst "m" "m#*k" Ord_eq_iff_le,
       
   398                                       inst "m" "m" Ord_eq_iff_le]) 1); 
       
   399 by (auto_tac (claset(), simpset() addsimps [Ord_0_lt_iff]));  
       
   400 val lemma = result();
       
   401 
       
   402 Goal "(m#*k = n#*k) <-> (natify(m) = natify(n) | natify(k) = 0)";
       
   403 by (rtac iff_trans 1);
       
   404 by (rtac lemma 2);
       
   405 by Auto_tac;  
       
   406 qed "mult_cancel2";
       
   407 
       
   408 Goal "(k#*m = k#*n) <-> (natify(m) = natify(n) | natify(k) = 0)";
       
   409 by (simp_tac (simpset() addsimps [mult_cancel2, inst "m" "k" mult_commute]) 1);
       
   410 qed "mult_cancel1";
       
   411 Addsimps [mult_cancel1, mult_cancel2];
       
   412 
       
   413 
   356 (*Cancellation law for division*)
   414 (*Cancellation law for division*)
   357 Goal "[| 0<n; 0<k; k:nat; m:nat; n:nat |] ==> (k#*m) div (k#*n) = m div n";
   415 Goal "[| 0<n; 0<k; k:nat; m:nat; n:nat |] ==> (k#*m) div (k#*n) = m div n";
   358 by (eres_inst_tac [("i","m")] complete_induct 1);
   416 by (eres_inst_tac [("i","m")] complete_induct 1);
   359 by (excluded_middle_tac "x<n" 1);
   417 by (excluded_middle_tac "x<n" 1);
   360 by (asm_simp_tac (simpset() addsimps [div_less, zero_lt_mult_iff, 
   418 by (asm_simp_tac (simpset() addsimps [div_less, zero_lt_mult_iff,