src/HOL/Word/Bit_Representation.thy
changeset 47108 2a1953f0d20d
parent 46607 6ae8121448af
child 47163 248376f8881d
equal deleted inserted replaced
47107:35807a5d8dc2 47108:2a1953f0d20d
    45 
    45 
    46 lemma BIT_eq_iff [iff]: "u BIT b = v BIT c \<longleftrightarrow> u = v \<and> b = c"
    46 lemma BIT_eq_iff [iff]: "u BIT b = v BIT c \<longleftrightarrow> u = v \<and> b = c"
    47   by (metis bin_rest_BIT bin_last_BIT)
    47   by (metis bin_rest_BIT bin_last_BIT)
    48 
    48 
    49 lemma BIT_bin_simps [simp]:
    49 lemma BIT_bin_simps [simp]:
    50   "number_of w BIT 0 = number_of (Int.Bit0 w)"
    50   "numeral k BIT 0 = numeral (Num.Bit0 k)"
    51   "number_of w BIT 1 = number_of (Int.Bit1 w)"
    51   "numeral k BIT 1 = numeral (Num.Bit1 k)"
    52   unfolding Bit_def number_of_is_id numeral_simps by simp_all
    52   "neg_numeral k BIT 0 = neg_numeral (Num.Bit0 k)"
       
    53   "neg_numeral k BIT 1 = neg_numeral (Num.BitM k)"
       
    54   unfolding neg_numeral_def numeral.simps numeral_BitM
       
    55   unfolding Bit_def bitval_simps
       
    56   by (simp_all del: arith_simps add_numeral_special diff_numeral_special)
    53 
    57 
    54 lemma BIT_special_simps [simp]:
    58 lemma BIT_special_simps [simp]:
    55   shows "0 BIT 0 = 0" and "0 BIT 1 = 1" and "1 BIT 0 = 2" and "1 BIT 1 = 3"
    59   shows "0 BIT 0 = 0" and "0 BIT 1 = 1" and "1 BIT 0 = 2" and "1 BIT 1 = 3"
    56   unfolding Bit_def by simp_all
    60   unfolding Bit_def by simp_all
       
    61 
       
    62 lemma BitM_inc: "Num.BitM (Num.inc w) = Num.Bit1 w"
       
    63   by (induct w, simp_all)
       
    64 
       
    65 lemma expand_BIT:
       
    66   "numeral (Num.Bit0 w) = numeral w BIT 0"
       
    67   "numeral (Num.Bit1 w) = numeral w BIT 1"
       
    68   "neg_numeral (Num.Bit0 w) = neg_numeral w BIT 0"
       
    69   "neg_numeral (Num.Bit1 w) = neg_numeral (w + Num.One) BIT 1"
       
    70   unfolding add_One by (simp_all add: BitM_inc)
    57 
    71 
    58 lemma bin_last_numeral_simps [simp]:
    72 lemma bin_last_numeral_simps [simp]:
    59   "bin_last 0 = 0"
    73   "bin_last 0 = 0"
    60   "bin_last 1 = 1"
    74   "bin_last 1 = 1"
    61   "bin_last -1 = 1"
    75   "bin_last -1 = 1"
    62   "bin_last (number_of (Int.Bit0 w)) = 0"
    76   "bin_last Numeral1 = 1"
    63   "bin_last (number_of (Int.Bit1 w)) = 1"
    77   "bin_last (numeral (Num.Bit0 w)) = 0"
    64   unfolding bin_last_def by simp_all
    78   "bin_last (numeral (Num.Bit1 w)) = 1"
       
    79   "bin_last (neg_numeral (Num.Bit0 w)) = 0"
       
    80   "bin_last (neg_numeral (Num.Bit1 w)) = 1"
       
    81   unfolding expand_BIT bin_last_BIT by (simp_all add: bin_last_def)
    65 
    82 
    66 lemma bin_rest_numeral_simps [simp]:
    83 lemma bin_rest_numeral_simps [simp]:
    67   "bin_rest 0 = 0"
    84   "bin_rest 0 = 0"
    68   "bin_rest 1 = 0"
    85   "bin_rest 1 = 0"
    69   "bin_rest -1 = -1"
    86   "bin_rest -1 = -1"
    70   "bin_rest (number_of (Int.Bit0 w)) = number_of w"
    87   "bin_rest Numeral1 = 0"
    71   "bin_rest (number_of (Int.Bit1 w)) = number_of w"
    88   "bin_rest (numeral (Num.Bit0 w)) = numeral w"
    72   unfolding bin_rest_def by simp_all
    89   "bin_rest (numeral (Num.Bit1 w)) = numeral w"
    73 
    90   "bin_rest (neg_numeral (Num.Bit0 w)) = neg_numeral w"
    74 lemma BIT_B0_eq_Bit0: "w BIT 0 = Int.Bit0 w"
    91   "bin_rest (neg_numeral (Num.Bit1 w)) = neg_numeral (w + Num.One)"
    75   unfolding Bit_def Bit0_def by simp
    92   unfolding expand_BIT bin_rest_BIT by (simp_all add: bin_rest_def)
    76 
       
    77 lemma BIT_B1_eq_Bit1: "w BIT 1 = Int.Bit1 w"
       
    78   unfolding Bit_def Bit1_def by simp
       
    79 
       
    80 lemmas BIT_simps = BIT_B0_eq_Bit0 BIT_B1_eq_Bit1
       
    81 
       
    82 lemma number_of_False_cong: 
       
    83   "False \<Longrightarrow> number_of x = number_of y"
       
    84   by (rule FalseE)
       
    85 
    93 
    86 lemma less_Bits: 
    94 lemma less_Bits: 
    87   "(v BIT b < w BIT c) = (v < w | v <= w & b = (0::bit) & c = (1::bit))"
    95   "(v BIT b < w BIT c) = (v < w | v <= w & b = (0::bit) & c = (1::bit))"
    88   unfolding Bit_def by (auto simp add: bitval_def split: bit.split)
    96   unfolding Bit_def by (auto simp add: bitval_def split: bit.split)
    89 
    97 
   119   apply (cases y rule: bit.exhaust, simp)
   127   apply (cases y rule: bit.exhaust, simp)
   120   apply (simp add: ne)
   128   apply (simp add: ne)
   121   done
   129   done
   122 
   130 
   123 lemma bin_ex_rl: "EX w b. w BIT b = bin"
   131 lemma bin_ex_rl: "EX w b. w BIT b = bin"
   124   apply (unfold Bit_def)
   132   by (metis bin_rl_simp)
   125   apply (cases "even bin")
       
   126    apply (clarsimp simp: even_equiv_def)
       
   127    apply (auto simp: odd_equiv_def bitval_def split: bit.split)
       
   128   done
       
   129 
   133 
   130 lemma bin_exhaust:
   134 lemma bin_exhaust:
   131   assumes Q: "\<And>x b. bin = x BIT b \<Longrightarrow> Q"
   135   assumes Q: "\<And>x b. bin = x BIT b \<Longrightarrow> Q"
   132   shows "Q"
   136   shows "Q"
   133   apply (insert bin_ex_rl [of bin])  
   137   apply (insert bin_ex_rl [of bin])  
   142 primrec bin_nth where
   146 primrec bin_nth where
   143   Z: "bin_nth w 0 = (bin_last w = (1::bit))"
   147   Z: "bin_nth w 0 = (bin_last w = (1::bit))"
   144   | Suc: "bin_nth w (Suc n) = bin_nth (bin_rest w) n"
   148   | Suc: "bin_nth w (Suc n) = bin_nth (bin_rest w) n"
   145 
   149 
   146 lemma bin_abs_lem:
   150 lemma bin_abs_lem:
   147   "bin = (w BIT b) ==> ~ bin = Int.Min --> ~ bin = Int.Pls -->
   151   "bin = (w BIT b) ==> bin ~= -1 --> bin ~= 0 -->
   148     nat (abs w) < nat (abs bin)"
   152     nat (abs w) < nat (abs bin)"
   149   apply clarsimp
   153   apply clarsimp
   150   apply (unfold Pls_def Min_def Bit_def)
   154   apply (unfold Bit_def)
   151   apply (cases b)
   155   apply (cases b)
   152    apply (clarsimp, arith)
   156    apply (clarsimp, arith)
   153   apply (clarsimp, arith)
   157   apply (clarsimp, arith)
   154   done
   158   done
   155 
   159 
   156 lemma bin_induct:
   160 lemma bin_induct:
   157   assumes PPls: "P Int.Pls"
   161   assumes PPls: "P 0"
   158     and PMin: "P Int.Min"
   162     and PMin: "P -1"
   159     and PBit: "!!bin bit. P bin ==> P (bin BIT bit)"
   163     and PBit: "!!bin bit. P bin ==> P (bin BIT bit)"
   160   shows "P bin"
   164   shows "P bin"
   161   apply (rule_tac P=P and a=bin and f1="nat o abs" 
   165   apply (rule_tac P=P and a=bin and f1="nat o abs" 
   162                   in wf_measure [THEN wf_induct])
   166                   in wf_measure [THEN wf_induct])
   163   apply (simp add: measure_def inv_image_def)
   167   apply (simp add: measure_def inv_image_def)
   164   apply (case_tac x rule: bin_exhaust)
   168   apply (case_tac x rule: bin_exhaust)
   165   apply (frule bin_abs_lem)
   169   apply (frule bin_abs_lem)
   166   apply (auto simp add : PPls PMin PBit)
   170   apply (auto simp add : PPls PMin PBit)
   167   done
   171   done
   168 
   172 
   169 lemma numeral_induct:
       
   170   assumes Pls: "P Int.Pls"
       
   171   assumes Min: "P Int.Min"
       
   172   assumes Bit0: "\<And>w. \<lbrakk>P w; w \<noteq> Int.Pls\<rbrakk> \<Longrightarrow> P (Int.Bit0 w)"
       
   173   assumes Bit1: "\<And>w. \<lbrakk>P w; w \<noteq> Int.Min\<rbrakk> \<Longrightarrow> P (Int.Bit1 w)"
       
   174   shows "P x"
       
   175   apply (induct x rule: bin_induct)
       
   176     apply (rule Pls)
       
   177    apply (rule Min)
       
   178   apply (case_tac bit)
       
   179    apply (case_tac "bin = Int.Pls")
       
   180     apply (simp add: BIT_simps)
       
   181    apply (simp add: Bit0 BIT_simps)
       
   182   apply (case_tac "bin = Int.Min")
       
   183    apply (simp add: BIT_simps)
       
   184   apply (simp add: Bit1 BIT_simps)
       
   185   done
       
   186 
       
   187 lemma bin_rest_simps [simp]: 
       
   188   "bin_rest Int.Pls = Int.Pls"
       
   189   "bin_rest Int.Min = Int.Min"
       
   190   "bin_rest (Int.Bit0 w) = w"
       
   191   "bin_rest (Int.Bit1 w) = w"
       
   192   unfolding numeral_simps by (auto simp: bin_rest_def)
       
   193 
       
   194 lemma bin_last_simps [simp]: 
       
   195   "bin_last Int.Pls = (0::bit)"
       
   196   "bin_last Int.Min = (1::bit)"
       
   197   "bin_last (Int.Bit0 w) = (0::bit)"
       
   198   "bin_last (Int.Bit1 w) = (1::bit)"
       
   199   unfolding numeral_simps by (auto simp: bin_last_def z1pmod2)
       
   200 
       
   201 lemma Bit_div2 [simp]: "(w BIT b) div 2 = w"
   173 lemma Bit_div2 [simp]: "(w BIT b) div 2 = w"
   202   unfolding bin_rest_def [symmetric] by (rule bin_rest_BIT)
   174   unfolding bin_rest_def [symmetric] by (rule bin_rest_BIT)
   203 
   175 
   204 lemma bin_nth_lem [rule_format]:
   176 lemma bin_nth_lem [rule_format]:
   205   "ALL y. bin_nth x = bin_nth y --> x = y"
   177   "ALL y. bin_nth x = bin_nth y --> x = y"
   206   apply (induct x rule: bin_induct [unfolded Pls_def Min_def])
   178   apply (induct x rule: bin_induct)
   207     apply safe
   179     apply safe
   208     apply (erule rev_mp)
   180     apply (erule rev_mp)
   209     apply (induct_tac y rule: bin_induct [unfolded Pls_def Min_def])
   181     apply (induct_tac y rule: bin_induct)
   210       apply safe
   182       apply safe
   211       apply (drule_tac x=0 in fun_cong, force)
   183       apply (drule_tac x=0 in fun_cong, force)
   212      apply (erule notE, rule ext, 
   184      apply (erule notE, rule ext, 
   213             drule_tac x="Suc x" in fun_cong, force)
   185             drule_tac x="Suc x" in fun_cong, force)
   214     apply (drule_tac x=0 in fun_cong, force)
   186     apply (drule_tac x=0 in fun_cong, force)
   215    apply (erule rev_mp)
   187    apply (erule rev_mp)
   216    apply (induct_tac y rule: bin_induct [unfolded Pls_def Min_def])
   188    apply (induct_tac y rule: bin_induct)
   217      apply safe
   189      apply safe
   218      apply (drule_tac x=0 in fun_cong, force)
   190      apply (drule_tac x=0 in fun_cong, force)
   219     apply (erule notE, rule ext, 
   191     apply (erule notE, rule ext, 
   220            drule_tac x="Suc x" in fun_cong, force)
   192            drule_tac x="Suc x" in fun_cong, force)
   221    apply (drule_tac x=0 in fun_cong, force)
   193    apply (drule_tac x=0 in fun_cong, force)
   242   by (induct n) auto
   214   by (induct n) auto
   243 
   215 
   244 lemma bin_nth_1 [simp]: "bin_nth 1 n \<longleftrightarrow> n = 0"
   216 lemma bin_nth_1 [simp]: "bin_nth 1 n \<longleftrightarrow> n = 0"
   245   by (cases n) simp_all
   217   by (cases n) simp_all
   246 
   218 
   247 lemma bin_nth_Pls [simp]: "~ bin_nth Int.Pls n"
       
   248   by (induct n) auto (* FIXME: delete *)
       
   249 
       
   250 lemma bin_nth_minus1 [simp]: "bin_nth -1 n"
   219 lemma bin_nth_minus1 [simp]: "bin_nth -1 n"
   251   by (induct n) auto
   220   by (induct n) auto
   252 
   221 
   253 lemma bin_nth_Min [simp]: "bin_nth Int.Min n"
       
   254   by (induct n) auto (* FIXME: delete *)
       
   255 
       
   256 lemma bin_nth_0_BIT: "bin_nth (w BIT b) 0 = (b = (1::bit))"
   222 lemma bin_nth_0_BIT: "bin_nth (w BIT b) 0 = (b = (1::bit))"
   257   by auto
   223   by auto
   258 
   224 
   259 lemma bin_nth_Suc_BIT: "bin_nth (w BIT b) (Suc n) = bin_nth w n"
   225 lemma bin_nth_Suc_BIT: "bin_nth (w BIT b) (Suc n) = bin_nth w n"
   260   by auto
   226   by auto
   261 
   227 
   262 lemma bin_nth_minus [simp]: "0 < n ==> bin_nth (w BIT b) n = bin_nth w (n - 1)"
   228 lemma bin_nth_minus [simp]: "0 < n ==> bin_nth (w BIT b) n = bin_nth w (n - 1)"
   263   by (cases n) auto
   229   by (cases n) auto
   264 
   230 
   265 lemma bin_nth_minus_Bit0 [simp]:
   231 lemma bin_nth_numeral:
   266   "0 < n ==> bin_nth (number_of (Int.Bit0 w)) n = bin_nth (number_of w) (n - 1)"
   232   "bin_rest x = y \<Longrightarrow> bin_nth x (numeral n) = bin_nth y (numeral n - 1)"
   267   using bin_nth_minus [where w="number_of w" and b="(0::bit)"] by simp
   233   by (subst expand_Suc, simp only: bin_nth.simps)
   268 
   234 
   269 lemma bin_nth_minus_Bit1 [simp]:
   235 lemmas bin_nth_numeral_simps [simp] =
   270   "0 < n ==> bin_nth (number_of (Int.Bit1 w)) n = bin_nth (number_of w) (n - 1)"
   236   bin_nth_numeral [OF bin_rest_numeral_simps(2)]
   271   using bin_nth_minus [where w="number_of w" and b="(1::bit)"] by simp
   237   bin_nth_numeral [OF bin_rest_numeral_simps(5)]
   272 
   238   bin_nth_numeral [OF bin_rest_numeral_simps(6)]
   273 lemmas bin_nth_0 = bin_nth.simps(1)
   239   bin_nth_numeral [OF bin_rest_numeral_simps(7)]
   274 lemmas bin_nth_Suc = bin_nth.simps(2)
   240   bin_nth_numeral [OF bin_rest_numeral_simps(8)]
   275 
   241 
   276 lemmas bin_nth_simps = 
   242 lemmas bin_nth_simps = 
   277   bin_nth_0 bin_nth_Suc bin_nth_zero bin_nth_minus1 bin_nth_minus
   243   bin_nth.Z bin_nth.Suc bin_nth_zero bin_nth_minus1
   278   bin_nth_minus_Bit0 bin_nth_minus_Bit1
   244   bin_nth_numeral_simps
   279 
   245 
   280 
   246 
   281 subsection {* Truncating binary integers *}
   247 subsection {* Truncating binary integers *}
   282 
   248 
   283 definition bin_sign :: "int \<Rightarrow> int" where
   249 definition bin_sign :: "int \<Rightarrow> int" where
   284   bin_sign_def: "bin_sign k = (if k \<ge> 0 then 0 else - 1)"
   250   bin_sign_def: "bin_sign k = (if k \<ge> 0 then 0 else - 1)"
   285 
   251 
   286 lemma bin_sign_simps [simp]:
   252 lemma bin_sign_simps [simp]:
   287   "bin_sign 0 = 0"
   253   "bin_sign 0 = 0"
   288   "bin_sign 1 = 0"
   254   "bin_sign 1 = 0"
   289   "bin_sign -1 = -1"
   255   "bin_sign (numeral k) = 0"
   290   "bin_sign (number_of (Int.Bit0 w)) = bin_sign (number_of w)"
   256   "bin_sign (neg_numeral k) = -1"
   291   "bin_sign (number_of (Int.Bit1 w)) = bin_sign (number_of w)"
       
   292   "bin_sign (w BIT b) = bin_sign w"
   257   "bin_sign (w BIT b) = bin_sign w"
   293   unfolding bin_sign_def Bit_def bitval_def
   258   unfolding bin_sign_def Bit_def bitval_def
   294   by (simp_all split: bit.split)
   259   by (simp_all split: bit.split)
   295 
   260 
   296 lemma bin_sign_rest [simp]: 
   261 lemma bin_sign_rest [simp]: 
   307 
   272 
   308 lemma sign_bintr: "bin_sign (bintrunc n w) = 0"
   273 lemma sign_bintr: "bin_sign (bintrunc n w) = 0"
   309   by (induct n arbitrary: w) auto
   274   by (induct n arbitrary: w) auto
   310 
   275 
   311 lemma bintrunc_mod2p: "bintrunc n w = (w mod 2 ^ n)"
   276 lemma bintrunc_mod2p: "bintrunc n w = (w mod 2 ^ n)"
   312   apply (induct n arbitrary: w)
   277   apply (induct n arbitrary: w, clarsimp)
   313   apply simp
       
   314   apply (simp add: bin_last_def bin_rest_def Bit_def zmod_zmult2_eq)
   278   apply (simp add: bin_last_def bin_rest_def Bit_def zmod_zmult2_eq)
   315   done
   279   done
   316 
   280 
   317 lemma sbintrunc_mod2p: "sbintrunc n w = (w + 2 ^ n) mod 2 ^ (Suc n) - 2 ^ n"
   281 lemma sbintrunc_mod2p: "sbintrunc n w = (w + 2 ^ n) mod 2 ^ (Suc n) - 2 ^ n"
   318   apply (induct n arbitrary: w)
   282   apply (induct n arbitrary: w)
   319    apply clarsimp
   283    apply simp
   320    apply (subst mod_add_left_eq)
   284    apply (subst mod_add_left_eq)
   321    apply (simp add: bin_last_def)
   285    apply (simp add: bin_last_def)
   322   apply simp
       
   323   apply (simp add: bin_last_def bin_rest_def Bit_def)
   286   apply (simp add: bin_last_def bin_rest_def Bit_def)
   324   apply (clarsimp simp: mod_mult_mult1 [symmetric] 
   287   apply (clarsimp simp: mod_mult_mult1 [symmetric] 
   325          zmod_zdiv_equality [THEN diff_eq_eq [THEN iffD2 [THEN sym]]])
   288          zmod_zdiv_equality [THEN diff_eq_eq [THEN iffD2 [THEN sym]]])
   326   apply (rule trans [symmetric, OF _ emep1])
   289   apply (rule trans [symmetric, OF _ emep1])
   327      apply auto
   290      apply auto
   340   by (induct n) auto
   303   by (induct n) auto
   341 
   304 
   342 lemma bintrunc_Suc_numeral:
   305 lemma bintrunc_Suc_numeral:
   343   "bintrunc (Suc n) 1 = 1"
   306   "bintrunc (Suc n) 1 = 1"
   344   "bintrunc (Suc n) -1 = bintrunc n -1 BIT 1"
   307   "bintrunc (Suc n) -1 = bintrunc n -1 BIT 1"
   345   "bintrunc (Suc n) (number_of (Int.Bit0 w)) = bintrunc n (number_of w) BIT 0"
   308   "bintrunc (Suc n) (numeral (Num.Bit0 w)) = bintrunc n (numeral w) BIT 0"
   346   "bintrunc (Suc n) (number_of (Int.Bit1 w)) = bintrunc n (number_of w) BIT 1"
   309   "bintrunc (Suc n) (numeral (Num.Bit1 w)) = bintrunc n (numeral w) BIT 1"
       
   310   "bintrunc (Suc n) (neg_numeral (Num.Bit0 w)) =
       
   311     bintrunc n (neg_numeral w) BIT 0"
       
   312   "bintrunc (Suc n) (neg_numeral (Num.Bit1 w)) =
       
   313     bintrunc n (neg_numeral (w + Num.One)) BIT 1"
   347   by simp_all
   314   by simp_all
   348 
   315 
   349 lemma sbintrunc_0_numeral [simp]:
   316 lemma sbintrunc_0_numeral [simp]:
   350   "sbintrunc 0 1 = -1"
   317   "sbintrunc 0 1 = -1"
   351   "sbintrunc 0 (number_of (Int.Bit0 w)) = 0"
   318   "sbintrunc 0 (numeral (Num.Bit0 w)) = 0"
   352   "sbintrunc 0 (number_of (Int.Bit1 w)) = -1"
   319   "sbintrunc 0 (numeral (Num.Bit1 w)) = -1"
       
   320   "sbintrunc 0 (neg_numeral (Num.Bit0 w)) = 0"
       
   321   "sbintrunc 0 (neg_numeral (Num.Bit1 w)) = -1"
   353   by simp_all
   322   by simp_all
   354 
   323 
   355 lemma sbintrunc_Suc_numeral:
   324 lemma sbintrunc_Suc_numeral:
   356   "sbintrunc (Suc n) 1 = 1"
   325   "sbintrunc (Suc n) 1 = 1"
   357   "sbintrunc (Suc n) (number_of (Int.Bit0 w)) = sbintrunc n (number_of w) BIT 0"
   326   "sbintrunc (Suc n) (numeral (Num.Bit0 w)) =
   358   "sbintrunc (Suc n) (number_of (Int.Bit1 w)) = sbintrunc n (number_of w) BIT 1"
   327     sbintrunc n (numeral w) BIT 0"
       
   328   "sbintrunc (Suc n) (numeral (Num.Bit1 w)) =
       
   329     sbintrunc n (numeral w) BIT 1"
       
   330   "sbintrunc (Suc n) (neg_numeral (Num.Bit0 w)) =
       
   331     sbintrunc n (neg_numeral w) BIT 0"
       
   332   "sbintrunc (Suc n) (neg_numeral (Num.Bit1 w)) =
       
   333     sbintrunc n (neg_numeral (w + Num.One)) BIT 1"
   359   by simp_all
   334   by simp_all
   360 
   335 
   361 lemma bit_bool:
   336 lemma bit_bool:
   362   "(b = (b' = (1::bit))) = (b' = (if b then (1::bit) else (0::bit)))"
   337   "(b = (b' = (1::bit))) = (b' = (if b then (1::bit) else (0::bit)))"
   363   by (cases b') auto
   338   by (cases b') auto
   364 
   339 
   365 lemmas bit_bool1 [simp] = refl [THEN bit_bool [THEN iffD1], symmetric]
   340 lemmas bit_bool1 [simp] = refl [THEN bit_bool [THEN iffD1], symmetric]
   366 
   341 
   367 lemma bin_sign_lem: "(bin_sign (sbintrunc n bin) = -1) = bin_nth bin n"
   342 lemma bin_sign_lem: "(bin_sign (sbintrunc n bin) = -1) = bin_nth bin n"
   368   apply (induct n arbitrary: bin)
   343   apply (induct n arbitrary: bin)
   369    apply (case_tac bin rule: bin_exhaust, case_tac b, auto)+
   344   apply (case_tac bin rule: bin_exhaust, case_tac b, auto)
   370   done
   345   done
   371 
   346 
   372 lemma nth_bintr: "bin_nth (bintrunc m w) n = (n < m & bin_nth w n)"
   347 lemma nth_bintr: "bin_nth (bintrunc m w) n = (n < m & bin_nth w n)"
   373   apply (induct n arbitrary: w m)
   348   apply (induct n arbitrary: w m)
   374    apply (case_tac m, auto)[1]
   349    apply (case_tac m, auto)[1]
   386 lemma bin_nth_Bit:
   361 lemma bin_nth_Bit:
   387   "bin_nth (w BIT b) n = (n = 0 & b = (1::bit) | (EX m. n = Suc m & bin_nth w m))"
   362   "bin_nth (w BIT b) n = (n = 0 & b = (1::bit) | (EX m. n = Suc m & bin_nth w m))"
   388   by (cases n) auto
   363   by (cases n) auto
   389 
   364 
   390 lemma bin_nth_Bit0:
   365 lemma bin_nth_Bit0:
   391   "bin_nth (number_of (Int.Bit0 w)) n \<longleftrightarrow>
   366   "bin_nth (numeral (Num.Bit0 w)) n \<longleftrightarrow>
   392     (\<exists>m. n = Suc m \<and> bin_nth (number_of w) m)"
   367     (\<exists>m. n = Suc m \<and> bin_nth (numeral w) m)"
   393   using bin_nth_Bit [where w="number_of w" and b="(0::bit)"] by simp
   368   using bin_nth_Bit [where w="numeral w" and b="(0::bit)"] by simp
   394 
   369 
   395 lemma bin_nth_Bit1:
   370 lemma bin_nth_Bit1:
   396   "bin_nth (number_of (Int.Bit1 w)) n \<longleftrightarrow>
   371   "bin_nth (numeral (Num.Bit1 w)) n \<longleftrightarrow>
   397     n = 0 \<or> (\<exists>m. n = Suc m \<and> bin_nth (number_of w) m)"
   372     n = 0 \<or> (\<exists>m. n = Suc m \<and> bin_nth (numeral w) m)"
   398   using bin_nth_Bit [where w="number_of w" and b="(1::bit)"] by simp
   373   using bin_nth_Bit [where w="numeral w" and b="(1::bit)"] by simp
   399 
   374 
   400 lemma bintrunc_bintrunc_l:
   375 lemma bintrunc_bintrunc_l:
   401   "n <= m ==> (bintrunc m (bintrunc n w) = bintrunc n w)"
   376   "n <= m ==> (bintrunc m (bintrunc n w) = bintrunc n w)"
   402   by (rule bin_eqI) (auto simp add : nth_bintr)
   377   by (rule bin_eqI) (auto simp add : nth_bintr)
   403 
   378 
   420   apply (rule bin_eqI)
   395   apply (rule bin_eqI)
   421   apply (auto simp: nth_sbintr min_max.inf_absorb1 min_max.inf_absorb2)
   396   apply (auto simp: nth_sbintr min_max.inf_absorb1 min_max.inf_absorb2)
   422   done
   397   done
   423 
   398 
   424 lemmas bintrunc_Pls = 
   399 lemmas bintrunc_Pls = 
   425   bintrunc.Suc [where bin="Int.Pls", simplified bin_last_simps bin_rest_simps]
   400   bintrunc.Suc [where bin="0", simplified bin_last_numeral_simps bin_rest_numeral_simps]
   426 
   401 
   427 lemmas bintrunc_Min [simp] = 
   402 lemmas bintrunc_Min [simp] = 
   428   bintrunc.Suc [where bin="Int.Min", simplified bin_last_simps bin_rest_simps]
   403   bintrunc.Suc [where bin="-1", simplified bin_last_numeral_simps bin_rest_numeral_simps]
   429 
   404 
   430 lemmas bintrunc_BIT  [simp] = 
   405 lemmas bintrunc_BIT  [simp] = 
   431   bintrunc.Suc [where bin="w BIT b", simplified bin_last_BIT bin_rest_BIT] for w b
   406   bintrunc.Suc [where bin="w BIT b", simplified bin_last_BIT bin_rest_BIT] for w b
   432 
   407 
   433 lemma bintrunc_Bit0 [simp]:
       
   434   "bintrunc (Suc n) (Int.Bit0 w) = Int.Bit0 (bintrunc n w)"
       
   435   using bintrunc_BIT [where b="(0::bit)"] by (simp add: BIT_simps)
       
   436 
       
   437 lemma bintrunc_Bit1 [simp]:
       
   438   "bintrunc (Suc n) (Int.Bit1 w) = Int.Bit1 (bintrunc n w)"
       
   439   using bintrunc_BIT [where b="(1::bit)"] by (simp add: BIT_simps)
       
   440 
       
   441 lemmas bintrunc_Sucs = bintrunc_Pls bintrunc_Min bintrunc_BIT
   408 lemmas bintrunc_Sucs = bintrunc_Pls bintrunc_Min bintrunc_BIT
   442   bintrunc_Bit0 bintrunc_Bit1
       
   443   bintrunc_Suc_numeral
   409   bintrunc_Suc_numeral
   444 
   410 
   445 lemmas sbintrunc_Suc_Pls = 
   411 lemmas sbintrunc_Suc_Pls = 
   446   sbintrunc.Suc [where bin="Int.Pls", simplified bin_last_simps bin_rest_simps]
   412   sbintrunc.Suc [where bin="0", simplified bin_last_numeral_simps bin_rest_numeral_simps]
   447 
   413 
   448 lemmas sbintrunc_Suc_Min = 
   414 lemmas sbintrunc_Suc_Min = 
   449   sbintrunc.Suc [where bin="Int.Min", simplified bin_last_simps bin_rest_simps]
   415   sbintrunc.Suc [where bin="-1", simplified bin_last_numeral_simps bin_rest_numeral_simps]
   450 
   416 
   451 lemmas sbintrunc_Suc_BIT [simp] = 
   417 lemmas sbintrunc_Suc_BIT [simp] = 
   452   sbintrunc.Suc [where bin="w BIT b", simplified bin_last_BIT bin_rest_BIT] for w b
   418   sbintrunc.Suc [where bin="w BIT b", simplified bin_last_BIT bin_rest_BIT] for w b
   453 
   419 
   454 lemma sbintrunc_Suc_Bit0 [simp]:
       
   455   "sbintrunc (Suc n) (Int.Bit0 w) = Int.Bit0 (sbintrunc n w)"
       
   456   using sbintrunc_Suc_BIT [where b="(0::bit)"] by (simp add: BIT_simps)
       
   457 
       
   458 lemma sbintrunc_Suc_Bit1 [simp]:
       
   459   "sbintrunc (Suc n) (Int.Bit1 w) = Int.Bit1 (sbintrunc n w)"
       
   460   using sbintrunc_Suc_BIT [where b="(1::bit)"] by (simp add: BIT_simps)
       
   461 
       
   462 lemmas sbintrunc_Sucs = sbintrunc_Suc_Pls sbintrunc_Suc_Min sbintrunc_Suc_BIT
   420 lemmas sbintrunc_Sucs = sbintrunc_Suc_Pls sbintrunc_Suc_Min sbintrunc_Suc_BIT
   463   sbintrunc_Suc_Bit0 sbintrunc_Suc_Bit1
       
   464   sbintrunc_Suc_numeral
   421   sbintrunc_Suc_numeral
   465 
   422 
   466 lemmas sbintrunc_Pls = 
   423 lemmas sbintrunc_Pls = 
   467   sbintrunc.Z [where bin="Int.Pls", 
   424   sbintrunc.Z [where bin="0", 
   468                simplified bin_last_simps bin_rest_simps bit.simps]
   425                simplified bin_last_numeral_simps bin_rest_numeral_simps bit.simps]
   469 
   426 
   470 lemmas sbintrunc_Min = 
   427 lemmas sbintrunc_Min = 
   471   sbintrunc.Z [where bin="Int.Min", 
   428   sbintrunc.Z [where bin="-1",
   472                simplified bin_last_simps bin_rest_simps bit.simps]
   429                simplified bin_last_numeral_simps bin_rest_numeral_simps bit.simps]
   473 
   430 
   474 lemmas sbintrunc_0_BIT_B0 [simp] = 
   431 lemmas sbintrunc_0_BIT_B0 [simp] = 
   475   sbintrunc.Z [where bin="w BIT (0::bit)", 
   432   sbintrunc.Z [where bin="w BIT (0::bit)", 
   476                simplified bin_last_simps bin_rest_simps bit.simps] for w
   433                simplified bin_last_numeral_simps bin_rest_numeral_simps bit.simps] for w
   477 
   434 
   478 lemmas sbintrunc_0_BIT_B1 [simp] = 
   435 lemmas sbintrunc_0_BIT_B1 [simp] = 
   479   sbintrunc.Z [where bin="w BIT (1::bit)", 
   436   sbintrunc.Z [where bin="w BIT (1::bit)", 
   480                simplified bin_last_simps bin_rest_simps bit.simps] for w
   437                simplified bin_last_BIT bin_rest_numeral_simps bit.simps] for w
   481 
       
   482 lemma sbintrunc_0_Bit0 [simp]: "sbintrunc 0 (Int.Bit0 w) = 0"
       
   483   using sbintrunc_0_BIT_B0 by simp
       
   484 
       
   485 lemma sbintrunc_0_Bit1 [simp]: "sbintrunc 0 (Int.Bit1 w) = -1"
       
   486   using sbintrunc_0_BIT_B1 by simp
       
   487 
   438 
   488 lemmas sbintrunc_0_simps =
   439 lemmas sbintrunc_0_simps =
   489   sbintrunc_Pls sbintrunc_Min sbintrunc_0_BIT_B0 sbintrunc_0_BIT_B1
   440   sbintrunc_Pls sbintrunc_Min sbintrunc_0_BIT_B0 sbintrunc_0_BIT_B1
   490   sbintrunc_0_Bit0 sbintrunc_0_Bit1
       
   491 
   441 
   492 lemmas bintrunc_simps = bintrunc.Z bintrunc_Sucs
   442 lemmas bintrunc_simps = bintrunc.Z bintrunc_Sucs
   493 lemmas sbintrunc_simps = sbintrunc_0_simps sbintrunc_Sucs
   443 lemmas sbintrunc_simps = sbintrunc_0_simps sbintrunc_Sucs
   494 
   444 
   495 lemma bintrunc_minus:
   445 lemma bintrunc_minus:
   502 
   452 
   503 lemmas bintrunc_minus_simps = 
   453 lemmas bintrunc_minus_simps = 
   504   bintrunc_Sucs [THEN [2] bintrunc_minus [symmetric, THEN trans]]
   454   bintrunc_Sucs [THEN [2] bintrunc_minus [symmetric, THEN trans]]
   505 lemmas sbintrunc_minus_simps = 
   455 lemmas sbintrunc_minus_simps = 
   506   sbintrunc_Sucs [THEN [2] sbintrunc_minus [symmetric, THEN trans]]
   456   sbintrunc_Sucs [THEN [2] sbintrunc_minus [symmetric, THEN trans]]
   507 
       
   508 lemma bintrunc_n_Pls [simp]:
       
   509   "bintrunc n Int.Pls = Int.Pls"
       
   510   unfolding Pls_def by simp
       
   511 
       
   512 lemma sbintrunc_n_PM [simp]:
       
   513   "sbintrunc n Int.Pls = Int.Pls"
       
   514   "sbintrunc n Int.Min = Int.Min"
       
   515   unfolding Pls_def Min_def by simp_all
       
   516 
   457 
   517 lemmas thobini1 = arg_cong [where f = "%w. w BIT b"] for b
   458 lemmas thobini1 = arg_cong [where f = "%w. w BIT b"] for b
   518 
   459 
   519 lemmas bintrunc_BIT_I = trans [OF bintrunc_BIT thobini1]
   460 lemmas bintrunc_BIT_I = trans [OF bintrunc_BIT thobini1]
   520 lemmas bintrunc_Min_I = trans [OF bintrunc_Min thobini1]
   461 lemmas bintrunc_Min_I = trans [OF bintrunc_Min thobini1]
   598   we get a version for when the word length is given literally *)
   539   we get a version for when the word length is given literally *)
   599 
   540 
   600 lemmas nat_non0_gr = 
   541 lemmas nat_non0_gr = 
   601   trans [OF iszero_def [THEN Not_eq_iff [THEN iffD2]] refl]
   542   trans [OF iszero_def [THEN Not_eq_iff [THEN iffD2]] refl]
   602 
   543 
   603 lemmas bintrunc_pred_simps [simp] = 
   544 lemma bintrunc_numeral:
   604   bintrunc_minus_simps [of "number_of bin", simplified nobm1] for bin
   545   "bintrunc (numeral k) x =
   605 
   546     bintrunc (numeral k - 1) (bin_rest x) BIT bin_last x"
   606 lemmas sbintrunc_pred_simps [simp] = 
   547   by (subst expand_Suc, rule bintrunc.simps)
   607   sbintrunc_minus_simps [of "number_of bin", simplified nobm1] for bin
   548 
   608 
   549 lemma sbintrunc_numeral:
   609 lemma no_bintr_alt:
   550   "sbintrunc (numeral k) x =
   610   "number_of (bintrunc n w) = w mod 2 ^ n"
   551     sbintrunc (numeral k - 1) (bin_rest x) BIT bin_last x"
   611   by (simp add: number_of_eq bintrunc_mod2p)
   552   by (subst expand_Suc, rule sbintrunc.simps)
       
   553 
       
   554 lemma bintrunc_numeral_simps [simp]:
       
   555   "bintrunc (numeral k) (numeral (Num.Bit0 w)) =
       
   556     bintrunc (numeral k - 1) (numeral w) BIT 0"
       
   557   "bintrunc (numeral k) (numeral (Num.Bit1 w)) =
       
   558     bintrunc (numeral k - 1) (numeral w) BIT 1"
       
   559   "bintrunc (numeral k) (neg_numeral (Num.Bit0 w)) =
       
   560     bintrunc (numeral k - 1) (neg_numeral w) BIT 0"
       
   561   "bintrunc (numeral k) (neg_numeral (Num.Bit1 w)) =
       
   562     bintrunc (numeral k - 1) (neg_numeral (w + Num.One)) BIT 1"
       
   563   "bintrunc (numeral k) 1 = 1"
       
   564   by (simp_all add: bintrunc_numeral)
       
   565 
       
   566 lemma sbintrunc_numeral_simps [simp]:
       
   567   "sbintrunc (numeral k) (numeral (Num.Bit0 w)) =
       
   568     sbintrunc (numeral k - 1) (numeral w) BIT 0"
       
   569   "sbintrunc (numeral k) (numeral (Num.Bit1 w)) =
       
   570     sbintrunc (numeral k - 1) (numeral w) BIT 1"
       
   571   "sbintrunc (numeral k) (neg_numeral (Num.Bit0 w)) =
       
   572     sbintrunc (numeral k - 1) (neg_numeral w) BIT 0"
       
   573   "sbintrunc (numeral k) (neg_numeral (Num.Bit1 w)) =
       
   574     sbintrunc (numeral k - 1) (neg_numeral (w + Num.One)) BIT 1"
       
   575   "sbintrunc (numeral k) 1 = 1"
       
   576   by (simp_all add: sbintrunc_numeral)
   612 
   577 
   613 lemma no_bintr_alt1: "bintrunc n = (%w. w mod 2 ^ n :: int)"
   578 lemma no_bintr_alt1: "bintrunc n = (%w. w mod 2 ^ n :: int)"
   614   by (rule ext) (rule bintrunc_mod2p)
   579   by (rule ext) (rule bintrunc_mod2p)
   615 
   580 
   616 lemma range_bintrunc: "range (bintrunc n) = {i. 0 <= i & i < 2 ^ n}"
   581 lemma range_bintrunc: "range (bintrunc n) = {i. 0 <= i & i < 2 ^ n}"
   618   apply (auto simp add: image_iff)
   583   apply (auto simp add: image_iff)
   619   apply (rule exI)
   584   apply (rule exI)
   620   apply (auto intro: int_mod_lem [THEN iffD1, symmetric])
   585   apply (auto intro: int_mod_lem [THEN iffD1, symmetric])
   621   done
   586   done
   622 
   587 
   623 lemma no_bintr: 
       
   624   "number_of (bintrunc n w) = (number_of w mod 2 ^ n :: int)"
       
   625   by (simp add : bintrunc_mod2p number_of_eq)
       
   626 
       
   627 lemma no_sbintr_alt2: 
   588 lemma no_sbintr_alt2: 
   628   "sbintrunc n = (%w. (w + 2 ^ n) mod 2 ^ Suc n - 2 ^ n :: int)"
   589   "sbintrunc n = (%w. (w + 2 ^ n) mod 2 ^ Suc n - 2 ^ n :: int)"
   629   by (rule ext) (simp add : sbintrunc_mod2p)
   590   by (rule ext) (simp add : sbintrunc_mod2p)
   630 
       
   631 lemma no_sbintr: 
       
   632   "number_of (sbintrunc n w) = 
       
   633    ((number_of w + 2 ^ n) mod 2 ^ Suc n - 2 ^ n :: int)"
       
   634   by (simp add : no_sbintr_alt2 number_of_eq)
       
   635 
   591 
   636 lemma range_sbintrunc: 
   592 lemma range_sbintrunc: 
   637   "range (sbintrunc n) = {i. - (2 ^ n) <= i & i < 2 ^ n}"
   593   "range (sbintrunc n) = {i. - (2 ^ n) <= i & i < 2 ^ n}"
   638   apply (unfold no_sbintr_alt2)
   594   apply (unfold no_sbintr_alt2)
   639   apply (auto simp add: image_iff eq_diff_eq)
   595   apply (auto simp add: image_iff eq_diff_eq)
   690 lemmas bintr_ariths =
   646 lemmas bintr_ariths =
   691   brdmods' [where c="2^n::int", folded bintrunc_mod2p] for n
   647   brdmods' [where c="2^n::int", folded bintrunc_mod2p] for n
   692 
   648 
   693 lemmas m2pths = pos_mod_sign pos_mod_bound [OF zless2p]
   649 lemmas m2pths = pos_mod_sign pos_mod_bound [OF zless2p]
   694 
   650 
   695 lemma bintr_ge0: "(0 :: int) <= number_of (bintrunc n w)"
   651 lemma bintr_ge0: "0 \<le> bintrunc n w"
   696   by (simp add : no_bintr m2pths)
   652   by (simp add: bintrunc_mod2p)
   697 
   653 
   698 lemma bintr_lt2p: "number_of (bintrunc n w) < (2 ^ n :: int)"
   654 lemma bintr_lt2p: "bintrunc n w < 2 ^ n"
   699   by (simp add : no_bintr m2pths)
   655   by (simp add: bintrunc_mod2p)
   700 
   656 
   701 lemma bintr_Min: 
   657 lemma bintr_Min: "bintrunc n -1 = 2 ^ n - 1"
   702   "number_of (bintrunc n Int.Min) = (2 ^ n :: int) - 1"
   658   by (simp add: bintrunc_mod2p m1mod2k)
   703   by (simp add : no_bintr m1mod2k)
   659 
   704 
   660 lemma sbintr_ge: "- (2 ^ n) \<le> sbintrunc n w"
   705 lemma sbintr_ge: "(- (2 ^ n) :: int) <= number_of (sbintrunc n w)"
   661   by (simp add: sbintrunc_mod2p)
   706   by (simp add : no_sbintr m2pths)
   662 
   707 
   663 lemma sbintr_lt: "sbintrunc n w < 2 ^ n"
   708 lemma sbintr_lt: "number_of (sbintrunc n w) < (2 ^ n :: int)"
   664   by (simp add: sbintrunc_mod2p)
   709   by (simp add : no_sbintr m2pths)
       
   710 
   665 
   711 lemma sign_Pls_ge_0: 
   666 lemma sign_Pls_ge_0: 
   712   "(bin_sign bin = 0) = (bin >= (0 :: int))"
   667   "(bin_sign bin = 0) = (bin >= (0 :: int))"
   713   unfolding bin_sign_def by simp
   668   unfolding bin_sign_def by simp
   714 
   669 
   715 lemma sign_Min_lt_0: 
   670 lemma sign_Min_lt_0: 
   716   "(bin_sign bin = -1) = (bin < (0 :: int))"
   671   "(bin_sign bin = -1) = (bin < (0 :: int))"
   717   unfolding bin_sign_def by simp
   672   unfolding bin_sign_def by simp
   718 
       
   719 lemmas sign_Min_neg = trans [OF sign_Min_lt_0 neg_def [symmetric]] 
       
   720 
   673 
   721 lemma bin_rest_trunc:
   674 lemma bin_rest_trunc:
   722   "(bin_rest (bintrunc n bin)) = bintrunc (n - 1) (bin_rest bin)"
   675   "(bin_rest (bintrunc n bin)) = bintrunc (n - 1) (bin_rest bin)"
   723   by (induct n arbitrary: bin) auto
   676   by (induct n arbitrary: bin) auto
   724 
   677 
   787         in (w1, w2 BIT bin_last w))"
   740         in (w1, w2 BIT bin_last w))"
   788 
   741 
   789 lemma [code]:
   742 lemma [code]:
   790   "bin_split (Suc n) w = (let (w1, w2) = bin_split n (bin_rest w) in (w1, w2 BIT bin_last w))"
   743   "bin_split (Suc n) w = (let (w1, w2) = bin_split n (bin_rest w) in (w1, w2 BIT bin_last w))"
   791   "bin_split 0 w = (w, 0)"
   744   "bin_split 0 w = (w, 0)"
   792   by (simp_all add: Pls_def)
   745   by simp_all
   793 
   746 
   794 primrec bin_cat :: "int \<Rightarrow> nat \<Rightarrow> int \<Rightarrow> int" where
   747 primrec bin_cat :: "int \<Rightarrow> nat \<Rightarrow> int \<Rightarrow> int" where
   795   Z: "bin_cat w 0 v = w"
   748   Z: "bin_cat w 0 v = w"
   796   | Suc: "bin_cat w (Suc n) v = bin_cat w n (bin_rest v) BIT bin_last v"
   749   | Suc: "bin_cat w (Suc n) v = bin_cat w n (bin_rest v) BIT bin_last v"
   797 
   750 
   799 
   752 
   800 lemma funpow_minus_simp:
   753 lemma funpow_minus_simp:
   801   "0 < n \<Longrightarrow> f ^^ n = f \<circ> f ^^ (n - 1)"
   754   "0 < n \<Longrightarrow> f ^^ n = f \<circ> f ^^ (n - 1)"
   802   by (cases n) simp_all
   755   by (cases n) simp_all
   803 
   756 
   804 lemmas funpow_pred_simp [simp] =
   757 lemma funpow_numeral [simp]:
   805   funpow_minus_simp [of "number_of bin", simplified nobm1] for bin
   758   "f ^^ numeral k = f \<circ> f ^^ (numeral k - 1)"
   806 
   759   by (subst expand_Suc, rule funpow.simps)
   807 lemmas replicate_minus_simp = 
   760 
   808   trans [OF gen_minus [where f = "%n. replicate n x"] replicate.replicate_Suc] for x
   761 lemma replicate_numeral [simp]: (* TODO: move to List.thy *)
   809 
   762   "replicate (numeral k) x = x # replicate (numeral k - 1) x"
   810 lemmas replicate_pred_simp [simp] =
   763   by (subst expand_Suc, rule replicate_Suc)
   811   replicate_minus_simp [of "number_of bin", simplified nobm1] for bin
       
   812 
       
   813 lemmas power_Suc_no [simp] = power_Suc [of "number_of a"] for a
       
   814 
   764 
   815 lemmas power_minus_simp = 
   765 lemmas power_minus_simp = 
   816   trans [OF gen_minus [where f = "power f"] power_Suc] for f
   766   trans [OF gen_minus [where f = "power f"] power_Suc] for f
   817 
       
   818 lemmas power_pred_simp = 
       
   819   power_minus_simp [of "number_of bin", simplified nobm1] for bin
       
   820 lemmas power_pred_simp_no [simp] = power_pred_simp [where f= "number_of f"] for f
       
   821 
   767 
   822 lemma list_exhaust_size_gt0:
   768 lemma list_exhaust_size_gt0:
   823   assumes y: "\<And>a list. y = a # list \<Longrightarrow> P"
   769   assumes y: "\<And>a list. y = a # list \<Longrightarrow> P"
   824   shows "0 < length y \<Longrightarrow> P"
   770   shows "0 < length y \<Longrightarrow> P"
   825   apply (cases y, simp)
   771   apply (cases y, simp)
   837 
   783 
   838 lemma size_Cons_lem_eq:
   784 lemma size_Cons_lem_eq:
   839   "y = xa # list ==> size y = Suc k ==> size list = k"
   785   "y = xa # list ==> size y = Suc k ==> size list = k"
   840   by auto
   786   by auto
   841 
   787 
   842 lemma size_Cons_lem_eq_bin:
       
   843   "y = xa # list ==> size y = number_of (Int.succ k) ==> 
       
   844     size list = number_of k"
       
   845   by (auto simp: pred_def succ_def split add : split_if_asm)
       
   846 
       
   847 lemmas ls_splits = prod.split prod.split_asm split_if_asm
   788 lemmas ls_splits = prod.split prod.split_asm split_if_asm
   848 
   789 
   849 lemma not_B1_is_B0: "y \<noteq> (1::bit) \<Longrightarrow> y = (0::bit)"
   790 lemma not_B1_is_B0: "y \<noteq> (1::bit) \<Longrightarrow> y = (0::bit)"
   850   by (cases y) auto
   791   by (cases y) auto
   851 
   792