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: |