src/HOL/Word/Misc_lsb.thy
author haftmann
Mon, 06 Jul 2020 10:47:30 +0000
changeset 72000 379d0c207c29
child 72079 8c355e2dd7db
permissions -rw-r--r--
separation of traditional bit operations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72000
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     1
(*  Author:     Jeremy Dawson, NICTA
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     2
*)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     3
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     4
section \<open>Operation variant for the least significant bit\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     5
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     6
theory Misc_lsb
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     7
  imports Word
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     8
begin
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
     9
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    10
class lsb = semiring_bits +
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    11
  fixes lsb :: \<open>'a \<Rightarrow> bool\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    12
  assumes lsb_odd: \<open>lsb = odd\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    13
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    14
instantiation int :: lsb
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    15
begin
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    16
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    17
definition lsb_int :: \<open>int \<Rightarrow> bool\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    18
  where \<open>lsb i = i !! 0\<close> for i :: int
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    19
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    20
instance
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    21
  by standard (simp add: fun_eq_iff lsb_int_def)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    22
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    23
end
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    24
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    25
lemma bin_last_conv_lsb: "bin_last = lsb"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    26
  by (simp add: lsb_odd)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    27
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    28
lemma int_lsb_numeral [simp]:
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    29
  "lsb (0 :: int) = False"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    30
  "lsb (1 :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    31
  "lsb (Numeral1 :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    32
  "lsb (- 1 :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    33
  "lsb (- Numeral1 :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    34
  "lsb (numeral (num.Bit0 w) :: int) = False"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    35
  "lsb (numeral (num.Bit1 w) :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    36
  "lsb (- numeral (num.Bit0 w) :: int) = False"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    37
  "lsb (- numeral (num.Bit1 w) :: int) = True"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    38
  by (simp_all add: lsb_int_def)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    39
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    40
instantiation word :: (len) lsb
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    41
begin
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    42
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    43
definition lsb_word :: \<open>'a word \<Rightarrow> bool\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    44
  where word_lsb_def: \<open>lsb a \<longleftrightarrow> odd (uint a)\<close> for a :: \<open>'a word\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    45
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    46
instance
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    47
  apply standard
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    48
  apply (simp add: fun_eq_iff word_lsb_def)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    49
  apply transfer apply simp
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    50
  done
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    51
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    52
end
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    53
  
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    54
lemma lsb_word_eq:
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    55
  \<open>lsb = (odd :: 'a word \<Rightarrow> bool)\<close> for w :: \<open>'a::len word\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    56
  by (fact lsb_odd)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    57
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    58
lemma word_lsb_alt: "lsb w = test_bit w 0"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    59
  for w :: "'a::len word"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    60
  by (auto simp: word_test_bit_def word_lsb_def)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    61
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    62
lemma word_lsb_1_0 [simp]: "lsb (1::'a::len word) \<and> \<not> lsb (0::'b::len word)"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    63
  unfolding word_lsb_def uint_eq_0 uint_1 by simp
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    64
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    65
lemma word_lsb_last:
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    66
  \<open>lsb w \<longleftrightarrow> last (to_bl w)\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    67
  for w :: \<open>'a::len word\<close>
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    68
  using nth_to_bl [of \<open>LENGTH('a) - Suc 0\<close> w]
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    69
  by (simp add: lsb_odd last_conv_nth)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    70
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    71
lemma word_lsb_int: "lsb w \<longleftrightarrow> uint w mod 2 = 1"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    72
  apply (simp add: lsb_odd flip: odd_iff_mod_2_eq_one)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    73
  apply transfer
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    74
  apply simp
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    75
  done
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    76
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    77
lemmas word_ops_lsb = lsb0 [unfolded word_lsb_alt]
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    78
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    79
lemma word_lsb_numeral [simp]:
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    80
  "lsb (numeral bin :: 'a::len word) \<longleftrightarrow> bin_last (numeral bin)"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    81
  unfolding word_lsb_alt test_bit_numeral by simp
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    82
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    83
lemma word_lsb_neg_numeral [simp]:
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    84
  "lsb (- numeral bin :: 'a::len word) \<longleftrightarrow> bin_last (- numeral bin)"
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    85
  by (simp add: word_lsb_alt)
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    86
379d0c207c29 separation of traditional bit operations
haftmann
parents:
diff changeset
    87
end