a proof of concept for generic conversions
authorhaftmann
Mon, 24 Aug 2020 13:39:09 +0000
changeset 72198 7ffa26f05c72
parent 72197 957bf00eff2a
child 72199 8dc2e4d9deaa
a proof of concept for generic conversions
src/HOL/ROOT
src/HOL/Word/Conversions.thy
src/HOL/ex/Bit_Lists.thy
src/HOL/ex/Word_Conversions.thy
--- a/src/HOL/ROOT	Sat Aug 22 23:31:20 2020 +0200
+++ b/src/HOL/ROOT	Mon Aug 24 13:39:09 2020 +0000
@@ -696,7 +696,6 @@
     Triangular_Numbers
     Unification
     While_Combinator_Example
-    Word_Conversions
     veriT_Preprocessing
   theories [skip_proofs = false]
     SAT_Examples
@@ -898,6 +897,7 @@
     Word
     More_Word
     Word_Examples
+    Conversions
   document_files "root.bib" "root.tex"
 
 session "HOL-Statespace" in Statespace = HOL +
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/Word/Conversions.thy	Mon Aug 24 13:39:09 2020 +0000
@@ -0,0 +1,325 @@
+(*  Author:  Florian Haftmann, TUM
+*)
+
+section \<open>Proof of concept for conversions for algebraically founded bit word types\<close>
+
+theory Conversions
+  imports
+    Main
+    "HOL-Library.Type_Length"
+    "HOL-Library.Bit_Operations"
+    "HOL-Word.Word"
+begin
+
+hide_const (open) unat uint sint word_of_int ucast scast
+
+subsection \<open>Conversions to words\<close>
+
+abbreviation word_of_nat :: \<open>nat \<Rightarrow> 'a::len word\<close>
+  where \<open>word_of_nat \<equiv> of_nat\<close>
+
+abbreviation word_of_int :: \<open>int \<Rightarrow> 'a::len word\<close>
+  where \<open>word_of_int \<equiv> of_int\<close>
+
+lemma Word_eq_word_of_int [simp]:
+  \<open>Word.Word = word_of_int\<close>
+  by (rule ext; transfer) simp
+
+lemma word_of_nat_eq_iff:
+  \<open>word_of_nat m = (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m = take_bit LENGTH('a) n\<close>
+  by transfer (simp add: take_bit_of_nat)
+
+lemma word_of_int_eq_iff:
+  \<open>word_of_int k = (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k = take_bit LENGTH('a) l\<close>
+  by transfer rule
+
+lemma word_of_nat_less_eq_iff:
+  \<open>word_of_nat m \<le> (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m \<le> take_bit LENGTH('a) n\<close>
+  by transfer (simp add: take_bit_of_nat)
+
+lemma word_of_int_less_eq_iff:
+  \<open>word_of_int k \<le> (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k \<le> take_bit LENGTH('a) l\<close>
+  by transfer rule
+
+lemma word_of_nat_less_iff:
+  \<open>word_of_nat m < (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m < take_bit LENGTH('a) n\<close>
+  by transfer (simp add: take_bit_of_nat)
+
+lemma word_of_int_less_iff:
+  \<open>word_of_int k < (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k < take_bit LENGTH('a) l\<close>
+  by transfer rule
+
+lemma word_of_nat_eq_0_iff [simp]:
+  \<open>word_of_nat n = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd n\<close>
+  using of_nat_word_eq_iff [where ?'a = 'a, of n 0] by (simp add: take_bit_eq_0_iff)
+
+lemma word_of_int_eq_0_iff [simp]:
+  \<open>word_of_int k = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd k\<close>
+  using of_int_word_eq_iff [where ?'a = 'a, of k 0] by (simp add: take_bit_eq_0_iff)
+
+lemma int_AND_eq:
+  \<open>int (m AND n) = int m AND int n\<close>
+  by (rule bit_eqI) (simp add: bit_and_iff)
+
+lemma int_OR_eq:
+  \<open>int (m OR n) = int m OR int n\<close>
+  by (rule bit_eqI) (simp add: bit_or_iff)
+
+lemma int_XOR_eq:
+  \<open>int (m XOR n) = int m XOR int n\<close>
+  by (rule bit_eqI) (simp add: bit_xor_iff)
+
+context semiring_bit_operations
+begin
+
+lemma push_bit_and [simp]:
+  \<open>push_bit n (a AND b) = push_bit n a AND push_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_and_iff)
+
+lemma push_bit_or [simp]:
+  \<open>push_bit n (a OR b) = push_bit n a OR push_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_or_iff)
+
+lemma push_bit_xor [simp]:
+  \<open>push_bit n (a XOR b) = push_bit n a XOR push_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_xor_iff)
+
+lemma drop_bit_and [simp]:
+  \<open>drop_bit n (a AND b) = drop_bit n a AND drop_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_and_iff)
+
+lemma drop_bit_or [simp]:
+  \<open>drop_bit n (a OR b) = drop_bit n a OR drop_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_or_iff)
+
+lemma drop_bit_xor [simp]:
+  \<open>drop_bit n (a XOR b) = drop_bit n a XOR drop_bit n b\<close>
+  by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_xor_iff)
+
+end
+
+lemma bit_word_of_nat_iff:
+  \<open>bit (word_of_nat m :: 'a::len word) n \<longleftrightarrow> n < LENGTH('a) \<and> bit m n\<close>
+  by transfer simp
+
+lemma bit_word_of_int_iff:
+  \<open>bit (word_of_int k :: 'a::len word) n \<longleftrightarrow> n < LENGTH('a) \<and> bit k n\<close>
+  by transfer simp
+
+lemma word_of_nat_AND_eq:
+  \<open>word_of_nat (m AND n) = word_of_nat m AND word_of_nat n\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_nat_iff bit_and_iff)
+
+lemma word_of_int_AND_eq:
+  \<open>word_of_int (k AND l) = word_of_int k AND word_of_int l\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_int_iff bit_and_iff)
+
+lemma word_of_nat_OR_eq:
+  \<open>word_of_nat (m OR n) = word_of_nat m OR word_of_nat n\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_nat_iff bit_or_iff)
+
+lemma word_of_int_OR_eq:
+  \<open>word_of_int (k OR l) = word_of_int k OR word_of_int l\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_int_iff bit_or_iff)
+
+lemma word_of_nat_XOR_eq:
+  \<open>word_of_nat (m XOR n) = word_of_nat m XOR word_of_nat n\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_nat_iff bit_xor_iff)
+
+lemma word_of_int_XOR_eq:
+  \<open>word_of_int (k XOR l) = word_of_int k XOR word_of_int l\<close>
+  by (rule bit_eqI) (auto simp add: bit_word_of_int_iff bit_xor_iff)
+
+
+subsection \<open>Conversion from words\<close>
+
+context semiring_1
+begin
+
+lift_definition unsigned :: \<open>'b::len word \<Rightarrow> 'a\<close>
+  is \<open>of_nat \<circ> nat \<circ> take_bit LENGTH('b)\<close>
+  by simp
+
+lemma unsigned_0 [simp]:
+  \<open>unsigned 0 = 0\<close>
+  by transfer simp
+
+lemma unsigned_1 [simp]:
+  \<open>unsigned 1 = 1\<close>
+  by transfer simp
+
+end
+
+context semiring_char_0
+begin
+
+lemma unsigned_word_eqI:
+  \<open>v = w\<close> if \<open>unsigned v = unsigned w\<close>
+  using that by transfer (simp add: eq_nat_nat_iff)
+
+lemma word_eq_iff_unsigned:
+  \<open>v = w \<longleftrightarrow> unsigned v = unsigned w\<close>
+  by (auto intro: unsigned_word_eqI)
+
+end
+
+context ring_1
+begin
+
+lift_definition signed :: \<open>'b::len word \<Rightarrow> 'a\<close>
+  is \<open>of_int \<circ> signed_take_bit (LENGTH('b) - 1)\<close>
+  by (simp flip: signed_take_bit_decr_length_iff)
+
+lemma signed_0 [simp]:
+  \<open>signed 0 = 0\<close>
+  by transfer simp
+
+lemma signed_1 [simp]:
+  \<open>signed (1 :: 'b::len word) = (if LENGTH('b) = 1 then - 1 else 1)\<close>
+  by (transfer fixing: uminus)
+    (simp_all add: signed_take_bit_eq not_le Suc_lessI)
+
+lemma signed_minus_1 [simp]:
+  \<open>signed (- 1 :: 'b::len word) = - 1\<close>
+  by (transfer fixing: uminus) simp
+
+end
+
+context ring_char_0
+begin
+
+lemma signed_word_eqI:
+  \<open>v = w\<close> if \<open>signed v = signed w\<close>
+  using that by transfer (simp flip: signed_take_bit_decr_length_iff)
+
+lemma word_eq_iff_signed:
+  \<open>v = w \<longleftrightarrow> signed v = signed w\<close>
+  by (auto intro: signed_word_eqI)
+
+end
+
+abbreviation unat :: \<open>'a::len word \<Rightarrow> nat\<close>
+  where \<open>unat \<equiv> unsigned\<close>
+
+abbreviation uint :: \<open>'a::len word \<Rightarrow> int\<close>
+  where \<open>uint \<equiv> unsigned\<close>
+
+abbreviation sint :: \<open>'a::len word \<Rightarrow> int\<close>
+  where \<open>sint \<equiv> signed\<close>
+
+abbreviation ucast :: \<open>'a::len word \<Rightarrow> 'b::len word\<close>
+  where \<open>ucast \<equiv> unsigned\<close>
+
+abbreviation scast :: \<open>'a::len word \<Rightarrow> 'b::len word\<close>
+  where \<open>scast \<equiv> signed\<close>
+
+context
+  includes lifting_syntax
+begin
+
+lemma [transfer_rule]:
+  \<open>(pcr_word ===> (=)) (nat \<circ> take_bit LENGTH('a)) (unat :: 'a::len word \<Rightarrow> nat)\<close>
+  using unsigned.transfer [where ?'a = nat] by simp
+
+lemma [transfer_rule]:
+  \<open>(pcr_word ===> (=)) (take_bit LENGTH('a)) (uint :: 'a::len word \<Rightarrow> int)\<close>
+  using unsigned.transfer [where ?'a = int] by (simp add: comp_def)
+
+lemma [transfer_rule]:
+  \<open>(pcr_word ===> (=)) (signed_take_bit (LENGTH('a) - Suc 0)) (sint :: 'a::len word \<Rightarrow> int)\<close>
+  using signed.transfer [where ?'a = int] by simp
+
+lemma [transfer_rule]:
+  \<open>(pcr_word ===> pcr_word) (take_bit LENGTH('a)) (ucast :: 'a::len word \<Rightarrow> 'b::len word)\<close>
+proof (rule rel_funI)
+  fix k :: int and w :: \<open>'a word\<close>
+  assume \<open>pcr_word k w\<close>
+  then have \<open>w = word_of_int k\<close>
+    by (simp add: pcr_word_def cr_word_def relcompp_apply)
+  moreover have \<open>pcr_word (take_bit LENGTH('a) k) (ucast (word_of_int k :: 'a word))\<close>
+    by transfer (simp add: pcr_word_def cr_word_def relcompp_apply)
+  ultimately show \<open>pcr_word (take_bit LENGTH('a) k) (ucast w)\<close>
+    by simp
+qed
+
+lemma [transfer_rule]:
+  \<open>(pcr_word ===> pcr_word) (signed_take_bit (LENGTH('a) - 1)) (scast :: 'a::len word \<Rightarrow> 'b::len word)\<close>
+proof (rule rel_funI)
+  fix k :: int and w :: \<open>'a word\<close>
+  assume \<open>pcr_word k w\<close>
+  then have \<open>w = word_of_int k\<close>
+    by (simp add: pcr_word_def cr_word_def relcompp_apply)
+  moreover have \<open>pcr_word (signed_take_bit (LENGTH('a) - 1) k) (scast (word_of_int k :: 'a word))\<close>
+    by transfer (simp add: pcr_word_def cr_word_def relcompp_apply)
+  ultimately show \<open>pcr_word (signed_take_bit (LENGTH('a) - 1) k) (scast w)\<close>
+    by simp
+qed
+
+end
+
+lemma unsigned_of_nat [simp]:
+  \<open>unsigned (of_nat n :: 'a::len word) = of_nat (take_bit LENGTH('a) n)\<close>
+  by transfer (simp add: nat_eq_iff take_bit_of_nat)
+
+lemma of_nat_unat [simp]:
+  \<open>of_nat (unat w) = unsigned w\<close>
+  by transfer simp
+
+lemma of_int_uint [simp]:
+  \<open>of_int (uint w) = unsigned w\<close>
+  by transfer simp
+
+context unique_euclidean_semiring_numeral
+begin
+
+lemma unsigned_greater_eq:
+  \<open>0 \<le> unsigned w\<close> for w :: \<open>'b::len word\<close>
+  by (transfer fixing: less_eq) simp
+
+lemma unsigned_less:
+  \<open>unsigned w < 2 ^ LENGTH('b)\<close> for w :: \<open>'b::len word\<close>
+  by (transfer fixing: less) (simp add: take_bit_int_less_exp)
+
+end
+
+context linordered_semidom
+begin
+
+lemma word_less_eq_iff_unsigned:
+  "a \<le> b \<longleftrightarrow> unsigned a \<le> unsigned b"
+  by (transfer fixing: less_eq) (simp add: nat_le_eq_zle)
+
+lemma word_less_iff_unsigned:
+  "a < b \<longleftrightarrow> unsigned a < unsigned b"
+  by (transfer fixing: less) (auto dest: preorder_class.le_less_trans [OF take_bit_nonnegative])
+
+end
+
+lemma signed_of_int [simp]:
+  \<open>signed (word_of_int k :: 'a::len word) = of_int (signed_take_bit (LENGTH('a) - 1) k)\<close>
+  by transfer simp
+
+lemma of_int_sint [simp]:
+  \<open>of_int (sint a) = signed a\<close>
+  by transfer (simp_all add: take_bit_signed_take_bit)
+
+lemma sint_greater_eq:
+  \<open>- (2 ^ (LENGTH('a) - 1)) \<le> sint w\<close> for w :: \<open>'a::len word\<close>
+proof (cases \<open>bit w (LENGTH('a) - 1)\<close>)
+  case True
+  then show ?thesis
+    by transfer (simp add: signed_take_bit_eq_or minus_exp_eq_not_mask or_greater_eq ac_simps)
+next
+  have *: \<open>- (2 ^ (LENGTH('a) - Suc 0)) \<le> (0::int)\<close>
+    by simp
+  case False
+  then show ?thesis
+    by transfer (auto simp add: signed_take_bit_eq intro: order_trans *)
+qed
+
+lemma sint_less:
+  \<open>sint w < 2 ^ (LENGTH('a) - 1)\<close> for w :: \<open>'a::len word\<close>
+  by (cases \<open>bit w (LENGTH('a) - 1)\<close>; transfer)
+    (simp_all add: signed_take_bit_eq signed_take_bit_eq_or take_bit_int_less_exp not_eq_complement mask_eq_exp_minus_1 OR_upper)
+
+end
--- a/src/HOL/ex/Bit_Lists.thy	Sat Aug 22 23:31:20 2020 +0200
+++ b/src/HOL/ex/Bit_Lists.thy	Mon Aug 24 13:39:09 2020 +0000
@@ -5,7 +5,7 @@
 
 theory Bit_Lists
   imports
-    Word_Conversions "HOL-Library.More_List"
+    "HOL-Word.Conversions" "HOL-Library.More_List"
 begin
 
 subsection \<open>Fragments of algebraic bit representations\<close>
--- a/src/HOL/ex/Word_Conversions.thy	Sat Aug 22 23:31:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-(*  Author:  Florian Haftmann, TUM
-*)
-
-section \<open>Proof of concept for conversions for algebraically founded bit word types\<close>
-
-theory Word_Conversions
-  imports
-    Main
-    "HOL-Library.Type_Length"
-    "HOL-Library.Bit_Operations"
-    "HOL-Word.Word"
-begin
-
-context semiring_1
-begin
-
-lift_definition unsigned :: \<open>'b::len word \<Rightarrow> 'a\<close>
-  is \<open>of_nat \<circ> nat \<circ> take_bit LENGTH('b)\<close>
-  by simp
-
-lemma unsigned_0 [simp]:
-  \<open>unsigned 0 = 0\<close>
-  by transfer simp
-
-lemma unsigned_1 [simp]:
-  \<open>unsigned 1 = 1\<close>
-  by transfer simp
-
-end
-
-lemma unat_unsigned:
-  \<open>unat = unsigned\<close>
-  by transfer simp
-
-lemma uint_unsigned:
-  \<open>uint = unsigned\<close>
-  by transfer (simp add: fun_eq_iff)
-
-context semiring_char_0
-begin
-
-lemma unsigned_word_eqI:
-  \<open>v = w\<close> if \<open>unsigned v = unsigned w\<close>
-  using that by transfer (simp add: eq_nat_nat_iff)
-
-lemma word_eq_iff_unsigned:
-  \<open>v = w \<longleftrightarrow> unsigned v = unsigned w\<close>
-  by (auto intro: unsigned_word_eqI)
-
-end
-
-context ring_1
-begin
-
-lift_definition signed :: \<open>'b::len word \<Rightarrow> 'a\<close>
-  is \<open>of_int \<circ> signed_take_bit (LENGTH('b) - 1)\<close>
-  by (simp flip: signed_take_bit_decr_length_iff)
-
-lemma signed_0 [simp]:
-  \<open>signed 0 = 0\<close>
-  by transfer simp
-
-lemma signed_1 [simp]:
-  \<open>signed (1 :: 'b::len word) = (if LENGTH('b) = 1 then - 1 else 1)\<close>
-  by (transfer fixing: uminus)
-    (simp_all add: signed_take_bit_eq not_le Suc_lessI)
-
-lemma signed_minus_1 [simp]:
-  \<open>signed (- 1 :: 'b::len word) = - 1\<close>
-  by (transfer fixing: uminus) simp
-
-end
-
-lemma sint_signed:
-  \<open>sint = signed\<close>
-  by transfer simp
-
-context ring_char_0
-begin
-
-lemma signed_word_eqI:
-  \<open>v = w\<close> if \<open>signed v = signed w\<close>
-  using that by transfer (simp flip: signed_take_bit_decr_length_iff)
-
-lemma word_eq_iff_signed:
-  \<open>v = w \<longleftrightarrow> signed v = signed w\<close>
-  by (auto intro: signed_word_eqI)
-
-end
-
-abbreviation nat_of_word :: \<open>'a::len word \<Rightarrow> nat\<close>
-  where \<open>nat_of_word \<equiv> unsigned\<close>
-
-abbreviation unsigned_int :: \<open>'a::len word \<Rightarrow> int\<close>
-  where \<open>unsigned_int \<equiv> unsigned\<close>
-
-abbreviation signed_int :: \<open>'a::len word \<Rightarrow> int\<close>
-  where \<open>signed_int \<equiv> signed\<close>
-
-abbreviation word_of_nat :: \<open>nat \<Rightarrow> 'a::len word\<close>
-  where \<open>word_of_nat \<equiv> of_nat\<close>
-
-abbreviation word_of_int :: \<open>int \<Rightarrow> 'a::len word\<close>
-  where \<open>word_of_int \<equiv> of_int\<close>
-
-lemma unsigned_of_nat [simp]:
-  \<open>unsigned (of_nat n :: 'a::len word) = of_nat (take_bit LENGTH('a) n)\<close>
-  by transfer (simp add: nat_eq_iff take_bit_of_nat)
-
-lemma of_nat_of_word [simp]:
-  \<open>of_nat (nat_of_word w) = unsigned w\<close>
-  by transfer simp
-
-lemma of_int_unsigned [simp]:
-  \<open>of_int (unsigned_int w) = unsigned w\<close>
-  by transfer simp
-
-lemma unsigned_int_greater_eq:
-  \<open>0 \<le> unsigned_int w\<close> for w :: \<open>'a::len word\<close>
-  by transfer simp
-
-lemma nat_of_word_less:
-  \<open>nat_of_word w < 2 ^ LENGTH('a)\<close> for w :: \<open>'a::len word\<close>
-  by transfer (simp add: take_bit_eq_mod)
-
-lemma unsigned_int_less:
-  \<open>unsigned_int w < 2 ^ LENGTH('a)\<close> for w :: \<open>'a::len word\<close>
-  by transfer (simp add: take_bit_eq_mod)
-
-lemma signed_of_int [simp]:
-  \<open>signed (word_of_int k :: 'a::len word) = of_int (signed_take_bit (LENGTH('a) - 1) k)\<close>
-  by transfer simp
-
-lemma of_int_signed [simp]:
-  \<open>of_int (signed_int a) = signed a\<close>
-  by transfer (simp_all add: take_bit_signed_take_bit)
-
-lemma signed_int_greater_eq:
-  \<open>- (2 ^ (LENGTH('a) - 1)) \<le> signed_int w\<close> for w :: \<open>'a::len word\<close>
-proof (cases \<open>bit w (LENGTH('a) - 1)\<close>)
-  case True
-  then show ?thesis
-    by transfer (simp add: signed_take_bit_eq_or minus_exp_eq_not_mask or_greater_eq ac_simps)
-next
-  have *: \<open>- (2 ^ (LENGTH('a) - Suc 0)) \<le> (0::int)\<close>
-    by simp
-  case False
-  then show ?thesis
-    by transfer (auto simp add: signed_take_bit_eq intro: order_trans *)
-qed
-
-lemma signed_int_less:
-  \<open>signed_int w < 2 ^ (LENGTH('a) - 1)\<close> for w :: \<open>'a::len word\<close>
-  by (cases \<open>bit w (LENGTH('a) - 1)\<close>; transfer)
-    (simp_all add: signed_take_bit_eq signed_take_bit_eq_or take_bit_int_less_exp not_eq_complement mask_eq_exp_minus_1 OR_upper)
-
-context linordered_semidom
-begin
-
-lemma word_less_eq_iff_unsigned:
-  "a \<le> b \<longleftrightarrow> unsigned a \<le> unsigned b"
-  by (transfer fixing: less_eq) (simp add: nat_le_eq_zle)
-
-lemma word_less_iff_unsigned:
-  "a < b \<longleftrightarrow> unsigned a < unsigned b"
-  by (transfer fixing: less) (auto dest: preorder_class.le_less_trans [OF take_bit_nonnegative])
-
-end
-
-lemma word_of_nat_eq_iff:
-  \<open>word_of_nat m = (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m = take_bit LENGTH('a) n\<close>
-  by transfer (simp add: take_bit_of_nat)
-
-lemma word_of_nat_less_eq_iff:
-  \<open>word_of_nat m \<le> (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m \<le> take_bit LENGTH('a) n\<close>
-  by transfer (simp add: take_bit_of_nat)
-
-lemma word_of_nat_less_iff:
-  \<open>word_of_nat m < (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m < take_bit LENGTH('a) n\<close>
-  by transfer (simp add: take_bit_of_nat)
-
-lemma word_of_nat_eq_0_iff:
-  \<open>word_of_nat n = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd n\<close>
-  using of_nat_word_eq_iff [where ?'a = 'a, of n 0] by (simp add: take_bit_eq_0_iff)
-
-lemma word_of_int_eq_iff:
-  \<open>word_of_int k = (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k = take_bit LENGTH('a) l\<close>
-  by transfer rule
-
-lemma word_of_int_less_eq_iff:
-  \<open>word_of_int k \<le> (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k \<le> take_bit LENGTH('a) l\<close>
-  by transfer rule
-
-lemma word_of_int_less_iff:
-  \<open>word_of_int k < (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k < take_bit LENGTH('a) l\<close>
-  by transfer rule
-
-lemma word_of_int_eq_0_iff:
-  \<open>word_of_int k = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd k\<close>
-  using of_int_word_eq_iff [where ?'a = 'a, of k 0] by (simp add: take_bit_eq_0_iff)
-
-end