src/HOL/ex/Word_Lsb_Msb.thy
author wenzelm
Wed, 27 Jul 2022 13:13:59 +0200
changeset 75709 a068fb7346ef
parent 75655 be0865060346
child 75712 ff0aceed8923
permissions -rw-r--r--
clarified while-loops;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75655
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     1
theory Word_Lsb_Msb
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     2
  imports "HOL-Library.Word"          
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     3
begin
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     4
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     5
class word = ring_bit_operations +
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     6
  fixes word_length :: \<open>'a itself \<Rightarrow> nat\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     7
  assumes word_length_positive [simp]: \<open>0 < word_length TYPE('a)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     8
    and possible_bit_msb [simp]: \<open>possible_bit TYPE('a) (word_length TYPE('a) - Suc 0)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
     9
    and not_possible_bit_length [simp]: \<open>\<not> possible_bit TYPE('a) (word_length TYPE('a))\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    10
begin
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    11
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    12
lemma word_length_not_0 [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    13
  \<open>word_length TYPE('a) \<noteq> 0\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    14
  using word_length_positive
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    15
  by simp 
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    16
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    17
end
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    18
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    19
instantiation word :: (len) word
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    20
begin
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    21
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    22
definition word_length_word :: \<open>'a word itself \<Rightarrow> nat\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    23
  where [simp, code_unfold]: \<open>word_length_word _ = LENGTH('a)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    24
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    25
instance
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    26
  by standard simp_all
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    27
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    28
end
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    29
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    30
context word
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    31
begin
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    32
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    33
context
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    34
  includes bit_operations_syntax
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    35
begin
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    36
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    37
abbreviation lsb :: \<open>'a \<Rightarrow> bool\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    38
  where \<open>lsb \<equiv> odd\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    39
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    40
definition msb :: \<open>'a \<Rightarrow> bool\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    41
  where \<open>msb w = bit w (word_length TYPE('a) - Suc 0)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    42
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    43
lemma not_msb_0 [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    44
  \<open>\<not> msb 0\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    45
  by (simp add: msb_def)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    46
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    47
lemma msb_minus_1 [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    48
  \<open>msb (- 1)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    49
  by (simp add: msb_def)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    50
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    51
lemma msb_1_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    52
  \<open>msb 1 \<longleftrightarrow> word_length TYPE('a) = 1\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    53
  by (auto simp add: msb_def bit_simps le_less)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    54
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    55
lemma msb_minus_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    56
  \<open>msb (- w) \<longleftrightarrow> \<not> msb (w - 1)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    57
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    58
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    59
lemma msb_not_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    60
  \<open>msb (NOT w) \<longleftrightarrow> \<not> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    61
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    62
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    63
lemma msb_and_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    64
  \<open>msb (v AND w) \<longleftrightarrow> msb v \<and> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    65
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    66
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    67
lemma msb_or_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    68
  \<open>msb (v OR w) \<longleftrightarrow> msb v \<or> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    69
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    70
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    71
lemma msb_xor_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    72
  \<open>msb (v XOR w) \<longleftrightarrow> \<not> (msb v \<longleftrightarrow> msb w)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    73
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    74
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    75
lemma msb_exp_iff [simp]:                                             
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    76
  \<open>msb (2 ^ n) \<longleftrightarrow> n = word_length TYPE('a) - Suc 0\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    77
  by (simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    78
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    79
lemma msb_mask_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    80
  \<open>msb (mask n) \<longleftrightarrow> word_length TYPE('a) \<le> n\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    81
  by (simp add: msb_def bit_simps less_diff_conv2 Suc_le_eq less_Suc_eq_le)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    82
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    83
lemma msb_set_bit_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    84
  \<open>msb (set_bit n w) \<longleftrightarrow> n = word_length TYPE('a) - Suc 0 \<or> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    85
  by (simp add: set_bit_eq_or ac_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    86
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    87
lemma msb_unset_bit_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    88
  \<open>msb (unset_bit n w) \<longleftrightarrow> n \<noteq> word_length TYPE('a) - Suc 0 \<and> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    89
  by (simp add: unset_bit_eq_and_not ac_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    90
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    91
lemma msb_flip_bit_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    92
  \<open>msb (flip_bit n w) \<longleftrightarrow> (n \<noteq> word_length TYPE('a) - Suc 0 \<longleftrightarrow> msb w)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    93
  by (auto simp add: flip_bit_eq_xor)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    94
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    95
lemma msb_push_bit_iff:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    96
  \<open>msb (push_bit n w) \<longleftrightarrow> n < word_length TYPE('a) \<and> bit w (word_length TYPE('a) - Suc n)\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    97
  by (simp add: msb_def bit_simps le_diff_conv2 Suc_le_eq)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    98
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
    99
(*lemma msb_drop_bit_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   100
  \<open>msb (drop_bit n w) \<longleftrightarrow> n = 0 \<and> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   101
  apply (cases n)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   102
  apply simp_all
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   103
  apply (auto simp add: msb_def bit_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   104
  oops*)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   105
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   106
lemma msb_take_bit_iff [simp]:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   107
  \<open>msb (take_bit n w) \<longleftrightarrow> word_length TYPE('a) \<le> n \<and> msb w\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   108
  by (simp add: take_bit_eq_mask ac_simps)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   109
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   110
(*lemma msb_signed_take_bit_iff:
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   111
  \<open>msb (signed_take_bit n w) \<longleftrightarrow> P w n\<close>
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   112
  unfolding signed_take_bit_def
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   113
  apply (simp add: signed_take_bit_def not_le)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   114
  apply auto
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   115
  oops*)
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   116
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   117
end
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   118
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   119
end
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   120
be0865060346 sketch for word-specific lsb and msb
haftmann
parents:
diff changeset
   121
end