src/HOL/Integ/NatBin.ML
changeset 8028 5357e8eb09c8
parent 7625 94b2a50e69a5
child 8116 759f712f8f06
equal deleted inserted replaced
8027:8a27d0579e37 8028:5357e8eb09c8
    64 by (simp_tac (simpset() addsimps [Suc_nat_number_of]) 1);
    64 by (simp_tac (simpset() addsimps [Suc_nat_number_of]) 1);
    65 qed "Suc_numeral_1_eq_2";
    65 qed "Suc_numeral_1_eq_2";
    66 
    66 
    67 (** Addition **)
    67 (** Addition **)
    68 
    68 
    69 Goal "[| (#0::int) <= z;  #0 <= z' |] ==> nat z + nat z' = nat (z+z')";
    69 Goal "[| (#0::int) <= z;  #0 <= z' |] ==> nat (z+z') = nat z + nat z'";
    70 by (rtac (inj_int RS injD) 1);
    70 by (rtac (inj_int RS injD) 1);
    71 by (asm_simp_tac (simpset() addsimps [zadd_int RS sym]) 1);
    71 by (asm_simp_tac (simpset() addsimps [zadd_int RS sym]) 1);
    72 qed "add_nat_eq_nat_zadd";
    72 qed "nat_add_distrib";
    73 
    73 
    74 (*"neg" is used in rewrite rules for binary comparisons*)
    74 (*"neg" is used in rewrite rules for binary comparisons*)
    75 Goal "(number_of v :: nat) + number_of v' = \
    75 Goal "(number_of v :: nat) + number_of v' = \
    76 \        (if neg (number_of v) then number_of v' \
    76 \        (if neg (number_of v) then number_of v' \
    77 \         else if neg (number_of v') then number_of v \
    77 \         else if neg (number_of v') then number_of v \
    78 \         else number_of (bin_add v v'))";
    78 \         else number_of (bin_add v v'))";
    79 by (simp_tac
    79 by (simp_tac
    80     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
    80     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
    81 				  add_nat_eq_nat_zadd, number_of_add]) 1);
    81 				  nat_add_distrib RS sym, number_of_add]) 1);
    82 qed "add_nat_number_of";
    82 qed "add_nat_number_of";
    83 
    83 
    84 Addsimps [add_nat_number_of];
    84 Addsimps [add_nat_number_of];
    85 
    85 
    86 
    86 
    87 (** Subtraction **)
    87 (** Subtraction **)
    88 
    88 
    89 Goal "[| (#0::int) <= z';  z' <= z |] ==> nat z - nat z' = nat (z-z')";
    89 Goal "[| (#0::int) <= z';  z' <= z |] ==> nat (z-z') = nat z - nat z'";
    90 by (rtac (inj_int RS injD) 1);
    90 by (rtac (inj_int RS injD) 1);
    91 by (asm_simp_tac (simpset() addsimps [zdiff_int RS sym, nat_le_eq_zle]) 1);
    91 by (asm_simp_tac (simpset() addsimps [zdiff_int RS sym, nat_le_eq_zle]) 1);
    92 qed "diff_nat_eq_nat_zdiff";
    92 qed "nat_diff_distrib";
    93 
    93 
    94 
    94 
    95 Goal "nat z - nat z' = \
    95 Goal "nat z - nat z' = \
    96 \       (if neg z' then nat z  \
    96 \       (if neg z' then nat z  \
    97 \        else let d = z-z' in    \
    97 \        else let d = z-z' in    \
    98 \             if neg d then 0 else nat d)";
    98 \             if neg d then 0 else nat d)";
    99 by (simp_tac (simpset() addsimps [Let_def, diff_nat_eq_nat_zdiff,
    99 by (simp_tac (simpset() addsimps [Let_def, nat_diff_distrib RS sym,
   100 				  neg_eq_less_0, not_neg_eq_ge_0]) 1);
   100 				  neg_eq_less_0, not_neg_eq_ge_0]) 1);
   101 by (simp_tac (simpset() addsimps zcompare_rls@
   101 by (simp_tac (simpset() addsimps zcompare_rls@
   102 		                 [diff_is_0_eq, nat_le_eq_zle]) 1);
   102 		                 [diff_is_0_eq, nat_le_eq_zle]) 1);
   103 qed "diff_nat_eq_if";
   103 qed "diff_nat_eq_if";
   104 
   104 
   116 Addsimps [diff_nat_number_of];
   116 Addsimps [diff_nat_number_of];
   117 
   117 
   118 
   118 
   119 (** Multiplication **)
   119 (** Multiplication **)
   120 
   120 
   121 Goal "(#0::int) <= z ==> nat z * nat z' = nat (z*z')";
   121 Goal "(#0::int) <= z ==> nat (z*z') = nat z * nat z'";
   122 by (case_tac "#0 <= z'" 1);
   122 by (case_tac "#0 <= z'" 1);
   123 by (subgoal_tac "z'*z <= #0" 2);
   123 by (subgoal_tac "z'*z <= #0" 2);
   124 by (rtac (neg_imp_zmult_nonpos_iff RS iffD2) 3);
   124 by (rtac (neg_imp_zmult_nonpos_iff RS iffD2) 3);
   125 by (auto_tac (claset(),
   125 by (auto_tac (claset(),
   126 	      simpset() addsimps [zmult_commute]));
   126 	      simpset() addsimps [zmult_commute]));
   127 by (subgoal_tac "#0 <= z*z'" 1);
   127 by (subgoal_tac "#0 <= z*z'" 1);
   128 by (force_tac (claset() addDs [zmult_zle_mono1], simpset()) 2);
   128 by (force_tac (claset() addDs [zmult_zle_mono1], simpset()) 2);
   129 by (rtac (inj_int RS injD) 1);
   129 by (rtac (inj_int RS injD) 1);
   130 by (asm_simp_tac (simpset() addsimps [zmult_int RS sym]) 1);
   130 by (asm_simp_tac (simpset() addsimps [zmult_int RS sym]) 1);
   131 qed "mult_nat_eq_nat_zmult";
   131 qed "nat_mult_distrib";
   132 
   132 
   133 Goal "(number_of v :: nat) * number_of v' = \
   133 Goal "(number_of v :: nat) * number_of v' = \
   134 \      (if neg (number_of v) then #0 else number_of (bin_mult v v'))";
   134 \      (if neg (number_of v) then #0 else number_of (bin_mult v v'))";
   135 by (simp_tac
   135 by (simp_tac
   136     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   136     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   137 				  mult_nat_eq_nat_zmult, number_of_mult, 
   137 				  nat_mult_distrib RS sym, number_of_mult, 
   138 				  nat_0]) 1);
   138 				  nat_0]) 1);
   139 qed "mult_nat_number_of";
   139 qed "mult_nat_number_of";
   140 
   140 
   141 Addsimps [mult_nat_number_of];
   141 Addsimps [mult_nat_number_of];
   142 
   142 
   143 
   143 
   144 (** Quotient **)
   144 (** Quotient **)
   145 
   145 
   146 Goal "(#0::int) <= z ==> nat z div nat z' = nat (z div z')";
   146 Goal "(#0::int) <= z ==> nat (z div z') = nat z div nat z'";
   147 by (case_tac "#0 <= z'" 1);
   147 by (case_tac "#0 <= z'" 1);
   148 by (auto_tac (claset(), 
   148 by (auto_tac (claset(), 
   149 	      simpset() addsimps [div_nonneg_neg_le0, DIVISION_BY_ZERO_DIV]));
   149 	      simpset() addsimps [div_nonneg_neg_le0, DIVISION_BY_ZERO_DIV]));
   150 by (zdiv_undefined_case_tac "z' = #0" 1);
   150 by (zdiv_undefined_case_tac "z' = #0" 1);
   151  by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_DIV]) 1);
   151  by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_DIV]) 1);
   154 by (subgoal_tac "#0 <= int m div int m'" 1);
   154 by (subgoal_tac "#0 <= int m div int m'" 1);
   155  by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, 
   155  by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, 
   156 				       pos_imp_zdiv_nonneg_iff]) 2);
   156 				       pos_imp_zdiv_nonneg_iff]) 2);
   157 by (rtac (inj_int RS injD) 1);
   157 by (rtac (inj_int RS injD) 1);
   158 by (Asm_simp_tac 1);
   158 by (Asm_simp_tac 1);
   159 by (rtac sym 1);
       
   160 by (res_inst_tac [("r", "int (m mod m')")] quorem_div 1);
   159 by (res_inst_tac [("r", "int (m mod m')")] quorem_div 1);
   161  by (Force_tac 2);
   160  by (Force_tac 2);
   162 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, 
   161 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, 
   163 				      numeral_0_eq_0, zadd_int, zmult_int, 
   162 				      numeral_0_eq_0, zadd_int, zmult_int, 
   164 				      mod_less_divisor]) 1);
   163 				      mod_less_divisor]) 1);
   165 by (rtac (mod_div_equality RS sym RS trans) 1);
   164 by (rtac (mod_div_equality RS sym RS trans) 1);
   166 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1);
   165 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1);
   167 qed "div_nat_eq_nat_zdiv";
   166 qed "nat_div_distrib";
   168 
   167 
   169 Goal "(number_of v :: nat)  div  number_of v' = \
   168 Goal "(number_of v :: nat)  div  number_of v' = \
   170 \         (if neg (number_of v) then #0 \
   169 \         (if neg (number_of v) then #0 \
   171 \          else nat (number_of v div number_of v'))";
   170 \          else nat (number_of v div number_of v'))";
   172 by (simp_tac
   171 by (simp_tac
   173     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, 
   172     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, 
   174 				  div_nat_eq_nat_zdiv, nat_0]) 1);
   173 				  nat_div_distrib RS sym, nat_0]) 1);
   175 qed "div_nat_number_of";
   174 qed "div_nat_number_of";
   176 
   175 
   177 Addsimps [div_nat_number_of];
   176 Addsimps [div_nat_number_of];
   178 
   177 
   179 
   178 
   180 (** Remainder **)
   179 (** Remainder **)
   181 
   180 
   182 (*Fails if z'<0: the LHS collapses to (nat z) but the RHS doesn't*)
   181 (*Fails if z'<0: the LHS collapses to (nat z) but the RHS doesn't*)
   183 Goal "[| (#0::int) <= z;  #0 <= z' |] ==> nat z mod nat z' = nat (z mod z')";
   182 Goal "[| (#0::int) <= z;  #0 <= z' |] ==> nat (z mod z') = nat z mod nat z'";
   184 by (zdiv_undefined_case_tac "z' = #0" 1);
   183 by (zdiv_undefined_case_tac "z' = #0" 1);
   185  by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_MOD]) 1);
   184  by (simp_tac (simpset() addsimps [numeral_0_eq_0, DIVISION_BY_ZERO_MOD]) 1);
   186 by (auto_tac (claset() addSEs [nonneg_eq_int], simpset()));
   185 by (auto_tac (claset() addSEs [nonneg_eq_int], simpset()));
   187 by (rename_tac "m m'" 1);
   186 by (rename_tac "m m'" 1);
   188 by (subgoal_tac "#0 <= int m mod int m'" 1);
   187 by (subgoal_tac "#0 <= int m mod int m'" 1);
   189  by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, 
   188  by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, numeral_0_eq_0, 
   190 				       pos_mod_sign]) 2);
   189 				       pos_mod_sign]) 2);
   191 by (rtac (inj_int RS injD) 1);
   190 by (rtac (inj_int RS injD) 1);
   192 by (Asm_simp_tac 1);
   191 by (Asm_simp_tac 1);
   193 by (rtac sym 1);
       
   194 by (res_inst_tac [("q", "int (m div m')")] quorem_mod 1);
   192 by (res_inst_tac [("q", "int (m div m')")] quorem_mod 1);
   195  by (Force_tac 2);
   193  by (Force_tac 2);
   196 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, 
   194 by (asm_simp_tac (simpset() addsimps [nat_less_iff RS sym, quorem_def, 
   197 				      numeral_0_eq_0, zadd_int, zmult_int, 
   195 				      numeral_0_eq_0, zadd_int, zmult_int, 
   198 				      mod_less_divisor]) 1);
   196 				      mod_less_divisor]) 1);
   199 by (rtac (mod_div_equality RS sym RS trans) 1);
   197 by (rtac (mod_div_equality RS sym RS trans) 1);
   200 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1);
   198 by (asm_simp_tac (simpset() addsimps add_ac@mult_ac) 1);
   201 qed "mod_nat_eq_nat_zmod";
   199 qed "nat_mod_distrib";
   202 
   200 
   203 Goal "(number_of v :: nat)  mod  number_of v' = \
   201 Goal "(number_of v :: nat)  mod  number_of v' = \
   204 \       (if neg (number_of v) then #0 \
   202 \       (if neg (number_of v) then #0 \
   205 \        else if neg (number_of v') then number_of v \
   203 \        else if neg (number_of v') then number_of v \
   206 \        else nat (number_of v mod number_of v'))";
   204 \        else nat (number_of v mod number_of v'))";
   207 by (simp_tac
   205 by (simp_tac
   208     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, 
   206     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, 
   209 				  neg_nat, nat_0, DIVISION_BY_ZERO_MOD,
   207 				  neg_nat, nat_0, DIVISION_BY_ZERO_MOD,
   210 				  mod_nat_eq_nat_zmod]) 1);
   208 				  nat_mod_distrib RS sym]) 1);
   211 qed "mod_nat_number_of";
   209 qed "mod_nat_number_of";
   212 
   210 
   213 Addsimps [mod_nat_number_of];
   211 Addsimps [mod_nat_number_of];
   214 
   212 
   215 
   213