src/HOL/Word/BinOperations.thy
author kleing
Mon, 20 Aug 2007 04:34:31 +0200
changeset 24333 e77ea0ea7f2c
child 24350 4d74f37c6367
permissions -rw-r--r--
* HOL-Word: New extensive library and type for generic, fixed size machine words, with arithemtic, bit-wise, shifting and rotating operations, reflection into int, nat, and bool lists, automation for linear arithmetic (by automatic reflection into nat or int), including lemmas on overflow and monotonicity. Instantiated to all appropriate arithmetic type classes, supporting automatic simplification of numerals on all operations. Jointly developed by NICTA, Galois, and PSU. * still to do: README.html/document + moving some of the generic lemmas to appropriate place in distribution
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     1
(* 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     2
  ID:     $Id$
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     3
  Author: Jeremy Dawson and Gerwin Klein, NICTA
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     4
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     5
  definition and basic theorems for bit-wise logical operations 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     6
  for integers expressed using Pls, Min, BIT,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     7
  and converting them to and from lists of bools
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     8
*) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     9
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    10
theory BinOperations imports BinGeneral
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    11
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    12
begin
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    13
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    14
-- "bit-wise logical operations on the int type"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    15
consts
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    16
  int_and :: "int => int => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    17
  int_or :: "int => int => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    18
  bit_not :: "bit => bit"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    19
  bit_and :: "bit => bit => bit"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    20
  bit_or :: "bit => bit => bit"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    21
  bit_xor :: "bit => bit => bit"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    22
  int_not :: "int => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    23
  int_xor :: "int => int => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    24
  bin_sc :: "nat => bit => int => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    25
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    26
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    27
  B0 : "bit_not bit.B0 = bit.B1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    28
  B1 : "bit_not bit.B1 = bit.B0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    29
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    30
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    31
  B1 : "bit_xor bit.B1 x = bit_not x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    32
  B0 : "bit_xor bit.B0 x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    33
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    34
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    35
  B1 : "bit_or bit.B1 x = bit.B1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    36
  B0 : "bit_or bit.B0 x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    37
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    38
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    39
  B0 : "bit_and bit.B0 x = bit.B0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    40
  B1 : "bit_and bit.B1 x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    41
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    42
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    43
  Z : "bin_sc 0 b w = bin_rest w BIT b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    44
  Suc :
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    45
    "bin_sc (Suc n) b w = bin_sc n b (bin_rest w) BIT bin_last w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    46
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    47
defs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    48
  int_not_def : "int_not == bin_rec Numeral.Min Numeral.Pls 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    49
    (%w b s. s BIT bit_not b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    50
    int_and_def : "int_and == bin_rec (%x. Numeral.Pls) (%y. y) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    51
    (%w b s y. s (bin_rest y) BIT (bit_and b (bin_last y)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    52
  int_or_def : "int_or == bin_rec (%x. x) (%y. Numeral.Min) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    53
    (%w b s y. s (bin_rest y) BIT (bit_or b (bin_last y)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    54
  int_xor_def : "int_xor == bin_rec (%x. x) int_not 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    55
    (%w b s y. s (bin_rest y) BIT (bit_xor b (bin_last y)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    56
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    57
consts
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    58
  bin_to_bl :: "nat => int => bool list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    59
  bin_to_bl_aux :: "nat => int => bool list => bool list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    60
  bl_to_bin :: "bool list => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    61
  bl_to_bin_aux :: "int => bool list => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    62
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    63
  bl_of_nth :: "nat => (nat => bool) => bool list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    64
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    65
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    66
  Nil : "bl_to_bin_aux w [] = w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    67
  Cons : "bl_to_bin_aux w (b # bs) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    68
      bl_to_bin_aux (w BIT (if b then bit.B1 else bit.B0)) bs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    69
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    70
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    71
  Z : "bin_to_bl_aux 0 w bl = bl"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    72
  Suc : "bin_to_bl_aux (Suc n) w bl =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    73
    bin_to_bl_aux n (bin_rest w) ((bin_last w = bit.B1) # bl)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    74
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    75
defs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    76
  bin_to_bl_def : "bin_to_bl n w == bin_to_bl_aux n w []"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    77
  bl_to_bin_def : "bl_to_bin bs == bl_to_bin_aux Numeral.Pls bs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    78
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    79
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    80
  Suc : "bl_of_nth (Suc n) f = f n # bl_of_nth n f"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    81
  Z : "bl_of_nth 0 f = []"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    82
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    83
consts
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    84
  takefill :: "'a => nat => 'a list => 'a list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    85
  app2 :: "('a => 'b => 'c) => 'a list => 'b list => 'c list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    86
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    87
-- "takefill - like take but if argument list too short,"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    88
-- "extends result to get requested length"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    89
primrec
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    90
  Z : "takefill fill 0 xs = []"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    91
  Suc : "takefill fill (Suc n) xs = (
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    92
    case xs of [] => fill # takefill fill n xs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    93
      | y # ys => y # takefill fill n ys)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    94
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    95
defs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    96
  app2_def : "app2 f as bs == map (split f) (zip as bs)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    97
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    98
-- "rcat and rsplit"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    99
consts
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   100
  bin_rcat :: "nat => int list => int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   101
  bin_rsplit_aux :: "nat * int list * nat * int => int list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   102
  bin_rsplit :: "nat => (nat * int) => int list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   103
  bin_rsplitl_aux :: "nat * int list * nat * int => int list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   104
  bin_rsplitl :: "nat => (nat * int) => int list"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   105
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   106
recdef bin_rsplit_aux "measure (fst o snd o snd)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   107
  "bin_rsplit_aux (n, bs, (m, c)) =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   108
    (if m = 0 | n = 0 then bs else
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   109
      let (a, b) = bin_split n c 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   110
      in bin_rsplit_aux (n, b # bs, (m - n, a)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   111
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   112
recdef bin_rsplitl_aux "measure (fst o snd o snd)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   113
  "bin_rsplitl_aux (n, bs, (m, c)) =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   114
    (if m = 0 | n = 0 then bs else
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   115
      let (a, b) = bin_split (min m n) c 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   116
      in bin_rsplitl_aux (n, b # bs, (m - n, a)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   117
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   118
defs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   119
  bin_rcat_def : "bin_rcat n bs == foldl (%u v. bin_cat u n v) Numeral.Pls bs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   120
  bin_rsplit_def : "bin_rsplit n w == bin_rsplit_aux (n, [], w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   121
  bin_rsplitl_def : "bin_rsplitl n w == bin_rsplitl_aux (n, [], w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   122
     
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   123
 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   124
lemma int_not_simps [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   125
  "int_not Numeral.Pls = Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   126
  "int_not Numeral.Min = Numeral.Pls"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   127
  "int_not (w BIT b) = int_not w BIT bit_not b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   128
  by (unfold int_not_def) (auto intro: bin_rec_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   129
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   130
lemma bit_extra_simps [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   131
  "bit_and x bit.B0 = bit.B0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   132
  "bit_and x bit.B1 = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   133
  "bit_or x bit.B1 = bit.B1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   134
  "bit_or x bit.B0 = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   135
  "bit_xor x bit.B1 = bit_not x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   136
  "bit_xor x bit.B0 = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   137
  by (cases x, auto)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   138
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   139
lemma bit_ops_comm: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   140
  "bit_and x y = bit_and y x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   141
  "bit_or x y = bit_or y x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   142
  "bit_xor x y = bit_xor y x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   143
  by (cases y, auto)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   144
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   145
lemma bit_ops_same [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   146
  "bit_and x x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   147
  "bit_or x x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   148
  "bit_xor x x = bit.B0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   149
  by (cases x, auto)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   150
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   151
lemma bit_not_not [simp]: "bit_not (bit_not x) = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   152
  by (cases x) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   153
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   154
lemma int_xor_Pls [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   155
  "int_xor Numeral.Pls x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   156
  unfolding int_xor_def by (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   157
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   158
lemma int_xor_Min [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   159
  "int_xor Numeral.Min x = int_not x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   160
  unfolding int_xor_def by (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   161
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   162
lemma int_xor_Bits [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   163
  "int_xor (x BIT b) (y BIT c) = int_xor x y BIT bit_xor b c"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   164
  apply (unfold int_xor_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   165
  apply (rule bin_rec_simps (1) [THEN fun_cong, THEN trans])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   166
    apply (rule ext, simp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   167
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   168
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   169
  apply (rule ext)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   170
  apply (simp add: int_not_simps [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   171
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   172
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   173
lemma int_xor_x_simps':
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   174
  "int_xor w (Numeral.Pls BIT bit.B0) = w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   175
  "int_xor w (Numeral.Min BIT bit.B1) = int_not w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   176
  apply (induct w rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   177
       apply simp_all[4]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   178
   apply (unfold int_xor_Bits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   179
   apply clarsimp+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   180
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   181
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   182
lemmas int_xor_extra_simps [simp] = int_xor_x_simps' [simplified arith_simps]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   183
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   184
lemma int_or_Pls [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   185
  "int_or Numeral.Pls x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   186
  by (unfold int_or_def) (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   187
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   188
lemma int_or_Min [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   189
  "int_or Numeral.Min x = Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   190
  by (unfold int_or_def) (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   191
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   192
lemma int_or_Bits [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   193
  "int_or (x BIT b) (y BIT c) = int_or x y BIT bit_or b c"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   194
  unfolding int_or_def by (simp add: bin_rec_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   195
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   196
lemma int_or_x_simps': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   197
  "int_or w (Numeral.Pls BIT bit.B0) = w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   198
  "int_or w (Numeral.Min BIT bit.B1) = Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   199
  apply (induct w rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   200
       apply simp_all[4]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   201
   apply (unfold int_or_Bits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   202
   apply clarsimp+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   203
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   204
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   205
lemmas int_or_extra_simps [simp] = int_or_x_simps' [simplified arith_simps]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   206
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   207
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   208
lemma int_and_Pls [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   209
  "int_and Numeral.Pls x = Numeral.Pls"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   210
  unfolding int_and_def by (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   211
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   212
lemma  int_and_Min [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   213
  "int_and Numeral.Min x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   214
  unfolding int_and_def by (simp add: bin_rec_PM)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   215
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   216
lemma int_and_Bits [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   217
  "int_and (x BIT b) (y BIT c) = int_and x y BIT bit_and b c" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   218
  unfolding int_and_def by (simp add: bin_rec_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   219
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   220
lemma int_and_x_simps': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   221
  "int_and w (Numeral.Pls BIT bit.B0) = Numeral.Pls"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   222
  "int_and w (Numeral.Min BIT bit.B1) = w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   223
  apply (induct w rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   224
       apply simp_all[4]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   225
   apply (unfold int_and_Bits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   226
   apply clarsimp+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   227
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   228
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   229
lemmas int_and_extra_simps [simp] = int_and_x_simps' [simplified arith_simps]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   230
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   231
(* commutativity of the above *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   232
lemma bin_ops_comm:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   233
  shows
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   234
  int_and_comm: "!!y. int_and x y = int_and y x" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   235
  int_or_comm:  "!!y. int_or x y = int_or y x" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   236
  int_xor_comm: "!!y. int_xor x y = int_xor y x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   237
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   238
          apply simp_all[6]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   239
    apply (case_tac y rule: bin_exhaust, simp add: bit_ops_comm)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   240
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   241
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   242
lemma bin_ops_same [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   243
  "int_and x x = x" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   244
  "int_or x x = x" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   245
  "int_xor x x = Numeral.Pls"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   246
  by (induct x rule: bin_induct) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   247
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   248
lemma int_not_not [simp]: "int_not (int_not x) = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   249
  by (induct x rule: bin_induct) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   250
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   251
lemmas bin_log_esimps = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   252
  int_and_extra_simps  int_or_extra_simps  int_xor_extra_simps
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   253
  int_and_Pls int_and_Min  int_or_Pls int_or_Min  int_xor_Pls int_xor_Min
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   254
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   255
(* potential for looping *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   256
declare bin_rsplit_aux.simps [simp del]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   257
declare bin_rsplitl_aux.simps [simp del]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   258
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   259
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   260
lemma bin_sign_cat: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   261
  "!!y. bin_sign (bin_cat x n y) = bin_sign x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   262
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   263
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   264
lemma bin_cat_Suc_Bit:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   265
  "bin_cat w (Suc n) (v BIT b) = bin_cat w n v BIT b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   266
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   267
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   268
lemma bin_nth_cat: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   269
  "!!n y. bin_nth (bin_cat x k y) n = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   270
    (if n < k then bin_nth y n else bin_nth x (n - k))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   271
  apply (induct k)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   272
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   273
  apply (case_tac n, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   274
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   275
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   276
lemma bin_nth_split:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   277
  "!!b c. bin_split n c = (a, b) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   278
    (ALL k. bin_nth a k = bin_nth c (n + k)) & 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   279
    (ALL k. bin_nth b k = (k < n & bin_nth c k))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   280
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   281
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   282
  apply (clarsimp simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   283
  apply (case_tac k)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   284
  apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   285
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   286
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   287
lemma bin_cat_assoc: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   288
  "!!z. bin_cat (bin_cat x m y) n z = bin_cat x (m + n) (bin_cat y n z)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   289
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   290
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   291
lemma bin_cat_assoc_sym: "!!z m. 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   292
  bin_cat x m (bin_cat y n z) = bin_cat (bin_cat x (m - n) y) (min m n) z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   293
  apply (induct n, clarsimp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   294
  apply (case_tac m, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   295
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   296
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   297
lemma bin_cat_Pls [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   298
  "!!w. bin_cat Numeral.Pls n w = bintrunc n w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   299
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   300
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   301
lemma bintr_cat1: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   302
  "!!b. bintrunc (k + n) (bin_cat a n b) = bin_cat (bintrunc k a) n b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   303
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   304
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   305
lemma bintr_cat: "bintrunc m (bin_cat a n b) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   306
    bin_cat (bintrunc (m - n) a) n (bintrunc (min m n) b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   307
  by (rule bin_eqI) (auto simp: bin_nth_cat nth_bintr)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   308
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   309
lemma bintr_cat_same [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   310
  "bintrunc n (bin_cat a n b) = bintrunc n b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   311
  by (auto simp add : bintr_cat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   312
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   313
lemma cat_bintr [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   314
  "!!b. bin_cat a n (bintrunc n b) = bin_cat a n b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   315
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   316
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   317
lemma split_bintrunc: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   318
  "!!b c. bin_split n c = (a, b) ==> b = bintrunc n c"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   319
  by (induct n) (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   320
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   321
lemma bin_cat_split:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   322
  "!!v w. bin_split n w = (u, v) ==> w = bin_cat u n v"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   323
  by (induct n) (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   324
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   325
lemma bin_split_cat:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   326
  "!!w. bin_split n (bin_cat v n w) = (v, bintrunc n w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   327
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   328
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   329
lemma bin_split_Pls [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   330
  "bin_split n Numeral.Pls = (Numeral.Pls, Numeral.Pls)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   331
  by (induct n) (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   332
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   333
lemma bin_split_Min [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   334
  "bin_split n Numeral.Min = (Numeral.Min, bintrunc n Numeral.Min)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   335
  by (induct n) (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   336
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   337
lemma bin_split_trunc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   338
  "!!m b c. bin_split (min m n) c = (a, b) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   339
    bin_split n (bintrunc m c) = (bintrunc (m - n) a, b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   340
  apply (induct n, clarsimp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   341
  apply (simp add: bin_rest_trunc Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   342
  apply (case_tac m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   343
   apply (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   344
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   345
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   346
lemma bin_split_trunc1:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   347
  "!!m b c. bin_split n c = (a, b) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   348
    bin_split n (bintrunc m c) = (bintrunc (m - n) a, bintrunc m b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   349
  apply (induct n, clarsimp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   350
  apply (simp add: bin_rest_trunc Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   351
  apply (case_tac m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   352
   apply (auto simp: Let_def split: ls_splits)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   353
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   354
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   355
lemma bin_cat_num:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   356
  "!!b. bin_cat a n b = a * 2 ^ n + bintrunc n b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   357
  apply (induct n, clarsimp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   358
  apply (simp add: Bit_def cong: number_of_False_cong)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   359
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   360
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   361
lemma bin_split_num:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   362
  "!!b. bin_split n b = (b div 2 ^ n, b mod 2 ^ n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   363
  apply (induct n, clarsimp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   364
  apply (simp add: bin_rest_div zdiv_zmult2_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   365
  apply (case_tac b rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   366
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   367
  apply (simp add: Bit_def zmod_zmult_zmult1 p1mod22k
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   368
              split: bit.split 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   369
              cong: number_of_False_cong)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   370
  done 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   371
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   372
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   373
(* basic properties of logical (bit-wise) operations *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   374
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   375
lemma bbw_ao_absorb: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   376
  "!!y. int_and x (int_or y x) = x & int_or x (int_and y x) = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   377
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   378
    apply auto 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   379
   apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   380
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   381
   apply (case_tac [!] bit)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   382
     apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   383
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   384
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   385
lemma bbw_ao_absorbs_other:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   386
  "int_and x (int_or x y) = x \<and> int_or (int_and y x) x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   387
  "int_and (int_or y x) x = x \<and> int_or x (int_and x y) = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   388
  "int_and (int_or x y) x = x \<and> int_or (int_and x y) x = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   389
  apply (auto simp: bbw_ao_absorb int_or_comm)  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   390
      apply (subst int_or_comm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   391
    apply (simp add: bbw_ao_absorb)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   392
   apply (subst int_and_comm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   393
   apply (subst int_or_comm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   394
   apply (simp add: bbw_ao_absorb)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   395
  apply (subst int_and_comm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   396
  apply (simp add: bbw_ao_absorb)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   397
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   398
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   399
lemmas bbw_ao_absorbs [simp] = bbw_ao_absorb bbw_ao_absorbs_other
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   400
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   401
lemma int_xor_not:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   402
  "!!y. int_xor (int_not x) y = int_not (int_xor x y) & 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   403
        int_xor x (int_not y) = int_not (int_xor x y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   404
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   405
    apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   406
   apply (case_tac y rule: bin_exhaust, auto, 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   407
          case_tac b, auto)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   408
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   409
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   410
lemma bbw_assocs': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   411
  "!!y z. int_and (int_and x y) z = int_and x (int_and y z) & 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   412
          int_or (int_or x y) z = int_or x (int_or y z) & 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   413
          int_xor (int_xor x y) z = int_xor x (int_xor y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   414
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   415
    apply (auto simp: int_xor_not)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   416
    apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   417
    apply (case_tac [!] z rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   418
    apply (case_tac [!] bit)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   419
       apply (case_tac [!] b)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   420
             apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   421
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   422
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   423
lemma int_and_assoc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   424
  "int_and (int_and x y) z = int_and x (int_and y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   425
  by (simp add: bbw_assocs')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   426
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   427
lemma int_or_assoc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   428
  "int_or (int_or x y) z = int_or x (int_or y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   429
  by (simp add: bbw_assocs')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   430
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   431
lemma int_xor_assoc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   432
  "int_xor (int_xor x y) z = int_xor x (int_xor y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   433
  by (simp add: bbw_assocs')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   434
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   435
lemmas bbw_assocs = int_and_assoc int_or_assoc int_xor_assoc
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   436
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   437
lemma bbw_lcs [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   438
  "int_and y (int_and x z) = int_and x (int_and y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   439
  "int_or y (int_or x z) = int_or x (int_or y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   440
  "int_xor y (int_xor x z) = int_xor x (int_xor y z)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   441
  apply (auto simp: bbw_assocs [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   442
  apply (auto simp: bin_ops_comm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   443
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   444
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   445
lemma bbw_not_dist: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   446
  "!!y. int_not (int_or x y) = int_and (int_not x) (int_not y)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   447
  "!!y. int_not (int_and x y) = int_or (int_not x) (int_not y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   448
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   449
       apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   450
   apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   451
   apply (case_tac [!] bit, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   452
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   453
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   454
lemma bbw_oa_dist: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   455
  "!!y z. int_or (int_and x y) z = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   456
          int_and (int_or x z) (int_or y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   457
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   458
    apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   459
  apply (case_tac y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   460
  apply (case_tac z rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   461
  apply (case_tac ba, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   462
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   463
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   464
lemma bbw_ao_dist: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   465
  "!!y z. int_and (int_or x y) z = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   466
          int_or (int_and x z) (int_and y z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   467
   apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   468
    apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   469
  apply (case_tac y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   470
  apply (case_tac z rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   471
  apply (case_tac ba, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   472
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   473
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   474
declare bin_ops_comm [simp] bbw_assocs [simp] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   475
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   476
lemma plus_and_or [rule_format]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   477
  "ALL y. int_and x y + int_or x y = x + y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   478
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   479
    apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   480
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   481
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   482
  apply (case_tac y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   483
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   484
  apply (unfold Bit_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   485
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   486
  apply (erule_tac x = "x" in allE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   487
  apply (simp split: bit.split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   488
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   489
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   490
lemma le_int_or:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   491
  "!!x.  bin_sign y = Numeral.Pls ==> x <= int_or x y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   492
  apply (induct y rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   493
    apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   494
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   495
  apply (case_tac x rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   496
  apply (case_tac b)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   497
   apply (case_tac [!] bit)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   498
     apply (auto simp: less_eq_numeral_code)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   499
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   500
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   501
lemmas int_and_le =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   502
  xtr3 [OF bbw_ao_absorbs (2) [THEN conjunct2, symmetric] le_int_or] ;
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   503
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   504
(** nth bit, set/clear **)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   505
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   506
lemma bin_nth_sc [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   507
  "!!w. bin_nth (bin_sc n b w) n = (b = bit.B1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   508
  by (induct n)  auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   509
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   510
lemma bin_sc_sc_same [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   511
  "!!w. bin_sc n c (bin_sc n b w) = bin_sc n c w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   512
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   513
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   514
lemma bin_sc_sc_diff:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   515
  "!!w m. m ~= n ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   516
    bin_sc m c (bin_sc n b w) = bin_sc n b (bin_sc m c w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   517
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   518
   apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   519
   apply (case_tac [!] m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   520
     apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   521
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   522
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   523
lemma bin_nth_sc_gen: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   524
  "!!w m. bin_nth (bin_sc n b w) m = (if m = n then b = bit.B1 else bin_nth w m)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   525
  by (induct n) (case_tac [!] m, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   526
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   527
lemma bin_sc_nth [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   528
  "!!w. (bin_sc n (If (bin_nth w n) bit.B1 bit.B0) w) = w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   529
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   530
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   531
lemma bin_sign_sc [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   532
  "!!w. bin_sign (bin_sc n b w) = bin_sign w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   533
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   534
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   535
lemma bin_sc_bintr [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   536
  "!!w m. bintrunc m (bin_sc n x (bintrunc m (w))) = bintrunc m (bin_sc n x w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   537
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   538
   apply (case_tac [!] w rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   539
   apply (case_tac [!] m, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   540
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   541
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   542
lemma bin_clr_le:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   543
  "!!w. bin_sc n bit.B0 w <= w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   544
  apply (induct n) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   545
   apply (case_tac [!] w rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   546
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   547
   apply (unfold Bit_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   548
   apply (simp_all split: bit.split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   549
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   550
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   551
lemma bin_set_ge:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   552
  "!!w. bin_sc n bit.B1 w >= w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   553
  apply (induct n) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   554
   apply (case_tac [!] w rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   555
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   556
   apply (unfold Bit_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   557
   apply (simp_all split: bit.split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   558
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   559
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   560
lemma bintr_bin_clr_le:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   561
  "!!w m. bintrunc n (bin_sc m bit.B0 w) <= bintrunc n w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   562
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   563
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   564
  apply (case_tac w rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   565
  apply (case_tac m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   566
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   567
   apply (unfold Bit_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   568
   apply (simp_all split: bit.split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   569
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   570
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   571
lemma bintr_bin_set_ge:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   572
  "!!w m. bintrunc n (bin_sc m bit.B1 w) >= bintrunc n w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   573
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   574
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   575
  apply (case_tac w rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   576
  apply (case_tac m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   577
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   578
   apply (unfold Bit_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   579
   apply (simp_all split: bit.split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   580
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   581
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   582
lemma bin_nth_ops:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   583
  "!!x y. bin_nth (int_and x y) n = (bin_nth x n & bin_nth y n)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   584
  "!!x y. bin_nth (int_or x y) n = (bin_nth x n | bin_nth y n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   585
  "!!x y. bin_nth (int_xor x y) n = (bin_nth x n ~= bin_nth y n)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   586
  "!!x. bin_nth (int_not x) n = (~ bin_nth x n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   587
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   588
         apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   589
                         apply (case_tac [!] x rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   590
                         apply simp_all
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   591
                      apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   592
                      apply simp_all
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   593
        apply (auto dest: not_B1_is_B0 intro: B1_ass_B0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   594
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   595
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   596
lemma bin_sc_FP [simp]: "bin_sc n bit.B0 Numeral.Pls = Numeral.Pls"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   597
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   598
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   599
lemma bin_sc_TM [simp]: "bin_sc n bit.B1 Numeral.Min = Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   600
  by (induct n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   601
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   602
lemmas bin_sc_simps = bin_sc.Z bin_sc.Suc bin_sc_TM bin_sc_FP
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   603
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   604
lemma bin_sc_minus:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   605
  "0 < n ==> bin_sc (Suc (n - 1)) b w = bin_sc n b w"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   606
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   607
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   608
lemmas bin_sc_Suc_minus = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   609
  trans [OF bin_sc_minus [symmetric] bin_sc.Suc, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   610
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   611
lemmas bin_sc_Suc_pred [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   612
  bin_sc_Suc_minus [of "number_of bin", simplified nobm1, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   613
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   614
(* interaction between bit-wise and arithmetic *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   615
(* good example of bin_induction *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   616
lemma bin_add_not: "x + int_not x = Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   617
  apply (induct x rule: bin_induct)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   618
    apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   619
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   620
  apply (case_tac bit, auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   621
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   622
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   623
(* truncating results of bit-wise operations *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   624
lemma bin_trunc_ao: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   625
  "!!x y. int_and (bintrunc n x) (bintrunc n y) = bintrunc n (int_and x y)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   626
  "!!x y. int_or (bintrunc n x) (bintrunc n y) = bintrunc n (int_or x y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   627
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   628
      apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   629
      apply (case_tac [!] x rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   630
      apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   631
      apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   632
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   633
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   634
lemma bin_trunc_xor: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   635
  "!!x y. bintrunc n (int_xor (bintrunc n x) (bintrunc n y)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   636
          bintrunc n (int_xor x y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   637
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   638
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   639
   apply (case_tac [!] x rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   640
   apply (case_tac [!] y rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   641
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   642
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   643
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   644
lemma bin_trunc_not: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   645
  "!!x. bintrunc n (int_not (bintrunc n x)) = bintrunc n (int_not x)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   646
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   647
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   648
   apply (case_tac [!] x rule: bin_exhaust)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   649
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   650
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   651
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   652
(* want theorems of the form of bin_trunc_xor *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   653
lemma bintr_bintr_i:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   654
  "x = bintrunc n y ==> bintrunc n x = bintrunc n y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   655
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   656
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   657
lemmas bin_trunc_and = bin_trunc_ao(1) [THEN bintr_bintr_i]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   658
lemmas bin_trunc_or = bin_trunc_ao(2) [THEN bintr_bintr_i]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   659
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   660
lemma nth_2p_bin: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   661
  "!!m. bin_nth (2 ^ n) m = (m = n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   662
  apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   663
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   664
   apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   665
     apply (case_tac m) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   666
      apply (auto simp: trans [OF numeral_1_eq_1 [symmetric] number_of_eq])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   667
   apply (case_tac m) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   668
    apply (auto simp: Bit_B0_2t [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   669
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   670
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   671
(* for use when simplifying with bin_nth_Bit *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   672
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   673
lemma ex_eq_or:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   674
  "(EX m. n = Suc m & (m = k | P m)) = (n = Suc k | (EX m. n = Suc m & P m))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   675
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   676
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   677
end
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   678