src/HOL/Nat.thy
changeset 14341 a09441bd4f1e
parent 14331 8dbbb7cf3637
child 14348 744c868ee0b7
equal deleted inserted replaced
14340:bc93ffa674cc 14341:a09441bd4f1e
   458   apply (simp add: le_eq_less_or_eq)
   458   apply (simp add: le_eq_less_or_eq)
   459   using less_linear
   459   using less_linear
   460   apply blast
   460   apply blast
   461   done
   461   done
   462 
   462 
       
   463 text {* Type {@typ nat} is a wellfounded linear order *}
       
   464 
       
   465 instance nat :: order by (intro_classes,
       
   466   (assumption | rule le_refl le_trans le_anti_sym nat_less_le)+)
       
   467 instance nat :: linorder by (intro_classes, rule nat_le_linear)
       
   468 instance nat :: wellorder by (intro_classes, rule wf_less)
       
   469 
       
   470 
   463 lemma not_less_less_Suc_eq: "~ n < m ==> (n < Suc m) = (n = m)"
   471 lemma not_less_less_Suc_eq: "~ n < m ==> (n < Suc m) = (n = m)"
   464   by (blast elim!: less_SucE)
   472   by (blast elim!: less_SucE)
   465 
   473 
   466 
   474 
   467 text {*
   475 text {*
   486   by auto
   494   by auto
   487 
   495 
   488 lemma one_reorient: "(1 = x) = (x = 1)"
   496 lemma one_reorient: "(1 = x) = (x = 1)"
   489   by auto
   497   by auto
   490 
   498 
   491 text {* Type {@typ nat} is a wellfounded linear order *}
       
   492 
       
   493 instance nat :: order by (intro_classes,
       
   494   (assumption | rule le_refl le_trans le_anti_sym nat_less_le)+)
       
   495 instance nat :: linorder by (intro_classes, rule nat_le_linear)
       
   496 instance nat :: wellorder by (intro_classes, rule wf_less)
       
   497 
       
   498 subsection {* Arithmetic operators *}
   499 subsection {* Arithmetic operators *}
   499 
   500 
   500 axclass power < type
   501 axclass power < type
   501 
   502 
   502 consts
   503 consts
   523 
   524 
   524 primrec
   525 primrec
   525   mult_0:   "0 * n = 0"
   526   mult_0:   "0 * n = 0"
   526   mult_Suc: "Suc m * n = n + (m * n)"
   527   mult_Suc: "Suc m * n = n + (m * n)"
   527 
   528 
   528 text {* These 2 rules ease the use of primitive recursion. NOTE USE OF @{text "=="} *}
   529 text {* These two rules ease the use of primitive recursion. 
       
   530 NOTE USE OF @{text "=="} *}
   529 lemma def_nat_rec_0: "(!!n. f n == nat_rec c h n) ==> f 0 = c"
   531 lemma def_nat_rec_0: "(!!n. f n == nat_rec c h n) ==> f 0 = c"
   530   by simp
   532   by simp
   531 
   533 
   532 lemma def_nat_rec_Suc: "(!!n. f n == nat_rec c h n) ==> f (Suc n) = h n (f n)"
   534 lemma def_nat_rec_Suc: "(!!n. f n == nat_rec c h n) ==> f (Suc n) = h n (f n)"
   533   by simp
   535   by simp
   558 
   560 
   559 text {* Useful in certain inductive arguments *}
   561 text {* Useful in certain inductive arguments *}
   560 lemma less_Suc_eq_0_disj: "(m < Suc n) = (m = 0 | (\<exists>j. m = Suc j & j < n))"
   562 lemma less_Suc_eq_0_disj: "(m < Suc n) = (m = 0 | (\<exists>j. m = Suc j & j < n))"
   561   by (case_tac m) simp_all
   563   by (case_tac m) simp_all
   562 
   564 
   563 lemma nat_induct2: "P 0 ==> P (Suc 0) ==> (!!k. P k ==> P (Suc (Suc k))) ==> P n"
   565 lemma nat_induct2: "[|P 0; P (Suc 0); !!k. P k ==> P (Suc (Suc k))|] ==> P n"
   564   apply (rule nat_less_induct)
   566   apply (rule nat_less_induct)
   565   apply (case_tac n)
   567   apply (case_tac n)
   566   apply (case_tac [2] nat)
   568   apply (case_tac [2] nat)
   567   apply (blast intro: less_trans)+
   569   apply (blast intro: less_trans)+
   568   done
   570   done
   688 lemma add_eq_self_zero: "!!m::nat. m + n = m ==> n = 0"
   690 lemma add_eq_self_zero: "!!m::nat. m + n = m ==> n = 0"
   689   apply (drule add_0_right [THEN ssubst])
   691   apply (drule add_0_right [THEN ssubst])
   690   apply (simp add: nat_add_assoc del: add_0_right)
   692   apply (simp add: nat_add_assoc del: add_0_right)
   691   done
   693   done
   692 
   694 
   693 subsection {* Monotonicity of Addition *}
       
   694 
       
   695 text {* strict, in 1st argument *}
       
   696 lemma add_less_mono1: "i < j ==> i + k < j + (k::nat)"
       
   697   by (induct k) simp_all
       
   698 
       
   699 text {* strict, in both arguments *}
       
   700 lemma add_less_mono: "[|i < j; k < l|] ==> i + k < j + (l::nat)"
       
   701   apply (rule add_less_mono1 [THEN less_trans], assumption+)
       
   702   apply (induct_tac j, simp_all)
       
   703   done
       
   704 
       
   705 text {* Deleted @{text less_natE}; use @{text "less_imp_Suc_add RS exE"} *}
       
   706 lemma less_imp_Suc_add: "m < n ==> (\<exists>k. n = Suc (m + k))"
       
   707   apply (induct n)
       
   708   apply (simp_all add: order_le_less)
       
   709   apply (blast elim!: less_SucE intro!: add_0_right [symmetric] add_Suc_right [symmetric])
       
   710   done
       
   711 
       
   712 
   695 
   713 subsection {* Multiplication *}
   696 subsection {* Multiplication *}
   714 
   697 
   715 text {* right annihilation in product *}
   698 text {* right annihilation in product *}
   716 lemma mult_0_right [simp]: "(m::nat) * 0 = 0"
   699 lemma mult_0_right [simp]: "(m::nat) * 0 = 0"
   733 
   716 
   734 text {* Associative law for multiplication *}
   717 text {* Associative law for multiplication *}
   735 lemma nat_mult_assoc: "(m * n) * k = m * ((n * k)::nat)"
   718 lemma nat_mult_assoc: "(m * n) * k = m * ((n * k)::nat)"
   736   by (induct m) (simp_all add: add_mult_distrib)
   719   by (induct m) (simp_all add: add_mult_distrib)
   737 
   720 
   738 lemma mult_is_0 [simp]: "((m::nat) * n = 0) = (m=0 | n=0)"
   721 
   739   apply (induct_tac m)
   722 text{*The Naturals Form A Semiring*}
   740   apply (induct_tac [2] n, simp_all)
   723 instance nat :: semiring
   741   done
       
   742 
       
   743 text {* strict, in 1st argument; proof is by induction on @{text "k > 0"} *}
       
   744 lemma mult_less_mono2: "(i::nat) < j ==> 0 < k ==> k * i < k * j"
       
   745   apply (erule_tac m1 = 0 in less_imp_Suc_add [THEN exE], simp)
       
   746   apply (induct_tac x) 
       
   747   apply (simp_all add: add_less_mono)
       
   748   done
       
   749 
       
   750 text{*The Naturals Form an Ordered Semiring*}
       
   751 instance nat :: ordered_semiring
       
   752 proof
   724 proof
   753   fix i j k :: nat
   725   fix i j k :: nat
   754   show "(i + j) + k = i + (j + k)" by (rule nat_add_assoc)
   726   show "(i + j) + k = i + (j + k)" by (rule nat_add_assoc)
   755   show "i + j = j + i" by (rule nat_add_commute)
   727   show "i + j = j + i" by (rule nat_add_commute)
   756   show "0 + i = i" by simp
   728   show "0 + i = i" by simp
   757   show "(i * j) * k = i * (j * k)" by (rule nat_mult_assoc)
   729   show "(i * j) * k = i * (j * k)" by (rule nat_mult_assoc)
   758   show "i * j = j * i" by (rule nat_mult_commute)
   730   show "i * j = j * i" by (rule nat_mult_commute)
   759   show "1 * i = i" by simp
   731   show "1 * i = i" by simp
   760   show "(i + j) * k = i * k + j * k" by (simp add: add_mult_distrib)
   732   show "(i + j) * k = i * k + j * k" by (simp add: add_mult_distrib)
   761   show "0 \<noteq> (1::nat)" by simp
   733   show "0 \<noteq> (1::nat)" by simp
       
   734   assume "k+i = k+j" thus "i=j" by simp
       
   735 qed
       
   736 
       
   737 lemma mult_is_0 [simp]: "((m::nat) * n = 0) = (m=0 | n=0)"
       
   738   apply (induct_tac m)
       
   739   apply (induct_tac [2] n, simp_all)
       
   740   done
       
   741 
       
   742 subsection {* Monotonicity of Addition *}
       
   743 
       
   744 text {* strict, in 1st argument *}
       
   745 lemma add_less_mono1: "i < j ==> i + k < j + (k::nat)"
       
   746   by (induct k) simp_all
       
   747 
       
   748 text {* strict, in both arguments *}
       
   749 lemma add_less_mono: "[|i < j; k < l|] ==> i + k < j + (l::nat)"
       
   750   apply (rule add_less_mono1 [THEN less_trans], assumption+)
       
   751   apply (induct_tac j, simp_all)
       
   752   done
       
   753 
       
   754 text {* Deleted @{text less_natE}; use @{text "less_imp_Suc_add RS exE"} *}
       
   755 lemma less_imp_Suc_add: "m < n ==> (\<exists>k. n = Suc (m + k))"
       
   756   apply (induct n)
       
   757   apply (simp_all add: order_le_less)
       
   758   apply (blast elim!: less_SucE 
       
   759                intro!: add_0_right [symmetric] add_Suc_right [symmetric])
       
   760   done
       
   761 
       
   762 text {* strict, in 1st argument; proof is by induction on @{text "k > 0"} *}
       
   763 lemma mult_less_mono2: "(i::nat) < j ==> 0 < k ==> k * i < k * j"
       
   764   apply (erule_tac m1 = 0 in less_imp_Suc_add [THEN exE], simp)
       
   765   apply (induct_tac x) 
       
   766   apply (simp_all add: add_less_mono)
       
   767   done
       
   768 
       
   769 
       
   770 text{*The Naturals Form an Ordered Semiring*}
       
   771 instance nat :: ordered_semiring
       
   772 proof
       
   773   fix i j k :: nat
   762   show "i \<le> j ==> k + i \<le> k + j" by simp
   774   show "i \<le> j ==> k + i \<le> k + j" by simp
   763   show "i < j ==> 0 < k ==> k * i < k * j" by (simp add: mult_less_mono2)
   775   show "i < j ==> 0 < k ==> k * i < k * j" by (simp add: mult_less_mono2)
   764 qed
   776 qed
   765 
   777 
   766 lemma nat_mult_1: "(1::nat) * n = n"
   778 lemma nat_mult_1: "(1::nat) * n = n"
   788 text {* non-strict, in both arguments *}
   800 text {* non-strict, in both arguments *}
   789 lemma add_le_mono: "[| i \<le> j;  k \<le> l |] ==> i + k \<le> j + (l::nat)"
   801 lemma add_le_mono: "[| i \<le> j;  k \<le> l |] ==> i + k \<le> j + (l::nat)"
   790   by (rule add_mono)
   802   by (rule add_mono)
   791 
   803 
   792 lemma le_add2: "n \<le> ((m + n)::nat)"
   804 lemma le_add2: "n \<le> ((m + n)::nat)"
   793   apply (induct m, simp_all)
   805   by (insert add_right_mono [of 0 m n], simp) 
   794   apply (erule le_SucI)
       
   795   done
       
   796 
   806 
   797 lemma le_add1: "n \<le> ((n + m)::nat)"
   807 lemma le_add1: "n \<le> ((n + m)::nat)"
   798   apply (simp add: add_ac)
   808   by (simp add: add_commute, rule le_add2)
   799   apply (rule le_add2)
       
   800   done
       
   801 
   809 
   802 lemma less_add_Suc1: "i < Suc (i + m)"
   810 lemma less_add_Suc1: "i < Suc (i + m)"
   803   by (rule le_less_trans, rule le_add1, rule lessI)
   811   by (rule le_less_trans, rule le_add1, rule lessI)
   804 
   812 
   805 lemma less_add_Suc2: "i < Suc (m + i)"
   813 lemma less_add_Suc2: "i < Suc (m + i)"
   806   by (rule le_less_trans, rule le_add2, rule lessI)
   814   by (rule le_less_trans, rule le_add2, rule lessI)
   807 
   815 
   808 lemma less_iff_Suc_add: "(m < n) = (\<exists>k. n = Suc (m + k))"
   816 lemma less_iff_Suc_add: "(m < n) = (\<exists>k. n = Suc (m + k))"
   809   by (rules intro!: less_add_Suc1 less_imp_Suc_add)
   817   by (rules intro!: less_add_Suc1 less_imp_Suc_add)
   810 
   818 
   811 
       
   812 lemma trans_le_add1: "(i::nat) \<le> j ==> i \<le> j + m"
   819 lemma trans_le_add1: "(i::nat) \<le> j ==> i \<le> j + m"
   813   by (rule le_trans, assumption, rule le_add1)
   820   by (rule le_trans, assumption, rule le_add1)
   814 
   821 
   815 lemma trans_le_add2: "(i::nat) \<le> j ==> i \<le> m + j"
   822 lemma trans_le_add2: "(i::nat) \<le> j ==> i \<le> m + j"
   816   by (rule le_trans, assumption, rule le_add2)
   823   by (rule le_trans, assumption, rule le_add2)
   820 
   827 
   821 lemma trans_less_add2: "(i::nat) < j ==> i < m + j"
   828 lemma trans_less_add2: "(i::nat) < j ==> i < m + j"
   822   by (rule less_le_trans, assumption, rule le_add2)
   829   by (rule less_le_trans, assumption, rule le_add2)
   823 
   830 
   824 lemma add_lessD1: "i + j < (k::nat) ==> i < k"
   831 lemma add_lessD1: "i + j < (k::nat) ==> i < k"
   825   apply (induct j, simp_all)
   832   apply (rule le_less_trans [of _ "i+j"]) 
   826   apply (blast dest: Suc_lessD)
   833   apply (simp_all add: le_add1)
   827   done
   834   done
   828 
   835 
   829 lemma not_add_less1 [iff]: "~ (i + j < (i::nat))"
   836 lemma not_add_less1 [iff]: "~ (i + j < (i::nat))"
   830   apply (rule notI)
   837   apply (rule notI)
   831   apply (erule add_lessD1 [THEN less_irrefl])
   838   apply (erule add_lessD1 [THEN less_irrefl])
   833 
   840 
   834 lemma not_add_less2 [iff]: "~ (j + i < (i::nat))"
   841 lemma not_add_less2 [iff]: "~ (j + i < (i::nat))"
   835   by (simp add: add_commute not_add_less1)
   842   by (simp add: add_commute not_add_less1)
   836 
   843 
   837 lemma add_leD1: "m + k \<le> n ==> m \<le> (n::nat)"
   844 lemma add_leD1: "m + k \<le> n ==> m \<le> (n::nat)"
   838   by (induct k) (simp_all add: le_simps)
   845   apply (rule order_trans [of _ "m+k"]) 
       
   846   apply (simp_all add: le_add1)
       
   847   done
   839 
   848 
   840 lemma add_leD2: "m + k \<le> n ==> k \<le> (n::nat)"
   849 lemma add_leD2: "m + k \<le> n ==> k \<le> (n::nat)"
   841   apply (simp add: add_commute)
   850   apply (simp add: add_commute)
   842   apply (erule add_leD1)
   851   apply (erule add_leD1)
   843   done
   852   done
   967 
   976 
   968 
   977 
   969 subsection {* Monotonicity of Multiplication *}
   978 subsection {* Monotonicity of Multiplication *}
   970 
   979 
   971 lemma mult_le_mono1: "i \<le> (j::nat) ==> i * k \<le> j * k"
   980 lemma mult_le_mono1: "i \<le> (j::nat) ==> i * k \<le> j * k"
   972   by (induct k) (simp_all add: add_le_mono)
   981   by (simp add: mult_right_mono) 
   973 
   982 
   974 lemma mult_le_mono2: "i \<le> (j::nat) ==> k * i \<le> k * j"
   983 lemma mult_le_mono2: "i \<le> (j::nat) ==> k * i \<le> k * j"
   975   apply (drule mult_le_mono1)
   984   by (simp add: mult_left_mono) 
   976   apply (simp add: mult_commute)
       
   977   done
       
   978 
   985 
   979 text {* @{text "\<le>"} monotonicity, BOTH arguments *}
   986 text {* @{text "\<le>"} monotonicity, BOTH arguments *}
   980 lemma mult_le_mono: "i \<le> (j::nat) ==> k \<le> l ==> i * k \<le> j * l"
   987 lemma mult_le_mono: "i \<le> (j::nat) ==> k \<le> l ==> i * k \<le> j * l"
   981   apply (erule mult_le_mono1 [THEN le_trans])
   988   by (simp add: mult_mono) 
   982   apply (erule mult_le_mono2)
       
   983   done
       
   984 
   989 
   985 lemma mult_less_mono1: "(i::nat) < j ==> 0 < k ==> i * k < j * k"
   990 lemma mult_less_mono1: "(i::nat) < j ==> 0 < k ==> i * k < j * k"
   986   by (drule mult_less_mono2) (simp_all add: mult_commute)
   991   by (simp add: mult_strict_right_mono) 
   987 
   992 
   988 text{*Differs from the standard @{text zero_less_mult_iff} in that
   993 text{*Differs from the standard @{text zero_less_mult_iff} in that
   989       there are no negative numbers.*}
   994       there are no negative numbers.*}
   990 lemma nat_0_less_mult_iff [simp]: "(0 < (m::nat) * n) = (0 < m & 0 < n)"
   995 lemma nat_0_less_mult_iff [simp]: "(0 < (m::nat) * n) = (0 < m & 0 < n)"
   991   apply (induct m)
   996   apply (induct m)
  1005 lemma one_eq_mult_iff [simp]: "(Suc 0 = m * n) = (m = 1 & n = 1)"
  1010 lemma one_eq_mult_iff [simp]: "(Suc 0 = m * n) = (m = 1 & n = 1)"
  1006   apply (rule trans)
  1011   apply (rule trans)
  1007   apply (rule_tac [2] mult_eq_1_iff, fastsimp)
  1012   apply (rule_tac [2] mult_eq_1_iff, fastsimp)
  1008   done
  1013   done
  1009 
  1014 
  1010 lemma mult_less_cancel2: "((m::nat) * k < n * k) = (0 < k & m < n)"
  1015 lemma mult_less_cancel2 [simp]: "((m::nat) * k < n * k) = (0 < k & m < n)"
  1011   apply (safe intro!: mult_less_mono1)
  1016   apply (safe intro!: mult_less_mono1)
  1012   apply (case_tac k, auto)
  1017   apply (case_tac k, auto)
  1013   apply (simp del: le_0_eq add: linorder_not_le [symmetric])
  1018   apply (simp del: le_0_eq add: linorder_not_le [symmetric])
  1014   apply (blast intro: mult_le_mono1)
  1019   apply (blast intro: mult_le_mono1)
  1015   done
  1020   done
  1016 
  1021 
  1017 lemma mult_less_cancel1 [simp]: "(k * (m::nat) < k * n) = (0 < k & m < n)"
  1022 lemma mult_less_cancel1 [simp]: "(k * (m::nat) < k * n) = (0 < k & m < n)"
  1018   by (simp add: mult_less_cancel2 mult_commute [of k])
  1023   by (simp add: mult_commute [of k])
  1019 
       
  1020 declare mult_less_cancel2 [simp]
       
  1021 
  1024 
  1022 lemma mult_le_cancel1 [simp]: "(k * (m::nat) \<le> k * n) = (0 < k --> m \<le> n)"
  1025 lemma mult_le_cancel1 [simp]: "(k * (m::nat) \<le> k * n) = (0 < k --> m \<le> n)"
  1023 by (simp add: linorder_not_less [symmetric], auto)
  1026 by (simp add: linorder_not_less [symmetric], auto)
  1024 
  1027 
  1025 lemma mult_le_cancel2 [simp]: "((m::nat) * k \<le> n * k) = (0 < k --> m \<le> n)"
  1028 lemma mult_le_cancel2 [simp]: "((m::nat) * k \<le> n * k) = (0 < k --> m \<le> n)"
  1026 by (simp add: linorder_not_less [symmetric], auto)
  1029 by (simp add: linorder_not_less [symmetric], auto)
  1027 
  1030 
  1028 lemma mult_cancel2: "(m * k = n * k) = (m = n | (k = (0::nat)))"
  1031 lemma mult_cancel2 [simp]: "(m * k = n * k) = (m = n | (k = (0::nat)))"
  1029   apply (cut_tac less_linear, safe, auto)
  1032   apply (cut_tac less_linear, safe, auto)
  1030   apply (drule mult_less_mono1, assumption, simp)+
  1033   apply (drule mult_less_mono1, assumption, simp)+
  1031   done
  1034   done
  1032 
  1035 
  1033 lemma mult_cancel1 [simp]: "(k * m = k * n) = (m = n | (k = (0::nat)))"
  1036 lemma mult_cancel1 [simp]: "(k * m = k * n) = (m = n | (k = (0::nat)))"
  1034   by (simp add: mult_cancel2 mult_commute [of k])
  1037   by (simp add: mult_commute [of k])
  1035 
       
  1036 declare mult_cancel2 [simp]
       
  1037 
  1038 
  1038 lemma Suc_mult_less_cancel1: "(Suc k * m < Suc k * n) = (m < n)"
  1039 lemma Suc_mult_less_cancel1: "(Suc k * m < Suc k * n) = (m < n)"
  1039   by (subst mult_less_cancel1) simp
  1040   by (subst mult_less_cancel1) simp
  1040 
  1041 
  1041 lemma Suc_mult_le_cancel1: "(Suc k * m \<le> Suc k * n) = (m \<le> n)"
  1042 lemma Suc_mult_le_cancel1: "(Suc k * m \<le> Suc k * n) = (m \<le> n)"
  1042   by (subst mult_le_cancel1) simp
  1043   by (subst mult_le_cancel1) simp
  1043 
  1044 
  1044 lemma Suc_mult_cancel1: "(Suc k * m = Suc k * n) = (m = n)"
  1045 lemma Suc_mult_cancel1: "(Suc k * m = Suc k * n) = (m = n)"
  1045   by (subst mult_cancel1) simp
  1046   by (subst mult_cancel1) simp
  1046 
       
  1047 
  1047 
  1048 text {* Lemma for @{text gcd} *}
  1048 text {* Lemma for @{text gcd} *}
  1049 lemma mult_eq_self_implies_10: "(m::nat) = m * n ==> n = 1 | m = 0"
  1049 lemma mult_eq_self_implies_10: "(m::nat) = m * n ==> n = 1 | m = 0"
  1050   apply (drule sym)
  1050   apply (drule sym)
  1051   apply (rule disjCI)
  1051   apply (rule disjCI)
  1052   apply (rule nat_less_cases, erule_tac [2] _)
  1052   apply (rule nat_less_cases, erule_tac [2] _)
  1053   apply (fastsimp elim!: less_SucE)
  1053   apply (fastsimp elim!: less_SucE)
  1054   apply (fastsimp dest: mult_less_mono2)
  1054   apply (fastsimp dest: mult_less_mono2)
  1055   done
  1055   done
  1056 
  1056 
  1057 
       
  1058 end
  1057 end