make more word theorems respect int/bin distinction
authorhuffman
Fri, 16 Mar 2012 15:51:53 +0100
changeset 46962 5bdcdb28be83
parent 46960 f19e5837ad69
child 46964 f9533c462457
make more word theorems respect int/bin distinction
src/HOL/Word/Word.thy
--- a/src/HOL/Word/Word.thy	Fri Mar 16 14:46:13 2012 +0100
+++ b/src/HOL/Word/Word.thy	Fri Mar 16 15:51:53 2012 +0100
@@ -802,8 +802,10 @@
 lemma unats_uints: "unats n = nat ` uints n"
   by (auto simp add : uints_unats image_iff)
 
-lemmas bintr_num = word_ubin.norm_eq_iff [symmetric, folded word_number_of_def]
-lemmas sbintr_num = word_sbin.norm_eq_iff [symmetric, folded word_number_of_def]
+lemmas bintr_num = word_ubin.norm_eq_iff
+  [of "number_of a" "number_of b", symmetric, folded word_number_of_alt] for a b
+lemmas sbintr_num = word_sbin.norm_eq_iff
+  [of "number_of a" "number_of b", symmetric, folded word_number_of_alt] for a b
 
 lemmas num_of_bintr = word_ubin.Abs_norm [folded word_number_of_def]
 lemmas num_of_sbintr = word_sbin.Abs_norm [folded word_number_of_def]
@@ -812,22 +814,25 @@
   may want these in reverse, but loop as simp rules, so use following *)
 
 lemma num_of_bintr':
-  "bintrunc (len_of TYPE('a :: len0)) a = b \<Longrightarrow> 
+  "bintrunc (len_of TYPE('a :: len0)) (number_of a) = (number_of b) \<Longrightarrow> 
     number_of a = (number_of b :: 'a word)"
-  apply safe
-  apply (rule_tac num_of_bintr [symmetric])
-  done
+  unfolding bintr_num by (erule subst, simp)
 
 lemma num_of_sbintr':
-  "sbintrunc (len_of TYPE('a :: len) - 1) a = b \<Longrightarrow> 
+  "sbintrunc (len_of TYPE('a :: len) - 1) (number_of a) = (number_of b) \<Longrightarrow> 
     number_of a = (number_of b :: 'a word)"
-  apply safe
-  apply (rule_tac num_of_sbintr [symmetric])
-  done
-
-lemmas num_abs_bintr = sym [THEN trans, OF num_of_bintr word_number_of_def]
-lemmas num_abs_sbintr = sym [THEN trans, OF num_of_sbintr word_number_of_def]
-  
+  unfolding sbintr_num by (erule subst, simp)
+
+lemma num_abs_bintr:
+  "(number_of x :: 'a word) =
+    word_of_int (bintrunc (len_of TYPE('a::len0)) (number_of x))"
+  by (simp only: word_ubin.Abs_norm word_number_of_alt)
+
+lemma num_abs_sbintr:
+  "(number_of x :: 'a word) =
+    word_of_int (sbintrunc (len_of TYPE('a::len) - 1) (number_of x))"
+  by (simp only: word_sbin.Abs_norm word_number_of_alt)
+
 (** cast - note, no arg for new length, as it's determined by type of result,
   thus in "cast w = w, the type means cast to length of w! **)
 
@@ -2880,16 +2885,16 @@
   by (induct n) (auto simp: shiftl1_2t)
 
 lemma shiftr1_bintr [simp]:
-  "(shiftr1 (number_of w) :: 'a :: len0 word) = 
-    number_of (bin_rest (bintrunc (len_of TYPE ('a)) w))" 
-  unfolding shiftr1_def word_number_of_def
-  by (simp add : word_ubin.eq_norm)
-
-lemma sshiftr1_sbintr [simp] :
-  "(sshiftr1 (number_of w) :: 'a :: len word) = 
-    number_of (bin_rest (sbintrunc (len_of TYPE ('a) - 1) w))" 
-  unfolding sshiftr1_def word_number_of_def
-  by (simp add : word_sbin.eq_norm)
+  "(shiftr1 (number_of w) :: 'a :: len0 word) =
+    word_of_int (bin_rest (bintrunc (len_of TYPE ('a)) (number_of w)))"
+  unfolding shiftr1_def word_number_of_alt
+  by (simp add: word_ubin.eq_norm)
+
+lemma sshiftr1_sbintr [simp]:
+  "(sshiftr1 (number_of w) :: 'a :: len word) =
+    word_of_int (bin_rest (sbintrunc (len_of TYPE ('a) - 1) (number_of w)))"
+  unfolding sshiftr1_def word_number_of_alt
+  by (simp add: word_sbin.eq_norm)
 
 lemma shiftr_no [simp]:
   "(number_of w::'a::len0 word) >> n = word_of_int
@@ -3379,11 +3384,9 @@
 
 lemma word_rsplit_no:
   "(word_rsplit (number_of bin :: 'b :: len0 word) :: 'a word list) = 
-    map number_of (bin_rsplit (len_of TYPE('a :: len)) 
-      (len_of TYPE('b), bintrunc (len_of TYPE('b)) bin))"
-  apply (unfold word_rsplit_def word_no_wi)
-  apply (simp add: word_ubin.eq_norm)
-  done
+    map word_of_int (bin_rsplit (len_of TYPE('a :: len)) 
+      (len_of TYPE('b), bintrunc (len_of TYPE('b)) (number_of bin)))"
+  unfolding word_rsplit_def by (simp add: word_ubin.eq_norm)
 
 lemmas word_rsplit_no_cl [simp] = word_rsplit_no
   [unfolded bin_rsplitl_def bin_rsplit_l [symmetric]]