src/HOL/Word/Bit_Representation.thy
changeset 67160 f37bf261bdf6
parent 67142 fa1173288322
child 70169 8bb835f10a39
equal deleted inserted replaced
67159:deccbba7cfe3 67160:f37bf261bdf6
   140   by (metis bin_rl_simp)
   140   by (metis bin_rl_simp)
   141 
   141 
   142 lemma bin_exhaust: "(\<And>x b. bin = x BIT b \<Longrightarrow> Q) \<Longrightarrow> Q"
   142 lemma bin_exhaust: "(\<And>x b. bin = x BIT b \<Longrightarrow> Q) \<Longrightarrow> Q"
   143 by (metis bin_ex_rl)
   143 by (metis bin_ex_rl)
   144 
   144 
   145 primrec bin_nth
   145 primrec bin_nth :: "int \<Rightarrow> nat \<Rightarrow> bool"
   146   where
   146   where
   147     Z: "bin_nth w 0 \<longleftrightarrow> bin_last w"
   147     Z: "bin_nth w 0 \<longleftrightarrow> bin_last w"
   148   | Suc: "bin_nth w (Suc n) \<longleftrightarrow> bin_nth (bin_rest w) n"
   148   | Suc: "bin_nth w (Suc n) \<longleftrightarrow> bin_nth (bin_rest w) n"
       
   149 
       
   150 lemma bin_nth_eq_mod:
       
   151   "bin_nth w n \<longleftrightarrow> odd (w div 2 ^ n)"
       
   152   by (induction n arbitrary: w) (simp_all add: bin_last_def bin_rest_def odd_iff_mod_2_eq_one zdiv_zmult2_eq)
   149 
   153 
   150 lemma bin_abs_lem: "bin = (w BIT b) \<Longrightarrow> bin \<noteq> -1 \<longrightarrow> bin \<noteq> 0 \<longrightarrow> nat \<bar>w\<bar> < nat \<bar>bin\<bar>"
   154 lemma bin_abs_lem: "bin = (w BIT b) \<Longrightarrow> bin \<noteq> -1 \<longrightarrow> bin \<noteq> 0 \<longrightarrow> nat \<bar>w\<bar> < nat \<bar>bin\<bar>"
   151   apply clarsimp
   155   apply clarsimp
   152   apply (unfold Bit_def)
   156   apply (unfold Bit_def)
   153   apply (cases b)
   157   apply (cases b)
   264 primrec sbintrunc :: "nat \<Rightarrow> int \<Rightarrow> int"
   268 primrec sbintrunc :: "nat \<Rightarrow> int \<Rightarrow> int"
   265   where
   269   where
   266     Z : "sbintrunc 0 bin = (if bin_last bin then -1 else 0)"
   270     Z : "sbintrunc 0 bin = (if bin_last bin then -1 else 0)"
   267   | Suc : "sbintrunc (Suc n) bin = sbintrunc n (bin_rest bin) BIT (bin_last bin)"
   271   | Suc : "sbintrunc (Suc n) bin = sbintrunc n (bin_rest bin) BIT (bin_last bin)"
   268 
   272 
   269 lemma sign_bintr: "bin_sign (bintrunc n w) = 0"
       
   270   by (induct n arbitrary: w) auto
       
   271 
       
   272 lemma bintrunc_mod2p: "bintrunc n w = w mod 2 ^ n"
   273 lemma bintrunc_mod2p: "bintrunc n w = w mod 2 ^ n"
   273   by (induct n arbitrary: w) (auto simp add: bin_last_def bin_rest_def Bit_def zmod_zmult2_eq)
   274   by (induct n arbitrary: w) (auto simp add: bin_last_def bin_rest_def Bit_def zmod_zmult2_eq)
   274 
   275 
   275 lemma sbintrunc_mod2p: "sbintrunc n w = (w + 2 ^ n) mod 2 ^ (Suc n) - 2 ^ n"
   276 lemma sbintrunc_mod2p: "sbintrunc n w = (w + 2 ^ n) mod 2 ^ Suc n - 2 ^ n"
   276   apply (induct n arbitrary: w)
   277 proof (induction n arbitrary: w)
   277    apply (auto simp add: bin_last_odd bin_rest_def Bit_def elim!: evenE oddE)
   278   case 0
   278    apply (smt pos_zmod_mult_2 zle2p)
   279   then show ?case
   279   apply (simp add: mult_mod_right)
   280     by (auto simp add: bin_last_odd odd_iff_mod_2_eq_one)
   280   done
   281 next
       
   282   case (Suc n)
       
   283   moreover have "((bin_rest w + 2 ^ n) mod (2 * 2 ^ n) - 2 ^ n) BIT bin_last w =
       
   284     (w + 2 * 2 ^ n) mod (4 * 2 ^ n) - 2 * 2 ^ n"
       
   285   proof (cases w rule: parity_cases)
       
   286     case even
       
   287     then show ?thesis
       
   288       by (simp add: bin_last_odd bin_rest_def Bit_B0_2t mult_mod_right)
       
   289   next
       
   290     case odd
       
   291     then have "2 * (w div 2) = w - 1"
       
   292       using minus_mod_eq_mult_div [of w 2] by simp
       
   293     moreover have "(2 * 2 ^ n + w - 1) mod (2 * 2 * 2 ^ n) + 1 = (2 * 2 ^ n + w) mod (2 * 2 * 2 ^ n)"
       
   294       using odd emep1 [of "2 * 2 ^ n + w - 1" "2 * 2 * 2 ^ n"] by simp
       
   295     ultimately show ?thesis 
       
   296       using odd by (simp add: bin_last_odd bin_rest_def Bit_B1_2t mult_mod_right) (simp add: algebra_simps)
       
   297   qed
       
   298   ultimately show ?case
       
   299     by simp
       
   300 qed
   281 
   301 
   282 
   302 
   283 subsection "Simplifications for (s)bintrunc"
   303 subsection "Simplifications for (s)bintrunc"
   284 
   304 
       
   305 lemma sign_bintr: "bin_sign (bintrunc n w) = 0"
       
   306   by (simp add: bintrunc_mod2p bin_sign_def)
       
   307 
   285 lemma bintrunc_n_0 [simp]: "bintrunc n 0 = 0"
   308 lemma bintrunc_n_0 [simp]: "bintrunc n 0 = 0"
   286   by (induct n) auto
   309   by (simp add: bintrunc_mod2p)
   287 
   310 
   288 lemma sbintrunc_n_0 [simp]: "sbintrunc n 0 = 0"
   311 lemma sbintrunc_n_0 [simp]: "sbintrunc n 0 = 0"
   289   by (induct n) auto
   312   by (simp add: sbintrunc_mod2p)
   290 
   313 
   291 lemma sbintrunc_n_minus1 [simp]: "sbintrunc n (- 1) = -1"
   314 lemma sbintrunc_n_minus1 [simp]: "sbintrunc n (- 1) = -1"
   292   by (induct n) auto
   315   by (induct n) auto
   293 
   316 
   294 lemma bintrunc_Suc_numeral:
   317 lemma bintrunc_Suc_numeral: