src/ZF/ArithSimp.thy
changeset 46821 ff6b0c1087f2
parent 46820 c656222c4dc1
child 48891 c0eafbd55de3
equal deleted inserted replaced
46820:c656222c4dc1 46821:ff6b0c1087f2
    41 apply (rule_tac m = m and n = n in diff_induct)
    41 apply (rule_tac m = m and n = n in diff_induct)
    42 apply (simp_all (no_asm_simp))
    42 apply (simp_all (no_asm_simp))
    43 done
    43 done
    44 
    44 
    45 lemma zero_less_diff [simp]:
    45 lemma zero_less_diff [simp]:
    46      "[| m: nat; n: nat |] ==> 0 < (n #- m)   <->   m<n"
    46      "[| m: nat; n: nat |] ==> 0 < (n #- m)   \<longleftrightarrow>   m<n"
    47 apply (rule_tac m = m and n = n in diff_induct)
    47 apply (rule_tac m = m and n = n in diff_induct)
    48 apply (simp_all (no_asm_simp))
    48 apply (simp_all (no_asm_simp))
    49 done
    49 done
    50 
    50 
    51 
    51 
   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 **)
   491 apply (simp_all (no_asm) add: le_iff)
   491 apply (simp_all (no_asm) add: le_iff)
   492 apply (blast elim!: leE intro!: add_0_right [symmetric] add_succ_right [symmetric])
   492 apply (blast elim!: leE intro!: add_0_right [symmetric] add_succ_right [symmetric])
   493 done
   493 done
   494 
   494 
   495 lemma less_iff_succ_add:
   495 lemma less_iff_succ_add:
   496      "[| m: nat; n: nat |] ==> (m<n) <-> (\<exists>k\<in>nat. n = succ(m#+k))"
   496      "[| m: nat; n: nat |] ==> (m<n) \<longleftrightarrow> (\<exists>k\<in>nat. n = succ(m#+k))"
   497 by (auto intro: less_imp_succ_add)
   497 by (auto intro: less_imp_succ_add)
   498 
   498 
   499 lemma add_lt_elim2:
   499 lemma add_lt_elim2:
   500      "\<lbrakk>a #+ d = b #+ c; a < b; b \<in> nat; c \<in> nat; d \<in> nat\<rbrakk> \<Longrightarrow> c < d"
   500      "\<lbrakk>a #+ d = b #+ c; a < b; b \<in> nat; c \<in> nat; d \<in> nat\<rbrakk> \<Longrightarrow> c < d"
   501 by (drule less_imp_succ_add, auto)
   501 by (drule less_imp_succ_add, auto)
   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 
   557 apply (subgoal_tac "j #+ d < i #+ da", force)
   557 apply (subgoal_tac "j #+ d < i #+ da", force)
   558 apply (blast intro: add_lt_le_mono)
   558 apply (blast intro: add_lt_le_mono)
   559 done
   559 done
   560 
   560 
   561 
   561 
   562 lemma diff_lt_iff_lt: "[|i\<le>k; j\<in>nat; k\<in>nat|] ==> (k#-i) < (k#-j) <-> j<i"
   562 lemma diff_lt_iff_lt: "[|i\<le>k; j\<in>nat; k\<in>nat|] ==> (k#-i) < (k#-j) \<longleftrightarrow> j<i"
   563 apply (frule le_in_nat, assumption)
   563 apply (frule le_in_nat, assumption)
   564 apply (blast intro: lt_imp_diff_lt diff_lt_imp_lt)
   564 apply (blast intro: lt_imp_diff_lt diff_lt_imp_lt)
   565 done
   565 done
   566 
   566 
   567 end
   567 end