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 |