src/HOL/ex/Word_Conversions.thy
author haftmann
Mon, 10 Aug 2020 08:27:24 +0200
changeset 72129 9e0321263eb3
parent 72102 0b21b2beadb5
permissions -rw-r--r--
consolidated names
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     1
(*  Author:  Florian Haftmann, TUM
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     2
*)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     3
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     4
section \<open>Proof of concept for conversions for algebraically founded bit word types\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     5
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     6
theory Word_Conversions
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     7
  imports
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     8
    Main
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
     9
    "HOL-Library.Type_Length"
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    10
    "HOL-Library.Bit_Operations"
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    11
    "HOL-Word.Word"
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    12
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    13
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    14
context semiring_1
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    15
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    16
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    17
lift_definition unsigned :: \<open>'b::len word \<Rightarrow> 'a\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    18
  is \<open>of_nat \<circ> nat \<circ> take_bit LENGTH('b)\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    19
  by simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    20
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    21
lemma unsigned_0 [simp]:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    22
  \<open>unsigned 0 = 0\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    23
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    24
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    25
lemma unsigned_1 [simp]:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    26
  \<open>unsigned 1 = 1\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    27
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    28
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    29
end
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    30
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    31
lemma unat_unsigned:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    32
  \<open>unat = unsigned\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    33
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    34
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    35
lemma uint_unsigned:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    36
  \<open>uint = unsigned\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    37
  by transfer (simp add: fun_eq_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    38
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    39
context semiring_char_0
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    40
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    41
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    42
lemma unsigned_word_eqI:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    43
  \<open>v = w\<close> if \<open>unsigned v = unsigned w\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    44
  using that by transfer (simp add: eq_nat_nat_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    45
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    46
lemma word_eq_iff_unsigned:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    47
  \<open>v = w \<longleftrightarrow> unsigned v = unsigned w\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    48
  by (auto intro: unsigned_word_eqI)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    49
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    50
end
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    51
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    52
context ring_1
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    53
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    54
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    55
lift_definition signed :: \<open>'b::len word \<Rightarrow> 'a\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    56
  is \<open>of_int \<circ> signed_take_bit (LENGTH('b) - 1)\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    57
  by (simp flip: signed_take_bit_decr_length_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    58
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    59
lemma signed_0 [simp]:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    60
  \<open>signed 0 = 0\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    61
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    62
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    63
lemma signed_1 [simp]:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    64
  \<open>signed (1 :: 'b::len word) = (if LENGTH('b) = 1 then - 1 else 1)\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    65
  by (transfer fixing: uminus)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    66
    (simp_all add: signed_take_bit_eq not_le Suc_lessI)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    67
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    68
lemma signed_minus_1 [simp]:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    69
  \<open>signed (- 1 :: 'b::len word) = - 1\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    70
  by (transfer fixing: uminus) simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    71
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    72
end
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    73
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    74
lemma sint_signed:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    75
  \<open>sint = signed\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    76
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    77
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    78
context ring_char_0
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    79
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    80
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    81
lemma signed_word_eqI:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    82
  \<open>v = w\<close> if \<open>signed v = signed w\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    83
  using that by transfer (simp flip: signed_take_bit_decr_length_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    84
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    85
lemma word_eq_iff_signed:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    86
  \<open>v = w \<longleftrightarrow> signed v = signed w\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    87
  by (auto intro: signed_word_eqI)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    88
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    89
end
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    90
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    91
abbreviation nat_of_word :: \<open>'a::len word \<Rightarrow> nat\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    92
  where \<open>nat_of_word \<equiv> unsigned\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    93
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    94
abbreviation unsigned_int :: \<open>'a::len word \<Rightarrow> int\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    95
  where \<open>unsigned_int \<equiv> unsigned\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    96
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    97
abbreviation signed_int :: \<open>'a::len word \<Rightarrow> int\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    98
  where \<open>signed_int \<equiv> signed\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
    99
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   100
abbreviation word_of_nat :: \<open>nat \<Rightarrow> 'a::len word\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   101
  where \<open>word_of_nat \<equiv> of_nat\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   103
abbreviation word_of_int :: \<open>int \<Rightarrow> 'a::len word\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   104
  where \<open>word_of_int \<equiv> of_int\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   105
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   106
lemma unsigned_of_nat [simp]:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   107
  \<open>unsigned (of_nat n :: 'a::len word) = of_nat (take_bit LENGTH('a) n)\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   108
  by transfer (simp add: nat_eq_iff take_bit_of_nat)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   109
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   110
lemma of_nat_of_word [simp]:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   111
  \<open>of_nat (nat_of_word w) = unsigned w\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   112
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   113
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   114
lemma of_int_unsigned [simp]:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   115
  \<open>of_int (unsigned_int w) = unsigned w\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   116
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   117
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   118
lemma unsigned_int_greater_eq:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   119
  \<open>0 \<le> unsigned_int w\<close> for w :: \<open>'a::len word\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   120
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   121
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   122
lemma nat_of_word_less:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   123
  \<open>nat_of_word w < 2 ^ LENGTH('a)\<close> for w :: \<open>'a::len word\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   124
  by transfer (simp add: take_bit_eq_mod)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   125
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   126
lemma unsigned_int_less:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   127
  \<open>unsigned_int w < 2 ^ LENGTH('a)\<close> for w :: \<open>'a::len word\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   128
  by transfer (simp add: take_bit_eq_mod)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   129
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   130
lemma signed_of_int [simp]:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   131
  \<open>signed (word_of_int k :: 'a::len word) = of_int (signed_take_bit (LENGTH('a) - 1) k)\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   132
  by transfer simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   133
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   134
lemma of_int_signed [simp]:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   135
  \<open>of_int (signed_int a) = signed a\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   136
  by transfer (simp_all add: take_bit_signed_take_bit)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   137
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   138
lemma signed_int_greater_eq:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   139
  \<open>- (2 ^ (LENGTH('a) - 1)) \<le> signed_int w\<close> for w :: \<open>'a::len word\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   140
proof (cases \<open>bit w (LENGTH('a) - 1)\<close>)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   141
  case True
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   142
  then show ?thesis
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   143
    by transfer (simp add: signed_take_bit_eq_or minus_exp_eq_not_mask or_greater_eq ac_simps)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   144
next
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   145
  have *: \<open>- (2 ^ (LENGTH('a) - Suc 0)) \<le> (0::int)\<close>
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   146
    by simp
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   147
  case False
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   148
  then show ?thesis
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   149
    by transfer (auto simp add: signed_take_bit_eq intro: order_trans *)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   150
qed
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   151
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   152
lemma signed_int_less:
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   153
  \<open>signed_int w < 2 ^ (LENGTH('a) - 1)\<close> for w :: \<open>'a::len word\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   154
  by (cases \<open>bit w (LENGTH('a) - 1)\<close>; transfer)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   155
    (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)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   156
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   157
context linordered_semidom
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   158
begin
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   159
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   160
lemma word_less_eq_iff_unsigned:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   161
  "a \<le> b \<longleftrightarrow> unsigned a \<le> unsigned b"
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   162
  by (transfer fixing: less_eq) (simp add: nat_le_eq_zle)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   163
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   164
lemma word_less_iff_unsigned:
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   165
  "a < b \<longleftrightarrow> unsigned a < unsigned b"
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   166
  by (transfer fixing: less) (auto dest: preorder_class.le_less_trans [OF take_bit_nonnegative])
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   167
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   168
end
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   169
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   170
lemma word_of_nat_eq_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   171
  \<open>word_of_nat m = (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m = take_bit LENGTH('a) n\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   172
  by transfer (simp add: take_bit_of_nat)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   173
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   174
lemma word_of_nat_less_eq_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   175
  \<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>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   176
  by transfer (simp add: take_bit_of_nat)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   177
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   178
lemma word_of_nat_less_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   179
  \<open>word_of_nat m < (word_of_nat n :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) m < take_bit LENGTH('a) n\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   180
  by transfer (simp add: take_bit_of_nat)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   181
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   182
lemma word_of_nat_eq_0_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   183
  \<open>word_of_nat n = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd n\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   184
  using of_nat_word_eq_iff [where ?'a = 'a, of n 0] by (simp add: take_bit_eq_0_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   185
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   186
lemma word_of_int_eq_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   187
  \<open>word_of_int k = (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k = take_bit LENGTH('a) l\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   188
  by transfer rule
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   189
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   190
lemma word_of_int_less_eq_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   191
  \<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>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   192
  by transfer rule
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   193
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   194
lemma word_of_int_less_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   195
  \<open>word_of_int k < (word_of_int l :: 'a::len word) \<longleftrightarrow> take_bit LENGTH('a) k < take_bit LENGTH('a) l\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   196
  by transfer rule
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   197
72129
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   198
lemma word_of_int_eq_0_iff:
9e0321263eb3 consolidated names
haftmann
parents: 72102
diff changeset
   199
  \<open>word_of_int k = (0 :: 'a::len word) \<longleftrightarrow> 2 ^ LENGTH('a) dvd k\<close>
72102
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   200
  using of_int_word_eq_iff [where ?'a = 'a, of k 0] by (simp add: take_bit_eq_0_iff)
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   201
0b21b2beadb5 tailored towards remaining essence
haftmann
parents:
diff changeset
   202
end