src/HOL/Word/WordArith.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
  contains arithmetic theorems for word, instantiations to
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     6
  arithmetic type classes and tactics for reducing word arithmetic
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     7
  to linear arithmetic on int or nat
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 WordArith imports WordDefinition begin
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    11
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    12
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    13
lemma word_less_alt: "(a < b) = (uint a < uint b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    14
  unfolding word_less_def word_le_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    15
  by (auto simp del: word_uint.Rep_inject 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    16
           simp: word_uint.Rep_inject [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    17
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    18
lemma signed_linorder: "linorder word_sle word_sless"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    19
  apply unfold_locales
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    20
      apply (unfold word_sle_def word_sless_def) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    21
  by auto 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    22
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    23
interpretation signed: linorder ["word_sle" "word_sless"] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    24
  by (rule signed_linorder)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    25
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    26
lemmas word_arith_wis [THEN meta_eq_to_obj_eq] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    27
  word_add_def word_mult_def word_minus_def 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    28
  word_succ_def word_pred_def word_0_wi word_1_wi
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    29
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    30
lemma udvdI: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    31
  "0 \<le> n ==> uint b = n * uint a ==> a udvd b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    32
  by (auto simp: udvd_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    33
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    34
lemmas word_div_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    35
  word_div_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    36
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    37
lemmas word_mod_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    38
  word_mod_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    39
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    40
lemmas word_less_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    41
  word_less_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    42
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    43
lemmas word_le_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    44
  word_le_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    45
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    46
lemmas word_sless_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    47
  word_sless_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    48
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    49
lemmas word_sle_no [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    50
  word_sle_def [of "number_of ?a" "number_of ?b"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    51
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    52
(* following two are available in class number_ring, 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    53
  but convenient to have them here here;
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    54
  note - the number_ring versions, numeral_0_eq_0 and numeral_1_eq_1
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    55
  are in the default simpset, so to use the automatic simplifications for
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    56
  (eg) sint (number_of bin) on sint 1, must do
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    57
  (simp add: word_1_no del: numeral_1_eq_1) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    58
  *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    59
lemmas word_0_wi_Pls = word_0_wi [folded Pls_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    60
lemmas word_0_no = word_0_wi_Pls [folded word_no_wi]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    61
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    62
lemma int_one_bin: "(1 :: int) == (Numeral.Pls BIT bit.B1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    63
  unfolding Pls_def Bit_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    64
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    65
lemma word_1_no: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    66
  "(1 :: 'a :: len0 word) == number_of (Numeral.Pls BIT bit.B1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    67
  unfolding word_1_wi word_number_of_def int_one_bin by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    68
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    69
lemma word_m1_wi: "-1 == word_of_int -1" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    70
  by (rule word_number_of_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    71
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    72
lemma word_m1_wi_Min: "-1 = word_of_int Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    73
  by (simp add: word_m1_wi number_of_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    74
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    75
lemma word_0_bl: "of_bl [] = 0" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    76
  unfolding word_0_wi of_bl_def by (simp add : Pls_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    77
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    78
lemma word_1_bl: "of_bl [True] = 1" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    79
  unfolding word_1_wi of_bl_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    80
  by (simp add : bl_to_bin_def Bit_def Pls_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    81
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    82
lemma uint_0 [simp] : "(uint 0 = 0)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    83
  unfolding word_0_wi
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    84
  by (simp add: word_ubin.eq_norm Pls_def [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    85
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    86
lemma of_bl_0 [simp] : "of_bl (replicate n False) = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    87
  by (simp add : word_0_wi of_bl_def bl_to_bin_rep_False Pls_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    88
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    89
lemma to_bl_0: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    90
  "to_bl (0::'a::len0 word) = replicate (len_of TYPE('a)) False"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    91
  unfolding uint_bl
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    92
  by (simp add : word_size bin_to_bl_Pls Pls_def [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    93
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    94
lemma uint_0_iff: "(uint x = 0) = (x = 0)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    95
  by (auto intro!: word_uint.Rep_eqD)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    96
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    97
lemma unat_0_iff: "(unat x = 0) = (x = 0)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    98
  unfolding unat_def by (auto simp add : nat_eq_iff uint_0_iff)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    99
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   100
lemma unat_0 [simp]: "unat 0 = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   101
  unfolding unat_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   102
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   103
lemma size_0_same': "size w = 0 ==> w = (v :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   104
  apply (unfold word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   105
  apply (rule box_equals)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   106
    defer
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   107
    apply (rule word_uint.Rep_inverse)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   108
  apply (rule word_ubin.norm_eq_iff [THEN iffD1])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   109
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   110
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   111
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   112
lemmas size_0_same = size_0_same' [folded word_size]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   113
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   114
lemmas unat_eq_0 = unat_0_iff
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   115
lemmas unat_eq_zero = unat_0_iff
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   116
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   117
lemma unat_gt_0: "(0 < unat x) = (x ~= 0)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   118
  by (simp add : unat_0_iff [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   119
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   120
lemma ucast_0 [simp] : "ucast 0 = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   121
  unfolding ucast_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   122
  by simp (simp add: word_0_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   123
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   124
lemma sint_0 [simp] : "sint 0 = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   125
  unfolding sint_uint
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   126
  by (simp add: Pls_def [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   127
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   128
lemma scast_0 [simp] : "scast 0 = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   129
  apply (unfold scast_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   130
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   131
  apply (simp add: word_0_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   132
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   133
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   134
lemma sint_n1 [simp] : "sint -1 = -1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   135
  apply (unfold word_m1_wi_Min)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   136
  apply (simp add: word_sbin.eq_norm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   137
  apply (unfold Min_def number_of_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   138
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   139
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   140
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   141
lemma scast_n1 [simp] : "scast -1 = -1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   142
  apply (unfold scast_def sint_n1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   143
  apply (unfold word_number_of_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   144
  apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   145
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   146
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   147
lemma uint_1 [simp] : "uint (1 :: 'a :: len word) = 1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   148
  unfolding word_1_wi
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   149
  by (simp add: word_ubin.eq_norm int_one_bin bintrunc_minus_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   150
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   151
lemma unat_1 [simp] : "unat (1 :: 'a :: len word) = 1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   152
  by (unfold unat_def uint_1) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   153
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   154
lemma ucast_1 [simp] : "ucast (1 :: 'a :: len word) = 1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   155
  unfolding ucast_def word_1_wi
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   156
  by (simp add: word_ubin.eq_norm int_one_bin bintrunc_minus_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   157
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   158
(* abstraction preserves the operations
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   159
  (the definitions tell this for bins in range uint) *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   160
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   161
lemmas arths = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   162
  bintr_ariths [THEN word_ubin.norm_eq_iff [THEN iffD1],
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   163
                folded word_ubin.eq_norm, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   164
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   165
lemma wi_homs: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   166
  shows
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   167
  wi_hom_add: "word_of_int a + word_of_int b = word_of_int (a + b)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   168
  wi_hom_mult: "word_of_int a * word_of_int b = word_of_int (a * b)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   169
  wi_hom_neg: "- word_of_int a = word_of_int (- a)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   170
  wi_hom_succ: "word_succ (word_of_int a) = word_of_int (Numeral.succ a)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   171
  wi_hom_pred: "word_pred (word_of_int a) = word_of_int (Numeral.pred a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   172
  by (auto simp: word_arith_wis arths)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   173
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   174
lemmas wi_hom_syms = wi_homs [symmetric]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   175
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   176
lemma word_sub_def: "a - b == a + - (b :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   177
  unfolding word_sub_wi diff_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   178
  by (simp only : word_uint.Rep_inverse wi_hom_syms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   179
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   180
lemmas word_diff_minus = word_sub_def [THEN meta_eq_to_obj_eq, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   181
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   182
lemma word_of_int_sub_hom:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   183
  "(word_of_int a) - word_of_int b = word_of_int (a - b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   184
  unfolding word_sub_def diff_def by (simp only : wi_homs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   185
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   186
lemmas new_word_of_int_homs = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   187
  word_of_int_sub_hom wi_homs word_0_wi word_1_wi 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   188
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   189
lemmas new_word_of_int_hom_syms = new_word_of_int_homs [symmetric, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   190
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   191
lemmas word_of_int_hom_syms =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   192
  new_word_of_int_hom_syms [unfolded succ_def pred_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   193
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   194
lemmas word_of_int_homs =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   195
  new_word_of_int_homs [unfolded succ_def pred_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   196
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   197
lemmas word_of_int_add_hom = word_of_int_homs (2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   198
lemmas word_of_int_mult_hom = word_of_int_homs (3)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   199
lemmas word_of_int_minus_hom = word_of_int_homs (4)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   200
lemmas word_of_int_succ_hom = word_of_int_homs (5)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   201
lemmas word_of_int_pred_hom = word_of_int_homs (6)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   202
lemmas word_of_int_0_hom = word_of_int_homs (7)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   203
lemmas word_of_int_1_hom = word_of_int_homs (8)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   204
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   205
(* now, to get the weaker results analogous to word_div/mod_def *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   206
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   207
lemmas word_arith_alts = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   208
  word_sub_wi [unfolded succ_def pred_def, THEN meta_eq_to_obj_eq, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   209
  word_arith_wis [unfolded succ_def pred_def, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   210
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   211
lemmas word_sub_alt = word_arith_alts (1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   212
lemmas word_add_alt = word_arith_alts (2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   213
lemmas word_mult_alt = word_arith_alts (3)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   214
lemmas word_minus_alt = word_arith_alts (4)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   215
lemmas word_succ_alt = word_arith_alts (5)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   216
lemmas word_pred_alt = word_arith_alts (6)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   217
lemmas word_0_alt = word_arith_alts (7)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   218
lemmas word_1_alt = word_arith_alts (8)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   219
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   220
section  "Transferring goals from words to ints"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   221
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   222
lemma word_ths:  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   223
  shows
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   224
  word_succ_p1:   "word_succ a = a + 1" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   225
  word_pred_m1:   "word_pred a = a - 1" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   226
  word_pred_succ: "word_pred (word_succ a) = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   227
  word_succ_pred: "word_succ (word_pred a) = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   228
  word_mult_succ: "word_succ a * b = b + a * b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   229
  by (rule word_uint.Abs_cases [of b],
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   230
      rule word_uint.Abs_cases [of a],
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   231
      simp add: pred_def succ_def add_commute mult_commute 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   232
                ring_distribs new_word_of_int_homs)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   233
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   234
lemmas uint_cong = arg_cong [where f = uint]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   235
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   236
lemmas uint_word_ariths = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   237
  word_arith_alts [THEN trans [OF uint_cong int_word_uint], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   238
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   239
lemmas uint_word_arith_bintrs = uint_word_ariths [folded bintrunc_mod2p]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   240
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   241
(* similar expressions for sint (arith operations) *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   242
lemmas sint_word_ariths = uint_word_arith_bintrs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   243
  [THEN uint_sint [symmetric, THEN trans],
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   244
  unfolded uint_sint bintr_arith1s bintr_ariths 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   245
    len_gt_0 [THEN bin_sbin_eq_iff'] word_sbin.norm_Rep, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   246
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   247
lemmas uint_div_alt = word_div_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   248
  [THEN meta_eq_to_obj_eq [THEN trans [OF uint_cong int_word_uint]], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   249
lemmas uint_mod_alt = word_mod_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   250
  [THEN meta_eq_to_obj_eq [THEN trans [OF uint_cong int_word_uint]], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   251
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   252
lemma word_pred_0_n1: "word_pred 0 = word_of_int -1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   253
  unfolding word_pred_def number_of_eq
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   254
  by (simp add : pred_def word_no_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   255
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   256
lemma word_pred_0_Min: "word_pred 0 = word_of_int Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   257
  by (simp add: word_pred_0_n1 number_of_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   258
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   259
lemma word_m1_Min: "- 1 = word_of_int Numeral.Min"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   260
  unfolding Min_def by (simp only: word_of_int_hom_syms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   261
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   262
lemma succ_pred_no [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   263
  "word_succ (number_of bin) = number_of (Numeral.succ bin) & 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   264
    word_pred (number_of bin) = number_of (Numeral.pred bin)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   265
  unfolding word_number_of_def by (simp add : new_word_of_int_homs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   266
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   267
lemma word_sp_01 [simp] : 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   268
  "word_succ -1 = 0 & word_succ 0 = 1 & word_pred 0 = -1 & word_pred 1 = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   269
  by (unfold word_0_no word_1_no) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   270
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   271
(* alternative approach to lifting arithmetic equalities *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   272
lemma word_of_int_Ex:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   273
  "\<exists>y. x = word_of_int y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   274
  by (rule_tac x="uint x" in exI) simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   275
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   276
lemma word_arith_eqs:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   277
  fixes a :: "'a::len0 word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   278
  fixes b :: "'a::len0 word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   279
  shows
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   280
  word_add_0: "0 + a = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   281
  word_add_0_right: "a + 0 = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   282
  word_mult_1: "1 * a = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   283
  word_mult_1_right: "a * 1 = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   284
  word_add_commute: "a + b = b + a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   285
  word_add_assoc: "a + b + c = a + (b + c)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   286
  word_add_left_commute: "a + (b + c) = b + (a + c)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   287
  word_mult_commute: "a * b = b * a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   288
  word_mult_assoc: "a * b * c = a * (b * c)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   289
  word_mult_left_commute: "a * (b * c) = b * (a * c)" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   290
  word_left_distrib: "(a + b) * c = a * c + b * c" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   291
  word_right_distrib: "a * (b + c) = a * b + a * c" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   292
  word_left_minus: "- a + a = 0" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   293
  word_diff_0_right: "a - 0 = a" and
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   294
  word_diff_self: "a - a = 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   295
  using word_of_int_Ex [of a] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   296
        word_of_int_Ex [of b] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   297
        word_of_int_Ex [of c]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   298
  by (auto simp: word_of_int_hom_syms [symmetric]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   299
                 zadd_0_right add_commute add_assoc add_left_commute
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   300
                 mult_commute mult_assoc mult_left_commute
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   301
                 plus_times.left_distrib plus_times.right_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   302
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   303
lemmas word_add_ac = word_add_commute word_add_assoc word_add_left_commute
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   304
lemmas word_mult_ac = word_mult_commute word_mult_assoc word_mult_left_commute
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   305
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   306
lemmas word_plus_ac0 = word_add_0 word_add_0_right word_add_ac
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   307
lemmas word_times_ac1 = word_mult_1 word_mult_1_right word_mult_ac
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   308
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   309
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   310
section "Order on fixed-length words"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   311
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   312
lemma word_order_trans: "x <= y ==> y <= z ==> x <= (z :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   313
  unfolding word_le_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   314
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   315
lemma word_order_refl: "z <= (z :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   316
  unfolding word_le_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   317
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   318
lemma word_order_antisym: "x <= y ==> y <= x ==> x = (y :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   319
  unfolding word_le_def by (auto intro!: word_uint.Rep_eqD)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   320
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   321
lemma word_order_linear:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   322
  "y <= x | x <= (y :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   323
  unfolding word_le_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   324
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   325
lemma word_zero_le [simp] :
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   326
  "0 <= (y :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   327
  unfolding word_le_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   328
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   329
instance word :: (len0) semigroup_add
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   330
  by intro_classes (simp add: word_add_assoc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   331
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   332
instance word :: (len0) linorder
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   333
  by intro_classes (auto simp: word_less_def word_le_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   334
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   335
instance word :: (len0) ring
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   336
  by intro_classes
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   337
     (auto simp: word_arith_eqs word_diff_minus 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   338
                 word_diff_self [unfolded word_diff_minus])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   339
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   340
lemma word_m1_ge [simp] : "word_pred 0 >= y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   341
  unfolding word_le_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   342
  by (simp only : word_pred_0_n1 word_uint.eq_norm m1mod2k) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   343
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   344
lemmas word_n1_ge [simp]  = word_m1_ge [simplified word_sp_01]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   345
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   346
lemmas word_not_simps [simp] = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   347
  word_zero_le [THEN leD] word_m1_ge [THEN leD] word_n1_ge [THEN leD]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   348
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   349
lemma word_gt_0: "0 < y = (0 ~= (y :: 'a :: len0 word))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   350
  unfolding word_less_def by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   351
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   352
lemmas word_gt_0_no [simp] = word_gt_0 [of "number_of ?y"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   353
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   354
lemma word_sless_alt: "(a <s b) == (sint a < sint b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   355
  unfolding word_sle_def word_sless_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   356
  by (auto simp add : less_eq_less.less_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   357
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   358
lemma word_le_nat_alt: "(a <= b) = (unat a <= unat b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   359
  unfolding unat_def word_le_def
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   360
  by (rule nat_le_eq_zle [symmetric]) simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   361
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   362
lemma word_less_nat_alt: "(a < b) = (unat a < unat b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   363
  unfolding unat_def word_less_alt
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   364
  by (rule nat_less_eq_zless [symmetric]) simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   365
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   366
lemma wi_less: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   367
  "(word_of_int n < (word_of_int m :: 'a :: len0 word)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   368
    (n mod 2 ^ len_of TYPE('a) < m mod 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   369
  unfolding word_less_alt by (simp add: word_uint.eq_norm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   370
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   371
lemma wi_le: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   372
  "(word_of_int n <= (word_of_int m :: 'a :: len0 word)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   373
    (n mod 2 ^ len_of TYPE('a) <= m mod 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   374
  unfolding word_le_def by (simp add: word_uint.eq_norm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   375
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   376
lemma udvd_nat_alt: "a udvd b = (EX n>=0. unat b = n * unat a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   377
  apply (unfold udvd_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   378
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   379
   apply (simp add: unat_def nat_mult_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   380
  apply (simp add: uint_nat int_mult)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   381
  apply (rule exI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   382
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   383
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   384
   apply (erule notE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   385
   apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   386
  apply force
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   387
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   388
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   389
lemma udvd_iff_dvd: "x udvd y <-> unat x dvd unat y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   390
  unfolding dvd_def udvd_nat_alt by force
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   391
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   392
lemmas unat_mono = word_less_nat_alt [THEN iffD1, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   393
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   394
lemma word_zero_neq_one: "0 < len_of TYPE ('a :: len0) ==> (0 :: 'a word) ~= 1";
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   395
  unfolding word_arith_wis
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   396
  by (auto simp add: word_ubin.norm_eq_iff [symmetric] gr0_conv_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   397
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   398
lemmas lenw1_zero_neq_one = len_gt_0 [THEN word_zero_neq_one]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   399
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   400
lemma no_no [simp] : "number_of (number_of b) = number_of b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   401
  by (simp add: number_of_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   402
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   403
lemma unat_minus_one: "x ~= 0 ==> unat (x - 1) = unat x - 1"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   404
  apply (unfold unat_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   405
  apply (simp only: int_word_uint word_arith_alts rdmods)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   406
  apply (subgoal_tac "uint x >= 1")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   407
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   408
   apply (drule contrapos_nn)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   409
    apply (erule word_uint.Rep_inverse' [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   410
   apply (insert uint_ge_0 [of x])[1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   411
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   412
  apply (rule box_equals)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   413
    apply (rule nat_diff_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   414
     prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   415
     apply assumption
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   416
    apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   417
   apply (subst mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   418
     apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   419
    apply (insert uint_lt2p [of x])[1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   420
    apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   421
   apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   422
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   423
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   424
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   425
lemma measure_unat: "p ~= 0 ==> unat (p - 1) < unat p"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   426
  by (simp add: unat_minus_one) (simp add: unat_0_iff [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   427
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   428
lemmas uint_add_ge0 [simp] =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   429
  add_nonneg_nonneg [OF uint_ge_0 uint_ge_0, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   430
lemmas uint_mult_ge0 [simp] =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   431
  mult_nonneg_nonneg [OF uint_ge_0 uint_ge_0, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   432
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   433
lemma uint_sub_lt2p [simp]: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   434
  "uint (x :: 'a :: len0 word) - uint (y :: 'b :: len0 word) < 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   435
    2 ^ len_of TYPE('a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   436
  using uint_ge_0 [of y] uint_lt2p [of x] by arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   437
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   438
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   439
section "Conditions for the addition (etc) of two words to overflow"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   440
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   441
lemma uint_add_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   442
  "(uint x + uint y < 2 ^ len_of TYPE('a)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   443
    (uint (x + y :: 'a :: len0 word) = uint x + uint y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   444
  by (unfold uint_word_ariths) (auto intro!: trans [OF _ int_mod_lem])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   445
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   446
lemma uint_mult_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   447
  "(uint x * uint y < 2 ^ len_of TYPE('a)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   448
    (uint (x * y :: 'a :: len0 word) = uint x * uint y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   449
  by (unfold uint_word_ariths) (auto intro!: trans [OF _ int_mod_lem])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   450
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   451
lemma uint_sub_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   452
  "(uint x >= uint y) = (uint (x - y) = uint x - uint y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   453
  by (unfold uint_word_ariths) (auto intro!: trans [OF _ int_mod_lem])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   454
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   455
lemma uint_add_le: "uint (x + y) <= uint x + uint y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   456
  unfolding uint_word_ariths by (auto simp: mod_add_if_z)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   457
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   458
lemma uint_sub_ge: "uint (x - y) >= uint x - uint y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   459
  unfolding uint_word_ariths by (auto simp: mod_sub_if_z)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   460
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   461
lemmas uint_sub_if' =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   462
  trans [OF uint_word_ariths(1) mod_sub_if_z, simplified, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   463
lemmas uint_plus_if' =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   464
  trans [OF uint_word_ariths(2) mod_add_if_z, simplified, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   465
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   466
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   467
section {* Definition of uint\_arith *}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   468
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   469
lemma word_of_int_inverse:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   470
  "word_of_int r = a ==> 0 <= r ==> r < 2 ^ len_of TYPE('a) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   471
   uint (a::'a::len0 word) = r"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   472
  apply (erule word_uint.Abs_inverse' [rotated])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   473
  apply (simp add: uints_num)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   474
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   475
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   476
lemma uint_split:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   477
  fixes x::"'a::len0 word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   478
  shows "P (uint x) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   479
         (ALL i. word_of_int i = x & 0 <= i & i < 2^len_of TYPE('a) --> P i)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   480
  apply (fold word_int_case_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   481
  apply (auto dest!: word_of_int_inverse simp: int_word_uint int_mod_eq'
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   482
              split: word_int_split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   483
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   484
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   485
lemma uint_split_asm:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   486
  fixes x::"'a::len0 word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   487
  shows "P (uint x) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   488
         (~(EX i. word_of_int i = x & 0 <= i & i < 2^len_of TYPE('a) & ~ P i))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   489
  by (auto dest!: word_of_int_inverse 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   490
           simp: int_word_uint int_mod_eq'
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   491
           split: uint_split)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   492
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   493
lemmas uint_splits = uint_split uint_split_asm
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   494
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   495
lemmas uint_arith_simps = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   496
  word_le_def word_less_alt
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   497
  word_uint.Rep_inject [symmetric] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   498
  uint_sub_if' uint_plus_if'
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   499
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   500
(* use this to stop, eg, 2 ^ len_of TYPE (32) being simplified *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   501
lemma power_False_cong: "False ==> a ^ b = c ^ d" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   502
  by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   503
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   504
(* uint_arith_tac: reduce to arithmetic on int, try to solve by arith *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   505
ML {*
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   506
fun uint_arith_ss_of ss = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   507
  ss addsimps @{thms uint_arith_simps}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   508
     delsimps @{thms word_uint.Rep_inject}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   509
     addsplits @{thms split_if_asm} 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   510
     addcongs @{thms power_False_cong}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   511
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   512
fun uint_arith_tacs ctxt = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   513
  let fun arith_tac' n t = arith_tac ctxt n t handle COOPER => Seq.empty  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   514
  in 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   515
    [ CLASET' clarify_tac 1,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   516
      SIMPSET' (full_simp_tac o uint_arith_ss_of) 1,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   517
      ALLGOALS (full_simp_tac (HOL_ss addsplits @{thms uint_splits} 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   518
                                      addcongs @{thms power_False_cong})),
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   519
      rewrite_goals_tac @{thms word_size}, 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   520
      ALLGOALS  (fn n => REPEAT (resolve_tac [allI, impI] n) THEN      
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   521
                         REPEAT (etac conjE n) THEN
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   522
                         REPEAT (dtac @{thm word_of_int_inverse} n 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   523
                                 THEN atac n 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   524
                                 THEN atac n)),
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   525
      TRYALL arith_tac' ]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   526
  end
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   527
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   528
fun uint_arith_tac ctxt = SELECT_GOAL (EVERY (uint_arith_tacs ctxt))
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   529
*}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   530
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   531
method_setup uint_arith = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   532
  "Method.ctxt_args (fn ctxt => Method.SIMPLE_METHOD (uint_arith_tac ctxt 1))" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   533
  "solving word arithmetic via integers and arith"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   534
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   535
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   536
section "More on overflows and monotonicity"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   537
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   538
lemma no_plus_overflow_uint_size: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   539
  "((x :: 'a :: len0 word) <= x + y) = (uint x + uint y < 2 ^ size x)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   540
  unfolding word_size by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   541
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   542
lemmas no_olen_add = no_plus_overflow_uint_size [unfolded word_size]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   543
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   544
lemma no_ulen_sub: "((x :: 'a :: len0 word) >= x - y) = (uint y <= uint x)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   545
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   546
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   547
lemma no_olen_add':
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   548
  fixes x :: "'a::len0 word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   549
  shows "(x \<le> y + x) = (uint y + uint x < 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   550
  by (simp add: word_add_ac add_ac no_olen_add)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   551
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   552
lemmas olen_add_eqv = trans [OF no_olen_add no_olen_add' [symmetric], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   553
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   554
lemmas uint_plus_simple_iff = trans [OF no_olen_add uint_add_lem, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   555
lemmas uint_plus_simple = uint_plus_simple_iff [THEN iffD1, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   556
lemmas uint_minus_simple_iff = trans [OF no_ulen_sub uint_sub_lem, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   557
lemmas uint_minus_simple_alt = uint_sub_lem [folded word_le_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   558
lemmas word_sub_le_iff = no_ulen_sub [folded word_le_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   559
lemmas word_sub_le = word_sub_le_iff [THEN iffD2, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   560
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   561
lemma word_less_sub1: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   562
  "(x :: 'a :: len word) ~= 0 ==> (1 < x) = (0 < x - 1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   563
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   564
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   565
lemma word_le_sub1: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   566
  "(x :: 'a :: len word) ~= 0 ==> (1 <= x) = (0 <= x - 1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   567
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   568
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   569
lemma sub_wrap_lt: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   570
  "((x :: 'a :: len0 word) < x - z) = (x < z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   571
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   572
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   573
lemma sub_wrap: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   574
  "((x :: 'a :: len0 word) <= x - z) = (z = 0 | x < z)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   575
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   576
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   577
lemma plus_minus_not_NULL_ab: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   578
  "(x :: 'a :: len0 word) <= ab - c ==> c <= ab ==> c ~= 0 ==> x + c ~= 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   579
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   580
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   581
lemma plus_minus_no_overflow_ab: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   582
  "(x :: 'a :: len0 word) <= ab - c ==> c <= ab ==> x <= x + c" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   583
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   584
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   585
lemma le_minus': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   586
  "(a :: 'a :: len0 word) + c <= b ==> a <= a + c ==> c <= b - a"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   587
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   588
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   589
lemma le_plus': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   590
  "(a :: 'a :: len0 word) <= b ==> c <= b - a ==> a + c <= b"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   591
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   592
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   593
lemmas le_plus = le_plus' [rotated]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   594
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   595
lemmas le_minus = leD [THEN thin_rl, THEN le_minus', standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   596
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   597
lemma word_plus_mono_right: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   598
  "(y :: 'a :: len0 word) <= z ==> x <= x + z ==> x + y <= x + z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   599
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   600
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   601
lemma word_less_minus_cancel: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   602
  "y - x < z - x ==> x <= z ==> (y :: 'a :: len0 word) < z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   603
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   604
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   605
lemma word_less_minus_mono_left: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   606
  "(y :: 'a :: len0 word) < z ==> x <= y ==> y - x < z - x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   607
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   608
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   609
lemma word_less_minus_mono:  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   610
  "a < c ==> d < b ==> a - b < a ==> c - d < c 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   611
  ==> a - b < c - (d::'a::len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   612
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   613
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   614
lemma word_le_minus_cancel: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   615
  "y - x <= z - x ==> x <= z ==> (y :: 'a :: len0 word) <= z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   616
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   617
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   618
lemma word_le_minus_mono_left: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   619
  "(y :: 'a :: len0 word) <= z ==> x <= y ==> y - x <= z - x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   620
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   621
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   622
lemma word_le_minus_mono:  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   623
  "a <= c ==> d <= b ==> a - b <= a ==> c - d <= c 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   624
  ==> a - b <= c - (d::'a::len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   625
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   626
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   627
lemma plus_le_left_cancel_wrap: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   628
  "(x :: 'a :: len0 word) + y' < x ==> x + y < x ==> (x + y' < x + y) = (y' < y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   629
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   630
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   631
lemma plus_le_left_cancel_nowrap: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   632
  "(x :: 'a :: len0 word) <= x + y' ==> x <= x + y ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   633
    (x + y' < x + y) = (y' < y)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   634
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   635
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   636
lemma word_plus_mono_right2: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   637
  "(a :: 'a :: len0 word) <= a + b ==> c <= b ==> a <= a + c"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   638
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   639
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   640
lemma word_less_add_right: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   641
  "(x :: 'a :: len0 word) < y - z ==> z <= y ==> x + z < y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   642
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   643
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   644
lemma word_less_sub_right: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   645
  "(x :: 'a :: len0 word) < y + z ==> y <= x ==> x - y < z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   646
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   647
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   648
lemma word_le_plus_either: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   649
  "(x :: 'a :: len0 word) <= y | x <= z ==> y <= y + z ==> x <= y + z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   650
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   651
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   652
lemma word_less_nowrapI: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   653
  "(x :: 'a :: len0 word) < z - k ==> k <= z ==> 0 < k ==> x < x + k"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   654
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   655
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   656
lemma inc_le: "(i :: 'a :: len word) < m ==> i + 1 <= m"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   657
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   658
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   659
lemma inc_i: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   660
  "(1 :: 'a :: len word) <= i ==> i < m ==> 1 <= (i + 1) & i + 1 <= m"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   661
  by uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   662
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   663
lemma udvd_incr_lem:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   664
  "up < uq ==> up = ua + n * uint K ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   665
    uq = ua + n' * uint K ==> up + uint K <= uq"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   666
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   667
  apply (drule less_le_mult)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   668
  apply safe
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
lemma udvd_incr': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   672
  "p < q ==> uint p = ua + n * uint K ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   673
    uint q = ua + n' * uint K ==> p + K <= q" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   674
  apply (unfold word_less_alt word_le_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   675
  apply (drule (2) udvd_incr_lem)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   676
  apply (erule uint_add_le [THEN order_trans])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   677
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   678
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   679
lemma udvd_decr': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   680
  "p < q ==> uint p = ua + n * uint K ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   681
    uint q = ua + n' * uint K ==> p <= q - K"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   682
  apply (unfold word_less_alt word_le_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   683
  apply (drule (2) udvd_incr_lem)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   684
  apply (drule le_diff_eq [THEN iffD2])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   685
  apply (erule order_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   686
  apply (rule uint_sub_ge)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   687
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   688
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   689
lemmas udvd_incr_lem0 = udvd_incr_lem [where ua=0, simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   690
lemmas udvd_incr0 = udvd_incr' [where ua=0, simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   691
lemmas udvd_decr0 = udvd_decr' [where ua=0, simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   692
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   693
lemma udvd_minus_le': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   694
  "xy < k ==> z udvd xy ==> z udvd k ==> xy <= k - z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   695
  apply (unfold udvd_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   696
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   697
  apply (erule (2) udvd_decr0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   698
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   699
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   700
lemma udvd_incr2_K: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   701
  "p < a + s ==> a <= a + s ==> K udvd s ==> K udvd p - a ==> a <= p ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   702
    0 < K ==> p <= p + K & p + K <= a + s"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   703
  apply (unfold udvd_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   704
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   705
  apply (simp add: uint_arith_simps split: split_if_asm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   706
   prefer 2 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   707
   apply (insert uint_range' [of s])[1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   708
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   709
  apply (drule add_commute [THEN xtr1])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   710
  apply (simp add: diff_less_eq [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   711
  apply (drule less_le_mult)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   712
   apply arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   713
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   714
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   715
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   716
(* links with rbl operations *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   717
lemma word_succ_rbl:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   718
  "to_bl w = bl ==> to_bl (word_succ w) = (rev (rbl_succ (rev bl)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   719
  apply (unfold word_succ_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   720
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   721
  apply (simp add: to_bl_of_bin)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   722
  apply (simp add: to_bl_def rbl_succ)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   723
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   724
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   725
lemma word_pred_rbl:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   726
  "to_bl w = bl ==> to_bl (word_pred w) = (rev (rbl_pred (rev bl)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   727
  apply (unfold word_pred_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   728
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   729
  apply (simp add: to_bl_of_bin)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   730
  apply (simp add: to_bl_def rbl_pred)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   731
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   732
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   733
lemma word_add_rbl:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   734
  "to_bl v = vbl ==> to_bl w = wbl ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   735
    to_bl (v + w) = (rev (rbl_add (rev vbl) (rev wbl)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   736
  apply (unfold word_add_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   737
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   738
  apply (simp add: to_bl_of_bin)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   739
  apply (simp add: to_bl_def rbl_add)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   740
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   741
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   742
lemma word_mult_rbl:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   743
  "to_bl v = vbl ==> to_bl w = wbl ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   744
    to_bl (v * w) = (rev (rbl_mult (rev vbl) (rev wbl)))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   745
  apply (unfold word_mult_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   746
  apply clarify
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   747
  apply (simp add: to_bl_of_bin)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   748
  apply (simp add: to_bl_def rbl_mult)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   749
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   750
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   751
lemma rtb_rbl_ariths:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   752
  "rev (to_bl w) = ys \<Longrightarrow> rev (to_bl (word_succ w)) = rbl_succ ys"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   753
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   754
  "rev (to_bl w) = ys \<Longrightarrow> rev (to_bl (word_pred w)) = rbl_pred ys"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   755
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   756
  "[| rev (to_bl v) = ys; rev (to_bl w) = xs |] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   757
  ==> rev (to_bl (v * w)) = rbl_mult ys xs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   758
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   759
  "[| rev (to_bl v) = ys; rev (to_bl w) = xs |] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   760
  ==> rev (to_bl (v + w)) = rbl_add ys xs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   761
  by (auto simp: rev_swap [symmetric] word_succ_rbl 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   762
                 word_pred_rbl word_mult_rbl word_add_rbl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   763
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   764
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   765
section "Arithmetic type class instantiations"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   766
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   767
instance word :: (len0) comm_monoid_add ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   768
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   769
instance word :: (len0) comm_monoid_mult
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   770
  apply (intro_classes)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   771
   apply (simp add: word_mult_commute)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   772
  apply (simp add: word_mult_1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   773
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   774
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   775
instance word :: (len0) comm_semiring 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   776
  by (intro_classes) (simp add : word_left_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   777
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   778
instance word :: (len0) ab_group_add ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   779
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   780
instance word :: (len0) comm_ring ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   781
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   782
instance word :: (len) comm_semiring_1 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   783
  by (intro_classes) (simp add: lenw1_zero_neq_one)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   784
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   785
instance word :: (len) comm_ring_1 ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   786
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   787
instance word :: (len0) comm_semiring_0 ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   788
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   789
instance word :: (len0) order ..
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   790
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   791
instance word :: (len) recpower
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   792
  by (intro_classes) (simp_all add: word_pow)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   793
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   794
(* note that iszero_def is only for class comm_semiring_1_cancel,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   795
   which requires word length >= 1, ie 'a :: len word *) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   796
lemma zero_bintrunc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   797
  "iszero (number_of x :: 'a :: len word) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   798
    (bintrunc (len_of TYPE('a)) x = Numeral.Pls)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   799
  apply (unfold iszero_def word_0_wi word_no_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   800
  apply (rule word_ubin.norm_eq_iff [symmetric, THEN trans])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   801
  apply (simp add : Pls_def [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   802
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   803
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   804
lemmas word_le_0_iff [simp] =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   805
  word_zero_le [THEN leD, THEN linorder_antisym_conv1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   806
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   807
lemma word_of_nat: "of_nat n = word_of_int (int n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   808
  by (induct n) (auto simp add : word_of_int_hom_syms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   809
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   810
lemma word_of_int: "of_int = word_of_int"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   811
  apply (rule ext)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   812
  apply (unfold of_int_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   813
  apply (rule contentsI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   814
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   815
  apply (simp_all add: word_of_nat word_of_int_homs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   816
   defer
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   817
   apply (rule Rep_Integ_ne [THEN nonemptyE])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   818
   apply (rule bexI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   819
    prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   820
    apply assumption
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   821
   apply (auto simp add: RI_eq_diff)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   822
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   823
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   824
lemma word_of_int_nat: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   825
  "0 <= x ==> word_of_int x = of_nat (nat x)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   826
  by (simp add: of_nat_nat word_of_int)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   827
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   828
lemma word_number_of_eq: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   829
  "number_of w = (of_int w :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   830
  unfolding word_number_of_def word_of_int by auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   831
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   832
instance word :: (len) number_ring
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   833
  by (intro_classes) (simp add : word_number_of_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   834
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   835
lemma iszero_word_no [simp] : 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   836
  "iszero (number_of bin :: 'a :: len word) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   837
    iszero (number_of (bintrunc (len_of TYPE('a)) bin) :: int)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   838
  apply (simp add: zero_bintrunc int_number_of)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   839
  apply (unfold iszero_def Pls_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   840
  apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   841
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   842
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   843
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   844
section "Word and nat"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   845
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   846
lemma td_ext_unat':
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   847
  "n = len_of TYPE ('a :: len) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   848
    td_ext (unat :: 'a word => nat) of_nat 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   849
    (unats n) (%i. i mod 2 ^ n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   850
  apply (unfold td_ext_def' unat_def word_of_nat unats_uints)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   851
  apply (auto intro!: imageI simp add : word_of_int_hom_syms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   852
  apply (erule word_uint.Abs_inverse [THEN arg_cong])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   853
  apply (simp add: int_word_uint nat_mod_distrib nat_power_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   854
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   855
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   856
lemmas td_ext_unat = refl [THEN td_ext_unat']
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   857
lemmas unat_of_nat = td_ext_unat [THEN td_ext.eq_norm, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   858
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   859
interpretation word_unat:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   860
  td_ext ["unat::'a::len word => nat" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   861
          of_nat 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   862
          "unats (len_of TYPE('a::len))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   863
          "%i. i mod 2 ^ len_of TYPE('a::len)"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   864
  by (rule td_ext_unat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   865
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   866
lemmas td_unat = word_unat.td_thm
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   867
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   868
lemmas unat_lt2p [iff] = word_unat.Rep [unfolded unats_def mem_Collect_eq]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   869
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   870
lemma unat_le: "y <= unat (z :: 'a :: len word) ==> y : unats (len_of TYPE ('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   871
  apply (unfold unats_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   872
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   873
  apply (rule xtrans, rule unat_lt2p, assumption) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   874
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   875
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   876
lemma word_nchotomy:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   877
  "ALL w. EX n. (w :: 'a :: len word) = of_nat n & n < 2 ^ len_of TYPE ('a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   878
  apply (rule allI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   879
  apply (rule word_unat.Abs_cases)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   880
  apply (unfold unats_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   881
  apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   882
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   883
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   884
lemma of_nat_eq:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   885
  fixes w :: "'a::len word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   886
  shows "(of_nat n = w) = (\<exists>q. n = unat w + q * 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   887
  apply (rule trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   888
   apply (rule word_unat.inverse_norm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   889
  apply (rule iffI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   890
   apply (rule mod_eqD)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   891
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   892
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   893
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   894
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   895
lemma of_nat_eq_size: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   896
  "(of_nat n = w) = (EX q. n = unat w + q * 2 ^ size w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   897
  unfolding word_size by (rule of_nat_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   898
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   899
lemma of_nat_0:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   900
  "(of_nat m = (0::'a::len word)) = (\<exists>q. m = q * 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   901
  by (simp add: of_nat_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   902
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   903
lemmas of_nat_2p = mult_1 [symmetric, THEN iffD2 [OF of_nat_0 exI]]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   904
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   905
lemma of_nat_gt_0: "of_nat k ~= 0 ==> 0 < k"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   906
  by (cases k) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   907
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   908
lemma of_nat_neq_0: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   909
  "0 < k ==> k < 2 ^ len_of TYPE ('a :: len) ==> of_nat k ~= (0 :: 'a word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   910
  by (clarsimp simp add : of_nat_0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   911
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   912
lemma Abs_fnat_hom_add:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   913
  "of_nat a + of_nat b = of_nat (a + b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   914
  by simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   915
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   916
lemma Abs_fnat_hom_mult:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   917
  "of_nat a * of_nat b = (of_nat (a * b) :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   918
  by (simp add: word_of_nat word_of_int_mult_hom zmult_int)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   919
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   920
lemma Abs_fnat_hom_Suc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   921
  "word_succ (of_nat a) = of_nat (Suc a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   922
  by (simp add: word_of_nat word_of_int_succ_hom add_ac)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   923
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   924
lemma Abs_fnat_hom_0: "(0::'a::len word) = of_nat 0"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   925
  by (simp add: word_of_nat word_0_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   926
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   927
lemma Abs_fnat_hom_1: "(1::'a::len word) = of_nat (Suc 0)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   928
  by (simp add: word_of_nat word_1_wi)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   929
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   930
lemmas Abs_fnat_homs = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   931
  Abs_fnat_hom_add Abs_fnat_hom_mult Abs_fnat_hom_Suc 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   932
  Abs_fnat_hom_0 Abs_fnat_hom_1
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   933
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   934
lemma word_arith_nat_add:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   935
  "a + b = of_nat (unat a + unat b)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   936
  by simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   937
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   938
lemma word_arith_nat_mult:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   939
  "a * b = of_nat (unat a * unat b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   940
  by (simp add: Abs_fnat_hom_mult [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   941
    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   942
lemma word_arith_nat_Suc:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   943
  "word_succ a = of_nat (Suc (unat a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   944
  by (subst Abs_fnat_hom_Suc [symmetric]) simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   945
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   946
lemma word_arith_nat_div:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   947
  "a div b = of_nat (unat a div unat b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   948
  by (simp add: word_div_def word_of_nat zdiv_int uint_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   949
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   950
lemma word_arith_nat_mod:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   951
  "a mod b = of_nat (unat a mod unat b)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   952
  by (simp add: word_mod_def word_of_nat zmod_int uint_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   953
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   954
lemmas word_arith_nat_defs =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   955
  word_arith_nat_add word_arith_nat_mult
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   956
  word_arith_nat_Suc Abs_fnat_hom_0
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   957
  Abs_fnat_hom_1 word_arith_nat_div
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   958
  word_arith_nat_mod 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   959
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   960
lemmas unat_cong = arg_cong [where f = "unat"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   961
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   962
lemmas unat_word_ariths = word_arith_nat_defs
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   963
  [THEN trans [OF unat_cong unat_of_nat], standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   964
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   965
lemmas word_sub_less_iff = word_sub_le_iff
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   966
  [simplified linorder_not_less [symmetric], simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   967
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   968
lemma unat_add_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   969
  "(unat x + unat y < 2 ^ len_of TYPE('a)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   970
    (unat (x + y :: 'a :: len word) = unat x + unat y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   971
  unfolding unat_word_ariths
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   972
  by (auto intro!: trans [OF _ nat_mod_lem])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   973
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   974
lemma unat_mult_lem: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   975
  "(unat x * unat y < 2 ^ len_of TYPE('a)) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   976
    (unat (x * y :: 'a :: len word) = unat x * unat y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   977
  unfolding unat_word_ariths
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   978
  by (auto intro!: trans [OF _ nat_mod_lem])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   979
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   980
lemmas unat_plus_if' = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   981
  trans [OF unat_word_ariths(1) mod_nat_add, simplified, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   982
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   983
lemma le_no_overflow: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   984
  "x <= b ==> a <= a + b ==> x <= a + (b :: 'a :: len0 word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   985
  apply (erule order_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   986
  apply (erule olen_add_eqv [THEN iffD1])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   987
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   988
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   989
lemmas un_ui_le = trans 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   990
  [OF word_le_nat_alt [symmetric] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   991
      word_le_def [THEN meta_eq_to_obj_eq], 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   992
   standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   993
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   994
lemma unat_sub_if_size:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   995
  "unat (x - y) = (if unat y <= unat x 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   996
   then unat x - unat y 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   997
   else unat x + 2 ^ size x - unat y)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   998
  apply (unfold word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   999
  apply (simp add: un_ui_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1000
  apply (auto simp add: unat_def uint_sub_if')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1001
   apply (rule nat_diff_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1002
    prefer 3
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1003
    apply (simp add: group_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1004
    apply (rule nat_diff_distrib [THEN trans])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1005
      prefer 3
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1006
      apply (subst nat_add_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1007
        prefer 3
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1008
        apply (simp add: nat_power_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1009
       apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1010
  apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1011
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1012
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1013
lemmas unat_sub_if' = unat_sub_if_size [unfolded word_size]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1014
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1015
lemma unat_div: "unat ((x :: 'a :: len word) div y) = unat x div unat y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1016
  apply (simp add : unat_word_ariths)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1017
  apply (rule unat_lt2p [THEN xtr7, THEN nat_mod_eq'])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1018
  apply (rule div_le_dividend)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1019
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1020
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1021
lemma unat_mod: "unat ((x :: 'a :: len word) mod y) = unat x mod unat y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1022
  apply (clarsimp simp add : unat_word_ariths)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1023
  apply (cases "unat y")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1024
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1025
   apply (rule unat_lt2p [THEN xtr7, THEN nat_mod_eq'])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1026
   apply (rule mod_le_divisor)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1027
   apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1028
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1029
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1030
lemma uint_div: "uint ((x :: 'a :: len word) div y) = uint x div uint y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1031
  unfolding uint_nat by (simp add : unat_div zdiv_int)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1032
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1033
lemma uint_mod: "uint ((x :: 'a :: len word) mod y) = uint x mod uint y"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1034
  unfolding uint_nat by (simp add : unat_mod zmod_int)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1035
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1036
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1037
section {* Definition of unat\_arith tactic *}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1038
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1039
lemma unat_split:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1040
  fixes x::"'a::len word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1041
  shows "P (unat x) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1042
         (ALL n. of_nat n = x & n < 2^len_of TYPE('a) --> P n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1043
  by (auto simp: unat_of_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1044
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1045
lemma unat_split_asm:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1046
  fixes x::"'a::len word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1047
  shows "P (unat x) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1048
         (~(EX n. of_nat n = x & n < 2^len_of TYPE('a) & ~ P n))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1049
  by (auto simp: unat_of_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1050
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1051
lemmas of_nat_inverse = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1052
  word_unat.Abs_inverse' [rotated, unfolded unats_def, simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1053
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1054
lemmas unat_splits = unat_split unat_split_asm
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1055
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1056
lemmas unat_arith_simps =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1057
  word_le_nat_alt word_less_nat_alt
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1058
  word_unat.Rep_inject [symmetric]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1059
  unat_sub_if' unat_plus_if' unat_div unat_mod
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1060
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1061
(* unat_arith_tac: tactic to reduce word arithmetic to nat, 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1062
   try to solve via arith *)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1063
ML {*
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1064
fun unat_arith_ss_of ss = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1065
  ss addsimps @{thms unat_arith_simps}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1066
     delsimps @{thms word_unat.Rep_inject}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1067
     addsplits @{thms split_if_asm}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1068
     addcongs @{thms power_False_cong}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1069
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1070
fun unat_arith_tacs ctxt =   
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1071
  let fun arith_tac' n t = arith_tac ctxt n t handle COOPER => Seq.empty  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1072
  in 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1073
    [ CLASET' clarify_tac 1,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1074
      SIMPSET' (full_simp_tac o unat_arith_ss_of) 1,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1075
      ALLGOALS (full_simp_tac (HOL_ss addsplits @{thms unat_splits} 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1076
                                       addcongs @{thms power_False_cong})),
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1077
      rewrite_goals_tac @{thms word_size}, 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1078
      ALLGOALS  (fn n => REPEAT (resolve_tac [allI, impI] n) THEN      
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1079
                         REPEAT (etac conjE n) THEN
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1080
                         REPEAT (dtac @{thm of_nat_inverse} n THEN atac n)),
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1081
      TRYALL arith_tac' ] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1082
  end
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1083
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1084
fun unat_arith_tac ctxt = SELECT_GOAL (EVERY (unat_arith_tacs ctxt))
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1085
*}
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1086
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1087
method_setup unat_arith = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1088
  "Method.ctxt_args (fn ctxt => Method.SIMPLE_METHOD (unat_arith_tac ctxt 1))" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1089
  "solving word arithmetic via natural numbers and arith"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1090
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1091
lemma no_plus_overflow_unat_size: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1092
  "((x :: 'a :: len word) <= x + y) = (unat x + unat y < 2 ^ size x)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1093
  unfolding word_size by unat_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1094
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1095
lemma unat_sub: "b <= a ==> unat (a - b) = unat a - unat (b :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1096
  by unat_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1097
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1098
lemmas no_olen_add_nat = no_plus_overflow_unat_size [unfolded word_size]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1099
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1100
lemmas unat_plus_simple = trans [OF no_olen_add_nat unat_add_lem, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1101
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1102
lemma word_div_mult: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1103
  "(0 :: 'a :: len word) < y ==> unat x * unat y < 2 ^ len_of TYPE('a) ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1104
    x * y div y = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1105
  apply unat_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1106
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1107
  apply (subst unat_mult_lem [THEN iffD1])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1108
  apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1109
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1110
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1111
lemma div_lt': "(i :: 'a :: len word) <= k div x ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1112
    unat i * unat x < 2 ^ len_of TYPE('a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1113
  apply unat_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1114
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1115
  apply (drule mult_le_mono1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1116
  apply (erule order_le_less_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1117
  apply (rule xtr7 [OF unat_lt2p div_mult_le])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1118
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1119
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1120
lemmas div_lt'' = order_less_imp_le [THEN div_lt']
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1121
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1122
lemma div_lt_mult: "(i :: 'a :: len word) < k div x ==> 0 < x ==> i * x < k"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1123
  apply (frule div_lt'' [THEN unat_mult_lem [THEN iffD1]])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1124
  apply (simp add: unat_arith_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1125
  apply (drule (1) mult_less_mono1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1126
  apply (erule order_less_le_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1127
  apply (rule div_mult_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1128
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1129
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1130
lemma div_le_mult: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1131
  "(i :: 'a :: len word) <= k div x ==> 0 < x ==> i * x <= k"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1132
  apply (frule div_lt' [THEN unat_mult_lem [THEN iffD1]])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1133
  apply (simp add: unat_arith_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1134
  apply (drule mult_le_mono1)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1135
  apply (erule order_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1136
  apply (rule div_mult_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1137
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1138
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1139
lemma div_lt_uint': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1140
  "(i :: 'a :: len word) <= k div x ==> uint i * uint x < 2 ^ len_of TYPE('a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1141
  apply (unfold uint_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1142
  apply (drule div_lt')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1143
  apply (simp add: zmult_int zless_nat_eq_int_zless [symmetric] 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1144
                   nat_power_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1145
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1146
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1147
lemmas div_lt_uint'' = order_less_imp_le [THEN div_lt_uint']
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1148
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1149
lemma word_le_exists': 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1150
  "(x :: 'a :: len0 word) <= y ==> 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1151
    (EX z. y = x + z & uint x + uint z < 2 ^ len_of TYPE('a))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1152
  apply (rule exI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1153
  apply (rule conjI)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1154
  apply (rule zadd_diff_inverse)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1155
  apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1156
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1157
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1158
lemmas plus_minus_not_NULL = order_less_imp_le [THEN plus_minus_not_NULL_ab]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1159
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1160
lemmas plus_minus_no_overflow =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1161
  order_less_imp_le [THEN plus_minus_no_overflow_ab]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1162
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1163
lemmas mcs = word_less_minus_cancel word_less_minus_mono_left
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1164
  word_le_minus_cancel word_le_minus_mono_left
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1165
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1166
lemmas word_l_diffs = mcs [where y = "?w + ?x", unfolded add_diff_cancel]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1167
lemmas word_diff_ls = mcs [where z = "?w + ?x", unfolded add_diff_cancel]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1168
lemmas word_plus_mcs = word_diff_ls 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1169
  [where y = "?v + ?x", unfolded add_diff_cancel]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1170
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1171
lemmas le_unat_uoi = unat_le [THEN word_unat.Abs_inverse]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1172
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1173
lemmas thd = refl [THEN [2] split_div_lemma [THEN iffD2], THEN conjunct1]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1174
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1175
lemma thd1:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1176
  "a div b * b \<le> (a::nat)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1177
  using gt_or_eq_0 [of b]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1178
  apply (rule disjE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1179
   apply (erule xtr4 [OF thd mult_commute])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1180
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1181
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1182
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1183
lemmas uno_simps [THEN le_unat_uoi, standard] =
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1184
  mod_le_divisor div_le_dividend thd1 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1185
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1186
lemma word_mod_div_equality:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1187
  "(n div b) * b + (n mod b) = (n :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1188
  apply (unfold word_less_nat_alt word_arith_nat_defs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1189
  apply (cut_tac y="unat b" in gt_or_eq_0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1190
  apply (erule disjE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1191
   apply (simp add: mod_div_equality uno_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1192
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1193
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1194
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1195
lemma word_div_mult_le: "a div b * b <= (a::'a::len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1196
  apply (unfold word_le_nat_alt word_arith_nat_defs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1197
  apply (cut_tac y="unat b" in gt_or_eq_0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1198
  apply (erule disjE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1199
   apply (simp add: div_mult_le uno_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1200
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1201
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1202
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1203
lemma word_mod_less_divisor: "0 < n ==> m mod n < (n :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1204
  apply (simp only: word_less_nat_alt word_arith_nat_defs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1205
  apply (clarsimp simp add : uno_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1206
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1207
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1208
lemma word_of_int_power_hom: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1209
  "word_of_int a ^ n = (word_of_int (a ^ n) :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1210
  by (induct n) (simp_all add : word_of_int_hom_syms power_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1211
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1212
lemma word_arith_power_alt: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1213
  "a ^ n = (word_of_int (uint a ^ n) :: 'a :: len word)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1214
  by (simp add : word_of_int_power_hom [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1215
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1216
lemma of_bl_length_less: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1217
  "length x = k ==> k < len_of TYPE('a) ==> (of_bl x :: 'a :: len word) < 2 ^ k"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1218
  apply (unfold of_bl_no [unfolded word_number_of_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1219
                word_less_alt word_number_of_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1220
  apply safe
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1221
  apply (simp (no_asm) add: word_of_int_power_hom word_uint.eq_norm 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1222
                       del: word_of_int_bin)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1223
  apply (simp add: mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1224
  apply (subst mod_pos_pos_trivial)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1225
    apply (rule bl_to_bin_ge0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1226
   apply (rule order_less_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1227
    apply (rule bl_to_bin_lt2p)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1228
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1229
  apply (rule bl_to_bin_lt2p)    
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1230
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1231
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1232
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1233
section "Cardinality, finiteness of set of words"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1234
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1235
lemmas card_lessThan' = card_lessThan [unfolded lessThan_def]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1236
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1237
lemmas card_eq = word_unat.Abs_inj_on [THEN card_image,
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1238
  unfolded word_unat.image, unfolded unats_def, standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1239
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1240
lemmas card_word = trans [OF card_eq card_lessThan', standard]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1241
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1242
lemma finite_word_UNIV: "finite (UNIV :: 'a :: len word set)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1243
  apply (rule contrapos_np)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1244
   prefer 2
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1245
   apply (erule card_infinite)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1246
  apply (simp add : card_word)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1247
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1248
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1249
lemma card_word_size: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1250
  "card (UNIV :: 'a :: len word set) = (2 ^ size (x :: 'a word))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1251
  unfolding word_size by (rule card_word)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1252
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1253
end 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
  1254