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, |