299 |
299 |
300 lemma mult_lt_mono1: "[| i<j; 0<k; j:nat; k:nat |] ==> i#*k < j#*k" |
300 lemma mult_lt_mono1: "[| i<j; 0<k; j:nat; k:nat |] ==> i#*k < j#*k" |
301 apply (simp (no_asm_simp) add: mult_lt_mono2 mult_commute [of _ k]) |
301 apply (simp (no_asm_simp) add: mult_lt_mono2 mult_commute [of _ k]) |
302 done |
302 done |
303 |
303 |
304 lemma add_eq_0_iff [iff]: "m#+n = 0 <-> natify(m)=0 & natify(n)=0" |
304 lemma add_eq_0_iff [iff]: "m#+n = 0 \<longleftrightarrow> natify(m)=0 & natify(n)=0" |
305 apply (subgoal_tac "natify (m) #+ natify (n) = 0 <-> natify (m) =0 & natify (n) =0") |
305 apply (subgoal_tac "natify (m) #+ natify (n) = 0 \<longleftrightarrow> natify (m) =0 & natify (n) =0") |
306 apply (rule_tac [2] n = "natify (m) " in natE) |
306 apply (rule_tac [2] n = "natify (m) " in natE) |
307 apply (rule_tac [4] n = "natify (n) " in natE) |
307 apply (rule_tac [4] n = "natify (n) " in natE) |
308 apply auto |
308 apply auto |
309 done |
309 done |
310 |
310 |
311 lemma zero_lt_mult_iff [iff]: "0 < m#*n <-> 0 < natify(m) & 0 < natify(n)" |
311 lemma zero_lt_mult_iff [iff]: "0 < m#*n \<longleftrightarrow> 0 < natify(m) & 0 < natify(n)" |
312 apply (subgoal_tac "0 < natify (m) #*natify (n) <-> 0 < natify (m) & 0 < natify (n) ") |
312 apply (subgoal_tac "0 < natify (m) #*natify (n) \<longleftrightarrow> 0 < natify (m) & 0 < natify (n) ") |
313 apply (rule_tac [2] n = "natify (m) " in natE) |
313 apply (rule_tac [2] n = "natify (m) " in natE) |
314 apply (rule_tac [4] n = "natify (n) " in natE) |
314 apply (rule_tac [4] n = "natify (n) " in natE) |
315 apply (rule_tac [3] n = "natify (n) " in natE) |
315 apply (rule_tac [3] n = "natify (n) " in natE) |
316 apply auto |
316 apply auto |
317 done |
317 done |
318 |
318 |
319 lemma mult_eq_1_iff [iff]: "m#*n = 1 <-> natify(m)=1 & natify(n)=1" |
319 lemma mult_eq_1_iff [iff]: "m#*n = 1 \<longleftrightarrow> natify(m)=1 & natify(n)=1" |
320 apply (subgoal_tac "natify (m) #* natify (n) = 1 <-> natify (m) =1 & natify (n) =1") |
320 apply (subgoal_tac "natify (m) #* natify (n) = 1 \<longleftrightarrow> natify (m) =1 & natify (n) =1") |
321 apply (rule_tac [2] n = "natify (m) " in natE) |
321 apply (rule_tac [2] n = "natify (m) " in natE) |
322 apply (rule_tac [4] n = "natify (n) " in natE) |
322 apply (rule_tac [4] n = "natify (n) " in natE) |
323 apply auto |
323 apply auto |
324 done |
324 done |
325 |
325 |
326 |
326 |
327 lemma mult_is_zero: "[|m: nat; n: nat|] ==> (m #* n = 0) <-> (m = 0 | n = 0)" |
327 lemma mult_is_zero: "[|m: nat; n: nat|] ==> (m #* n = 0) \<longleftrightarrow> (m = 0 | n = 0)" |
328 apply auto |
328 apply auto |
329 apply (erule natE) |
329 apply (erule natE) |
330 apply (erule_tac [2] natE, auto) |
330 apply (erule_tac [2] natE, auto) |
331 done |
331 done |
332 |
332 |
333 lemma mult_is_zero_natify [iff]: |
333 lemma mult_is_zero_natify [iff]: |
334 "(m #* n = 0) <-> (natify(m) = 0 | natify(n) = 0)" |
334 "(m #* n = 0) \<longleftrightarrow> (natify(m) = 0 | natify(n) = 0)" |
335 apply (cut_tac m = "natify (m) " and n = "natify (n) " in mult_is_zero) |
335 apply (cut_tac m = "natify (m) " and n = "natify (n) " in mult_is_zero) |
336 apply auto |
336 apply auto |
337 done |
337 done |
338 |
338 |
339 |
339 |
340 subsection{*Cancellation Laws for Common Factors in Comparisons*} |
340 subsection{*Cancellation Laws for Common Factors in Comparisons*} |
341 |
341 |
342 lemma mult_less_cancel_lemma: |
342 lemma mult_less_cancel_lemma: |
343 "[| k: nat; m: nat; n: nat |] ==> (m#*k < n#*k) <-> (0<k & m<n)" |
343 "[| k: nat; m: nat; n: nat |] ==> (m#*k < n#*k) \<longleftrightarrow> (0<k & m<n)" |
344 apply (safe intro!: mult_lt_mono1) |
344 apply (safe intro!: mult_lt_mono1) |
345 apply (erule natE, auto) |
345 apply (erule natE, auto) |
346 apply (rule not_le_iff_lt [THEN iffD1]) |
346 apply (rule not_le_iff_lt [THEN iffD1]) |
347 apply (drule_tac [3] not_le_iff_lt [THEN [2] rev_iffD2]) |
347 apply (drule_tac [3] not_le_iff_lt [THEN [2] rev_iffD2]) |
348 prefer 5 apply (blast intro: mult_le_mono1, auto) |
348 prefer 5 apply (blast intro: mult_le_mono1, auto) |
349 done |
349 done |
350 |
350 |
351 lemma mult_less_cancel2 [simp]: |
351 lemma mult_less_cancel2 [simp]: |
352 "(m#*k < n#*k) <-> (0 < natify(k) & natify(m) < natify(n))" |
352 "(m#*k < n#*k) \<longleftrightarrow> (0 < natify(k) & natify(m) < natify(n))" |
353 apply (rule iff_trans) |
353 apply (rule iff_trans) |
354 apply (rule_tac [2] mult_less_cancel_lemma, auto) |
354 apply (rule_tac [2] mult_less_cancel_lemma, auto) |
355 done |
355 done |
356 |
356 |
357 lemma mult_less_cancel1 [simp]: |
357 lemma mult_less_cancel1 [simp]: |
358 "(k#*m < k#*n) <-> (0 < natify(k) & natify(m) < natify(n))" |
358 "(k#*m < k#*n) \<longleftrightarrow> (0 < natify(k) & natify(m) < natify(n))" |
359 apply (simp (no_asm) add: mult_less_cancel2 mult_commute [of k]) |
359 apply (simp (no_asm) add: mult_less_cancel2 mult_commute [of k]) |
360 done |
360 done |
361 |
361 |
362 lemma mult_le_cancel2 [simp]: "(m#*k \<le> n#*k) <-> (0 < natify(k) \<longrightarrow> natify(m) \<le> natify(n))" |
362 lemma mult_le_cancel2 [simp]: "(m#*k \<le> n#*k) \<longleftrightarrow> (0 < natify(k) \<longrightarrow> natify(m) \<le> natify(n))" |
363 apply (simp (no_asm_simp) add: not_lt_iff_le [THEN iff_sym]) |
363 apply (simp (no_asm_simp) add: not_lt_iff_le [THEN iff_sym]) |
364 apply auto |
364 apply auto |
365 done |
365 done |
366 |
366 |
367 lemma mult_le_cancel1 [simp]: "(k#*m \<le> k#*n) <-> (0 < natify(k) \<longrightarrow> natify(m) \<le> natify(n))" |
367 lemma mult_le_cancel1 [simp]: "(k#*m \<le> k#*n) \<longleftrightarrow> (0 < natify(k) \<longrightarrow> natify(m) \<le> natify(n))" |
368 apply (simp (no_asm_simp) add: not_lt_iff_le [THEN iff_sym]) |
368 apply (simp (no_asm_simp) add: not_lt_iff_le [THEN iff_sym]) |
369 apply auto |
369 apply auto |
370 done |
370 done |
371 |
371 |
372 lemma mult_le_cancel_le1: "k \<in> nat ==> k #* m \<le> k \<longleftrightarrow> (0 < k \<longrightarrow> natify(m) \<le> 1)" |
372 lemma mult_le_cancel_le1: "k \<in> nat ==> k #* m \<le> k \<longleftrightarrow> (0 < k \<longrightarrow> natify(m) \<le> 1)" |
373 by (cut_tac k = k and m = m and n = 1 in mult_le_cancel1, auto) |
373 by (cut_tac k = k and m = m and n = 1 in mult_le_cancel1, auto) |
374 |
374 |
375 lemma Ord_eq_iff_le: "[| Ord(m); Ord(n) |] ==> m=n <-> (m \<le> n & n \<le> m)" |
375 lemma Ord_eq_iff_le: "[| Ord(m); Ord(n) |] ==> m=n \<longleftrightarrow> (m \<le> n & n \<le> m)" |
376 by (blast intro: le_anti_sym) |
376 by (blast intro: le_anti_sym) |
377 |
377 |
378 lemma mult_cancel2_lemma: |
378 lemma mult_cancel2_lemma: |
379 "[| k: nat; m: nat; n: nat |] ==> (m#*k = n#*k) <-> (m=n | k=0)" |
379 "[| k: nat; m: nat; n: nat |] ==> (m#*k = n#*k) \<longleftrightarrow> (m=n | k=0)" |
380 apply (simp (no_asm_simp) add: Ord_eq_iff_le [of "m#*k"] Ord_eq_iff_le [of m]) |
380 apply (simp (no_asm_simp) add: Ord_eq_iff_le [of "m#*k"] Ord_eq_iff_le [of m]) |
381 apply (auto simp add: Ord_0_lt_iff) |
381 apply (auto simp add: Ord_0_lt_iff) |
382 done |
382 done |
383 |
383 |
384 lemma mult_cancel2 [simp]: |
384 lemma mult_cancel2 [simp]: |
385 "(m#*k = n#*k) <-> (natify(m) = natify(n) | natify(k) = 0)" |
385 "(m#*k = n#*k) \<longleftrightarrow> (natify(m) = natify(n) | natify(k) = 0)" |
386 apply (rule iff_trans) |
386 apply (rule iff_trans) |
387 apply (rule_tac [2] mult_cancel2_lemma, auto) |
387 apply (rule_tac [2] mult_cancel2_lemma, auto) |
388 done |
388 done |
389 |
389 |
390 lemma mult_cancel1 [simp]: |
390 lemma mult_cancel1 [simp]: |
391 "(k#*m = k#*n) <-> (natify(m) = natify(n) | natify(k) = 0)" |
391 "(k#*m = k#*n) \<longleftrightarrow> (natify(m) = natify(n) | natify(k) = 0)" |
392 apply (simp (no_asm) add: mult_cancel2 mult_commute [of k]) |
392 apply (simp (no_asm) add: mult_cancel2 mult_commute [of k]) |
393 done |
393 done |
394 |
394 |
395 |
395 |
396 (** Cancellation law for division **) |
396 (** Cancellation law for division **) |
506 |
506 |
507 |
507 |
508 subsubsection{*More Lemmas About Difference*} |
508 subsubsection{*More Lemmas About Difference*} |
509 |
509 |
510 lemma diff_is_0_lemma: |
510 lemma diff_is_0_lemma: |
511 "[| m: nat; n: nat |] ==> m #- n = 0 <-> m \<le> n" |
511 "[| m: nat; n: nat |] ==> m #- n = 0 \<longleftrightarrow> m \<le> n" |
512 apply (rule_tac m = m and n = n in diff_induct, simp_all) |
512 apply (rule_tac m = m and n = n in diff_induct, simp_all) |
513 done |
513 done |
514 |
514 |
515 lemma diff_is_0_iff: "m #- n = 0 <-> natify(m) \<le> natify(n)" |
515 lemma diff_is_0_iff: "m #- n = 0 \<longleftrightarrow> natify(m) \<le> natify(n)" |
516 by (simp add: diff_is_0_lemma [symmetric]) |
516 by (simp add: diff_is_0_lemma [symmetric]) |
517 |
517 |
518 lemma nat_lt_imp_diff_eq_0: |
518 lemma nat_lt_imp_diff_eq_0: |
519 "[| a:nat; b:nat; a<b |] ==> a #- b = 0" |
519 "[| a:nat; b:nat; a<b |] ==> a #- b = 0" |
520 by (simp add: diff_is_0_iff le_iff) |
520 by (simp add: diff_is_0_iff le_iff) |
521 |
521 |
522 lemma raw_nat_diff_split: |
522 lemma raw_nat_diff_split: |
523 "[| a:nat; b:nat |] ==> |
523 "[| a:nat; b:nat |] ==> |
524 (P(a #- b)) <-> ((a < b \<longrightarrow>P(0)) & (\<forall>d\<in>nat. a = b #+ d \<longrightarrow> P(d)))" |
524 (P(a #- b)) \<longleftrightarrow> ((a < b \<longrightarrow>P(0)) & (\<forall>d\<in>nat. a = b #+ d \<longrightarrow> P(d)))" |
525 apply (case_tac "a < b") |
525 apply (case_tac "a < b") |
526 apply (force simp add: nat_lt_imp_diff_eq_0) |
526 apply (force simp add: nat_lt_imp_diff_eq_0) |
527 apply (rule iffI, force, simp) |
527 apply (rule iffI, force, simp) |
528 apply (drule_tac x="a#-b" in bspec) |
528 apply (drule_tac x="a#-b" in bspec) |
529 apply (simp_all add: Ordinal.not_lt_iff_le add_diff_inverse) |
529 apply (simp_all add: Ordinal.not_lt_iff_le add_diff_inverse) |
530 done |
530 done |
531 |
531 |
532 lemma nat_diff_split: |
532 lemma nat_diff_split: |
533 "(P(a #- b)) <-> |
533 "(P(a #- b)) \<longleftrightarrow> |
534 (natify(a) < natify(b) \<longrightarrow>P(0)) & (\<forall>d\<in>nat. natify(a) = b #+ d \<longrightarrow> P(d))" |
534 (natify(a) < natify(b) \<longrightarrow>P(0)) & (\<forall>d\<in>nat. natify(a) = b #+ d \<longrightarrow> P(d))" |
535 apply (cut_tac P=P and a="natify(a)" and b="natify(b)" in raw_nat_diff_split) |
535 apply (cut_tac P=P and a="natify(a)" and b="natify(b)" in raw_nat_diff_split) |
536 apply simp_all |
536 apply simp_all |
537 done |
537 done |
538 |
538 |