src/HOL/Word/Word.thy
changeset 46646 0abbf6dd09ee
parent 46645 573aff6b9b0a
child 46647 de514a98f6b6
equal deleted inserted replaced
46645:573aff6b9b0a 46646:0abbf6dd09ee
   753     of_bl (drop lend bl) = (of_bl bl :: 'a word)"
   753     of_bl (drop lend bl) = (of_bl bl :: 'a word)"
   754   apply (unfold of_bl_def)
   754   apply (unfold of_bl_def)
   755   apply (clarsimp simp add : trunc_bl2bin [symmetric])
   755   apply (clarsimp simp add : trunc_bl2bin [symmetric])
   756   done
   756   done
   757 
   757 
   758 lemma of_bl_no: "of_bl bl = number_of (bl_to_bin bl)"
       
   759   by (fact of_bl_def [folded word_number_of_def])
       
   760 
       
   761 lemma test_bit_of_bl:  
   758 lemma test_bit_of_bl:  
   762   "(of_bl bl::'a::len0 word) !! n = (rev bl ! n \<and> n < len_of TYPE('a) \<and> n < length bl)"
   759   "(of_bl bl::'a::len0 word) !! n = (rev bl ! n \<and> n < len_of TYPE('a) \<and> n < length bl)"
   763   apply (unfold of_bl_def word_test_bit_def)
   760   apply (unfold of_bl_def word_test_bit_def)
   764   apply (auto simp add: word_size word_ubin.eq_norm nth_bintr bin_nth_of_bl)
   761   apply (auto simp add: word_size word_ubin.eq_norm nth_bintr bin_nth_of_bl)
   765   done
   762   done
   766 
   763 
   767 lemma no_of_bl: 
   764 lemma no_of_bl: 
   768   "(number_of bin ::'a::len0 word) = of_bl (bin_to_bl (len_of TYPE ('a)) bin)"
   765   "(number_of bin ::'a::len0 word) = of_bl (bin_to_bl (len_of TYPE ('a)) bin)"
   769   unfolding word_size of_bl_no by (simp add : word_number_of_def)
   766   unfolding word_size of_bl_def by (simp add: word_number_of_def)
   770 
   767 
   771 lemma uint_bl: "to_bl w = bin_to_bl (size w) (uint w)"
   768 lemma uint_bl: "to_bl w = bin_to_bl (size w) (uint w)"
   772   unfolding word_size to_bl_def by auto
   769   unfolding word_size to_bl_def by auto
   773 
   770 
   774 lemma to_bl_bin: "bl_to_bin (to_bl w) = uint w"
   771 lemma to_bl_bin: "bl_to_bin (to_bl w) = uint w"
  1003   by (rule inj_on_inverseI, erule ucast_down_ucast_id)
  1000   by (rule inj_on_inverseI, erule ucast_down_ucast_id)
  1004 
  1001 
  1005 lemma of_bl_append_same: "of_bl (X @ to_bl w) = w"
  1002 lemma of_bl_append_same: "of_bl (X @ to_bl w) = w"
  1006   by (rule word_bl.Rep_eqD) (simp add: word_rep_drop)
  1003   by (rule word_bl.Rep_eqD) (simp add: word_rep_drop)
  1007 
  1004 
  1008 lemma ucast_down_no [OF refl]:
  1005 lemma ucast_down_wi [OF refl]:
  1009   "uc = ucast \<Longrightarrow> is_down uc \<Longrightarrow> uc (number_of bin) = number_of bin"
  1006   "uc = ucast \<Longrightarrow> is_down uc \<Longrightarrow> uc (word_of_int x) = word_of_int x"
  1010   apply (unfold word_number_of_def is_down)
  1007   apply (unfold is_down)
  1011   apply (clarsimp simp add: ucast_def word_ubin.eq_norm)
  1008   apply (clarsimp simp add: ucast_def word_ubin.eq_norm)
  1012   apply (rule word_ubin.norm_eq_iff [THEN iffD1])
  1009   apply (rule word_ubin.norm_eq_iff [THEN iffD1])
  1013   apply (erule bintrunc_bintrunc_ge)
  1010   apply (erule bintrunc_bintrunc_ge)
  1014   done
  1011   done
  1015 
  1012 
       
  1013 lemma ucast_down_no [OF refl]:
       
  1014   "uc = ucast \<Longrightarrow> is_down uc \<Longrightarrow> uc (number_of bin) = number_of bin"
       
  1015   unfolding word_number_of_alt by clarify (rule ucast_down_wi)
       
  1016 
  1016 lemma ucast_down_bl [OF refl]:
  1017 lemma ucast_down_bl [OF refl]:
  1017   "uc = ucast \<Longrightarrow> is_down uc \<Longrightarrow> uc (of_bl bl) = of_bl bl"
  1018   "uc = ucast \<Longrightarrow> is_down uc \<Longrightarrow> uc (of_bl bl) = of_bl bl"
  1018   unfolding of_bl_no by clarify (erule ucast_down_no)
  1019   unfolding of_bl_def by clarify (erule ucast_down_wi)
  1019 
  1020 
  1020 lemmas slice_def' = slice_def [unfolded word_size]
  1021 lemmas slice_def' = slice_def [unfolded word_size]
  1021 lemmas test_bit_def' = word_test_bit_def [THEN fun_cong]
  1022 lemmas test_bit_def' = word_test_bit_def [THEN fun_cong]
  1022 
  1023 
  1023 lemmas word_log_defs = word_and_def word_or_def word_xor_def word_not_def
  1024 lemmas word_log_defs = word_and_def word_or_def word_xor_def word_not_def
  2029   "a ^ n = (word_of_int (uint a ^ n) :: 'a :: len word)"
  2030   "a ^ n = (word_of_int (uint a ^ n) :: 'a :: len word)"
  2030   by (simp add : word_of_int_power_hom [symmetric])
  2031   by (simp add : word_of_int_power_hom [symmetric])
  2031 
  2032 
  2032 lemma of_bl_length_less: 
  2033 lemma of_bl_length_less: 
  2033   "length x = k \<Longrightarrow> k < len_of TYPE('a) \<Longrightarrow> (of_bl x :: 'a :: len word) < 2 ^ k"
  2034   "length x = k \<Longrightarrow> k < len_of TYPE('a) \<Longrightarrow> (of_bl x :: 'a :: len word) < 2 ^ k"
  2034   apply (unfold of_bl_no [unfolded word_number_of_def]
  2035   apply (unfold of_bl_def word_less_alt word_number_of_alt)
  2035                 word_less_alt word_number_of_alt)
       
  2036   apply safe
  2036   apply safe
  2037   apply (simp (no_asm) add: word_of_int_power_hom word_uint.eq_norm 
  2037   apply (simp (no_asm) add: word_of_int_power_hom word_uint.eq_norm 
  2038                        del: word_of_int_bin)
  2038                        del: word_of_int_bin)
  2039   apply (simp add: mod_pos_pos_trivial)
  2039   apply (simp add: mod_pos_pos_trivial)
  2040   apply (subst mod_pos_pos_trivial)
  2040   apply (subst mod_pos_pos_trivial)
  2041     apply (rule bl_to_bin_ge0)
  2041     apply (rule bl_to_bin_ge0)
  2042    apply (rule order_less_trans)
  2042    apply (rule order_less_trans)
  2043     apply (rule bl_to_bin_lt2p)
  2043     apply (rule bl_to_bin_lt2p)
  2044    apply simp
  2044    apply simp
  2045   apply (rule bl_to_bin_lt2p)    
  2045   apply (rule bl_to_bin_lt2p)
  2046   done
  2046   done
  2047 
  2047 
  2048 
  2048 
  2049 subsection "Cardinality, finiteness of set of words"
  2049 subsection "Cardinality, finiteness of set of words"
  2050 
  2050