src/HOL/Word/Ancient_Numeral.thy
author haftmann
Tue, 04 Aug 2020 09:33:05 +0000
changeset 72082 41393ecb57ac
parent 72028 08f1e4cb735f
child 72241 5a6d8675bf4b
permissions -rw-r--r--
uniform mask operation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     1
theory Ancient_Numeral
72000
379d0c207c29 separation of traditional bit operations
haftmann
parents: 71991
diff changeset
     2
  imports Main Bits_Int Misc_lsb Misc_msb
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     3
begin
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     4
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     5
definition Bit :: "int \<Rightarrow> bool \<Rightarrow> int"  (infixl "BIT" 90)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     6
  where "k BIT b = (if b then 1 else 0) + k + k"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     7
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     8
lemma Bit_B0: "k BIT False = k + k"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
     9
   by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    10
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    11
lemma Bit_B1: "k BIT True = k + k + 1"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    12
   by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    13
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    14
lemma Bit_B0_2t: "k BIT False = 2 * k"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    15
  by (rule trans, rule Bit_B0) simp
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    16
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    17
lemma Bit_B1_2t: "k BIT True = 2 * k + 1"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    18
  by (rule trans, rule Bit_B1) simp
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    19
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    20
lemma uminus_Bit_eq:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    21
  "- k BIT b = (- k - of_bool b) BIT b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    22
  by (cases b) (simp_all add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    23
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    24
lemma power_BIT: "2 ^ Suc n - 1 = (2 ^ n - 1) BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    25
  by (simp add: Bit_B1)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    26
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    27
lemma bin_rl_simp [simp]: "bin_rest w BIT bin_last w = w"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    28
  by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    29
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    30
lemma bin_rest_BIT [simp]: "bin_rest (x BIT b) = x"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    31
  by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    32
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    33
lemma even_BIT [simp]: "even (x BIT b) \<longleftrightarrow> \<not> b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    34
  by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    35
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    36
lemma bin_last_BIT [simp]: "bin_last (x BIT b) = b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    37
  by simp
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    38
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    39
lemma BIT_eq_iff [iff]: "u BIT b = v BIT c \<longleftrightarrow> u = v \<and> b = c"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    40
  by (auto simp: Bit_def) arith+
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    41
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    42
lemma BIT_bin_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    43
  "numeral k BIT False = numeral (Num.Bit0 k)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    44
  "numeral k BIT True = numeral (Num.Bit1 k)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    45
  "(- numeral k) BIT False = - numeral (Num.Bit0 k)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    46
  "(- numeral k) BIT True = - numeral (Num.BitM k)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    47
  by (simp_all only: Bit_B0 Bit_B1 numeral.simps numeral_BitM)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    48
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    49
lemma BIT_special_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    50
  shows "0 BIT False = 0"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    51
    and "0 BIT True = 1"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    52
    and "1 BIT False = 2"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    53
    and "1 BIT True = 3"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    54
    and "(- 1) BIT False = - 2"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    55
    and "(- 1) BIT True = - 1"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    56
  by (simp_all add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    57
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    58
lemma Bit_eq_0_iff: "w BIT b = 0 \<longleftrightarrow> w = 0 \<and> \<not> b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    59
  by (auto simp: Bit_def) arith
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    60
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    61
lemma Bit_eq_m1_iff: "w BIT b = -1 \<longleftrightarrow> w = -1 \<and> b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    62
  by (auto simp: Bit_def) arith
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    63
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    64
lemma expand_BIT:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    65
  "numeral (Num.Bit0 w) = numeral w BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    66
  "numeral (Num.Bit1 w) = numeral w BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    67
  "- numeral (Num.Bit0 w) = (- numeral w) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    68
  "- numeral (Num.Bit1 w) = (- numeral (w + Num.One)) BIT True"
71991
8bff286878bf misc lemma tuning
haftmann
parents: 71986
diff changeset
    69
  by (simp_all add: BitM_inc_eq add_One)
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    70
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    71
lemma less_Bits: "v BIT b < w BIT c \<longleftrightarrow> v < w \<or> v \<le> w \<and> \<not> b \<and> c"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    72
  by (auto simp: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    73
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    74
lemma le_Bits: "v BIT b \<le> w BIT c \<longleftrightarrow> v < w \<or> v \<le> w \<and> (\<not> b \<or> c)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    75
  by (auto simp: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    76
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    77
lemma pred_BIT_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    78
  "x BIT False - 1 = (x - 1) BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    79
  "x BIT True - 1 = x BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    80
  by (simp_all add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    81
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    82
lemma succ_BIT_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    83
  "x BIT False + 1 = x BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    84
  "x BIT True + 1 = (x + 1) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    85
  by (simp_all add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    86
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    87
lemma add_BIT_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    88
  "x BIT False + y BIT False = (x + y) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    89
  "x BIT False + y BIT True = (x + y) BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    90
  "x BIT True + y BIT False = (x + y) BIT True"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    91
  "x BIT True + y BIT True = (x + y + 1) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    92
  by (simp_all add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    93
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    94
lemma mult_BIT_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    95
  "x BIT False * y = (x * y) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    96
  "x * y BIT False = (x * y) BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    97
  "x BIT True * y = (x * y) BIT False + y"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    98
  by (simp_all add: Bit_B0_2t Bit_B1_2t algebra_simps)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
    99
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   100
lemma B_mod_2': "X = 2 \<Longrightarrow> (w BIT True) mod X = 1 \<and> (w BIT False) mod X = 0"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   101
  by (simp add: Bit_B0 Bit_B1)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   102
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   103
lemma bin_ex_rl: "\<exists>w b. w BIT b = bin"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   104
  by (metis bin_rl_simp)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   105
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   106
lemma bin_exhaust: "(\<And>x b. bin = x BIT b \<Longrightarrow> Q) \<Longrightarrow> Q"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   107
by (metis bin_ex_rl)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   108
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   109
lemma bin_abs_lem: "bin = (w BIT b) \<Longrightarrow> bin \<noteq> -1 \<longrightarrow> bin \<noteq> 0 \<longrightarrow> nat \<bar>w\<bar> < nat \<bar>bin\<bar>"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   110
  apply clarsimp
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   111
  apply (unfold Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   112
  apply (cases b)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   113
   apply (clarsimp, arith)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   114
  apply (clarsimp, arith)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   115
  done
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   116
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   117
lemma bin_induct:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   118
  assumes PPls: "P 0"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   119
    and PMin: "P (- 1)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   120
    and PBit: "\<And>bin bit. P bin \<Longrightarrow> P (bin BIT bit)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   121
  shows "P bin"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   122
  apply (rule_tac P=P and a=bin and f1="nat \<circ> abs" in wf_measure [THEN wf_induct])
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   123
  apply (simp add: measure_def inv_image_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   124
  apply (case_tac x rule: bin_exhaust)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   125
  apply (frule bin_abs_lem)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   126
  apply (auto simp add : PPls PMin PBit)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   127
  done
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   128
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   129
lemma Bit_div2: "(w BIT b) div 2 = w"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   130
  by (fact bin_rest_BIT)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   131
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   132
lemma twice_conv_BIT: "2 * x = x BIT False"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   133
  by (simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   134
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   135
lemma BIT_lt0 [simp]: "x BIT b < 0 \<longleftrightarrow> x < 0"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   136
by(cases b)(auto simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   137
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   138
lemma BIT_ge0 [simp]: "x BIT b \<ge> 0 \<longleftrightarrow> x \<ge> 0"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   139
by(cases b)(auto simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   140
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   141
lemma bin_to_bl_aux_Bit_minus_simp [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   142
  "0 < n \<Longrightarrow> bin_to_bl_aux n (w BIT b) bl = bin_to_bl_aux (n - 1) w (b # bl)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   143
  by (cases n) auto
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   144
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   145
lemma bl_to_bin_BIT:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   146
  "bl_to_bin bs BIT b = bl_to_bin (bs @ [b])"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   147
  by (simp add: bl_to_bin_append Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   148
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   149
lemma bin_nth_0_BIT: "bin_nth (w BIT b) 0 \<longleftrightarrow> b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   150
  by simp
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   151
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   152
lemma bin_nth_Suc_BIT: "bin_nth (w BIT b) (Suc n) = bin_nth w n"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   153
  by (simp add: bit_Suc)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   154
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   155
lemma bin_nth_minus [simp]: "0 < n \<Longrightarrow> bin_nth (w BIT b) n = bin_nth w (n - 1)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   156
  by (cases n) (simp_all add: bit_Suc)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   157
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   158
lemma bin_sign_simps [simp]:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   159
  "bin_sign (w BIT b) = bin_sign w"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   160
  by (simp add: bin_sign_def Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   161
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   162
lemma bin_nth_Bit: "bin_nth (w BIT b) n \<longleftrightarrow> n = 0 \<and> b \<or> (\<exists>m. n = Suc m \<and> bin_nth w m)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   163
  by (cases n) auto
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   164
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   165
lemmas sbintrunc_Suc_BIT [simp] =
72010
a851ce626b78 signed_take_bit
haftmann
parents: 72000
diff changeset
   166
  signed_take_bit_Suc [where k="w BIT b", simplified bin_last_BIT bin_rest_BIT] for w b
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   167
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   168
lemmas sbintrunc_0_BIT_B0 [simp] =
72010
a851ce626b78 signed_take_bit
haftmann
parents: 72000
diff changeset
   169
  signed_take_bit_0 [where k="w BIT False", simplified bin_last_numeral_simps bin_rest_numeral_simps]
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   170
  for w
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   171
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   172
lemmas sbintrunc_0_BIT_B1 [simp] =
72010
a851ce626b78 signed_take_bit
haftmann
parents: 72000
diff changeset
   173
  signed_take_bit_0 [where k="w BIT True", simplified bin_last_BIT bin_rest_numeral_simps]
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   174
  for w
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   175
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   176
lemma sbintrunc_Suc_minus_Is:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   177
  \<open>0 < n \<Longrightarrow>
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   178
  sbintrunc (n - 1) w = y \<Longrightarrow>
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   179
  sbintrunc n (w BIT b) = y BIT b\<close>
72010
a851ce626b78 signed_take_bit
haftmann
parents: 72000
diff changeset
   180
  by (cases n) (simp_all add: Bit_def signed_take_bit_Suc)
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   181
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   182
lemma bin_cat_Suc_Bit: "bin_cat w (Suc n) (v BIT b) = bin_cat w n v BIT b"
72028
08f1e4cb735f concatentation of bit values
haftmann
parents: 72010
diff changeset
   183
  by (auto simp add: Bit_def concat_bit_Suc)
71986
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   184
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   185
lemma int_not_BIT [simp]: "NOT (w BIT b) = (NOT w) BIT (\<not> b)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   186
  by (simp add: not_int_def Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   187
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   188
lemma int_and_Bits [simp]: "(x BIT b) AND (y BIT c) = (x AND y) BIT (b \<and> c)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   189
  using and_int_rec [of \<open>x BIT b\<close> \<open>y BIT c\<close>] by (auto simp add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   190
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   191
lemma int_or_Bits [simp]: "(x BIT b) OR (y BIT c) = (x OR y) BIT (b \<or> c)"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   192
  using or_int_rec [of \<open>x BIT b\<close> \<open>y BIT c\<close>] by (auto simp add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   193
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   194
lemma int_xor_Bits [simp]: "(x BIT b) XOR (y BIT c) = (x XOR y) BIT ((b \<or> c) \<and> \<not> (b \<and> c))"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   195
  using xor_int_rec [of \<open>x BIT b\<close> \<open>y BIT c\<close>] by (auto simp add: Bit_B0_2t Bit_B1_2t)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   196
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   197
lemma mod_BIT:
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   198
  "bin BIT bit mod 2 ^ Suc n = (bin mod 2 ^ n) BIT bit" for bit
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   199
proof -
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   200
  have "2 * (bin mod 2 ^ n) + 1 = (2 * bin mod 2 ^ Suc n) + 1"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   201
    by (simp add: mod_mult_mult1)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   202
  also have "\<dots> = ((2 * bin mod 2 ^ Suc n) + 1) mod 2 ^ Suc n"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   203
    by (simp add: ac_simps pos_zmod_mult_2)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   204
  also have "\<dots> = (2 * bin + 1) mod 2 ^ Suc n"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   205
    by (simp only: mod_simps)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   206
  finally show ?thesis
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   207
    by (auto simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   208
qed
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   209
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   210
lemma minus_BIT_0: fixes x y :: int shows "x BIT b - y BIT False = (x - y) BIT b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   211
by(simp add: Bit_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   212
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   213
lemma int_lsb_BIT [simp]: fixes x :: int shows
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   214
  "lsb (x BIT b) \<longleftrightarrow> b"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   215
by(simp add: lsb_int_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   216
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   217
lemma int_shiftr_BIT [simp]: fixes x :: int
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   218
  shows int_shiftr0: "x >> 0 = x"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   219
  and int_shiftr_Suc: "x BIT b >> Suc n = x >> n"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   220
proof -
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   221
  show "x >> 0 = x" by (simp add: shiftr_int_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   222
  show "x BIT b >> Suc n = x >> n" by (cases b)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   223
   (simp_all add: shiftr_int_def Bit_def add.commute pos_zdiv_mult_2)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   224
qed
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   225
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   226
lemma msb_BIT [simp]: "msb (x BIT b) = msb x"
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   227
by(simp add: msb_int_def)
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   228
76193dd4aec8 factored out ancient numeral representation
haftmann
parents:
diff changeset
   229
end