src/HOL/Word/WordArith.thy
changeset 25919 8b1c0d434824
parent 25762 c03e9d04b3e4
child 26086 3c243098b64a
equal deleted inserted replaced
25918:82dd239e0f65 25919:8b1c0d434824
    59   (simp add: word_1_no del: numeral_1_eq_1) 
    59   (simp add: word_1_no del: numeral_1_eq_1) 
    60   *)
    60   *)
    61 lemmas word_0_wi_Pls = word_0_wi [folded Pls_def]
    61 lemmas word_0_wi_Pls = word_0_wi [folded Pls_def]
    62 lemmas word_0_no = word_0_wi_Pls [folded word_no_wi]
    62 lemmas word_0_no = word_0_wi_Pls [folded word_no_wi]
    63 
    63 
    64 lemma int_one_bin: "(1 :: int) == (Numeral.Pls BIT bit.B1)"
    64 lemma int_one_bin: "(1 :: int) == (Int.Pls BIT bit.B1)"
    65   unfolding Pls_def Bit_def by auto
    65   unfolding Pls_def Bit_def by auto
    66 
    66 
    67 lemma word_1_no: 
    67 lemma word_1_no: 
    68   "(1 :: 'a :: len0 word) == number_of (Numeral.Pls BIT bit.B1)"
    68   "(1 :: 'a :: len0 word) == number_of (Int.Pls BIT bit.B1)"
    69   unfolding word_1_wi word_number_of_def int_one_bin by auto
    69   unfolding word_1_wi word_number_of_def int_one_bin by auto
    70 
    70 
    71 lemma word_m1_wi: "-1 == word_of_int -1" 
    71 lemma word_m1_wi: "-1 == word_of_int -1" 
    72   by (rule word_number_of_alt)
    72   by (rule word_number_of_alt)
    73 
    73 
    74 lemma word_m1_wi_Min: "-1 = word_of_int Numeral.Min"
    74 lemma word_m1_wi_Min: "-1 = word_of_int Int.Min"
    75   by (simp add: word_m1_wi number_of_eq)
    75   by (simp add: word_m1_wi number_of_eq)
    76 
    76 
    77 lemma word_0_bl: "of_bl [] = 0" 
    77 lemma word_0_bl: "of_bl [] = 0" 
    78   unfolding word_0_wi of_bl_def by (simp add : Pls_def)
    78   unfolding word_0_wi of_bl_def by (simp add : Pls_def)
    79 
    79 
   167 lemma wi_homs: 
   167 lemma wi_homs: 
   168   shows
   168   shows
   169   wi_hom_add: "word_of_int a + word_of_int b = word_of_int (a + b)" and
   169   wi_hom_add: "word_of_int a + word_of_int b = word_of_int (a + b)" and
   170   wi_hom_mult: "word_of_int a * word_of_int b = word_of_int (a * b)" and
   170   wi_hom_mult: "word_of_int a * word_of_int b = word_of_int (a * b)" and
   171   wi_hom_neg: "- word_of_int a = word_of_int (- a)" and
   171   wi_hom_neg: "- word_of_int a = word_of_int (- a)" and
   172   wi_hom_succ: "word_succ (word_of_int a) = word_of_int (Numeral.succ a)" and
   172   wi_hom_succ: "word_succ (word_of_int a) = word_of_int (Int.succ a)" and
   173   wi_hom_pred: "word_pred (word_of_int a) = word_of_int (Numeral.pred a)"
   173   wi_hom_pred: "word_pred (word_of_int a) = word_of_int (Int.pred a)"
   174   by (auto simp: word_arith_wis arths)
   174   by (auto simp: word_arith_wis arths)
   175 
   175 
   176 lemmas wi_hom_syms = wi_homs [symmetric]
   176 lemmas wi_hom_syms = wi_homs [symmetric]
   177 
   177 
   178 lemma word_sub_def: "a - b == a + - (b :: 'a :: len0 word)"
   178 lemma word_sub_def: "a - b == a + - (b :: 'a :: len0 word)"
   253 
   253 
   254 lemma word_pred_0_n1: "word_pred 0 = word_of_int -1"
   254 lemma word_pred_0_n1: "word_pred 0 = word_of_int -1"
   255   unfolding word_pred_def number_of_eq
   255   unfolding word_pred_def number_of_eq
   256   by (simp add : pred_def word_no_wi)
   256   by (simp add : pred_def word_no_wi)
   257 
   257 
   258 lemma word_pred_0_Min: "word_pred 0 = word_of_int Numeral.Min"
   258 lemma word_pred_0_Min: "word_pred 0 = word_of_int Int.Min"
   259   by (simp add: word_pred_0_n1 number_of_eq)
   259   by (simp add: word_pred_0_n1 number_of_eq)
   260 
   260 
   261 lemma word_m1_Min: "- 1 = word_of_int Numeral.Min"
   261 lemma word_m1_Min: "- 1 = word_of_int Int.Min"
   262   unfolding Min_def by (simp only: word_of_int_hom_syms)
   262   unfolding Min_def by (simp only: word_of_int_hom_syms)
   263 
   263 
   264 lemma succ_pred_no [simp]:
   264 lemma succ_pred_no [simp]:
   265   "word_succ (number_of bin) = number_of (Numeral.succ bin) & 
   265   "word_succ (number_of bin) = number_of (Int.succ bin) & 
   266     word_pred (number_of bin) = number_of (Numeral.pred bin)"
   266     word_pred (number_of bin) = number_of (Int.pred bin)"
   267   unfolding word_number_of_def by (simp add : new_word_of_int_homs)
   267   unfolding word_number_of_def by (simp add : new_word_of_int_homs)
   268 
   268 
   269 lemma word_sp_01 [simp] : 
   269 lemma word_sp_01 [simp] : 
   270   "word_succ -1 = 0 & word_succ 0 = 1 & word_pred 0 = -1 & word_pred 1 = 0"
   270   "word_succ -1 = 0 & word_succ 0 = 1 & word_pred 0 = -1 & word_pred 1 = 0"
   271   by (unfold word_0_no word_1_no) auto
   271   by (unfold word_0_no word_1_no) auto
   795 
   795 
   796 (* note that iszero_def is only for class comm_semiring_1_cancel,
   796 (* note that iszero_def is only for class comm_semiring_1_cancel,
   797    which requires word length >= 1, ie 'a :: len word *) 
   797    which requires word length >= 1, ie 'a :: len word *) 
   798 lemma zero_bintrunc:
   798 lemma zero_bintrunc:
   799   "iszero (number_of x :: 'a :: len word) = 
   799   "iszero (number_of x :: 'a :: len word) = 
   800     (bintrunc (len_of TYPE('a)) x = Numeral.Pls)"
   800     (bintrunc (len_of TYPE('a)) x = Int.Pls)"
   801   apply (unfold iszero_def word_0_wi word_no_wi)
   801   apply (unfold iszero_def word_0_wi word_no_wi)
   802   apply (rule word_ubin.norm_eq_iff [symmetric, THEN trans])
   802   apply (rule word_ubin.norm_eq_iff [symmetric, THEN trans])
   803   apply (simp add : Pls_def [symmetric])
   803   apply (simp add : Pls_def [symmetric])
   804   done
   804   done
   805 
   805