src/HOL/Word/WordGenLib.thy
author wenzelm
Tue, 10 Jun 2008 21:50:05 +0200
changeset 27136 06a8f65e32f6
parent 27133 e26ed41cc8ea
child 29235 2d62b637fa80
permissions -rw-r--r--
recovered nat_induct as default for induct_tac;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     1
(* Author: Gerwin Klein, Jeremy Dawson
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     2
   $Id$
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     3
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     4
   Miscellaneous additional library definitions and lemmas for 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     5
   the word type. Instantiation to boolean algebras, definition
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     6
   of recursion and induction patterns for words.
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     7
*)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
     8
24350
4d74f37c6367 headers for document generation
huffman
parents: 24333
diff changeset
     9
header {* Miscellaneous Library for Words *}
4d74f37c6367 headers for document generation
huffman
parents: 24333
diff changeset
    10
26558
7fcc10088e72 renamed app2 to map2
haftmann
parents: 25349
diff changeset
    11
theory WordGenLib
7fcc10088e72 renamed app2 to map2
haftmann
parents: 25349
diff changeset
    12
imports WordShift Boolean_Algebra
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    13
begin
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    14
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    15
declare of_nat_2p [simp]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    16
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    17
lemma word_int_cases:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    18
  "\<lbrakk>\<And>n. \<lbrakk>(x ::'a::len0 word) = word_of_int n; 0 \<le> n; n < 2^len_of TYPE('a)\<rbrakk> \<Longrightarrow> P\<rbrakk>
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    19
   \<Longrightarrow> P"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    20
  by (cases x rule: word_uint.Abs_cases) (simp add: uints_num)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    21
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    22
lemma word_nat_cases [cases type: word]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    23
  "\<lbrakk>\<And>n. \<lbrakk>(x ::'a::len word) = of_nat n; n < 2^len_of TYPE('a)\<rbrakk> \<Longrightarrow> P\<rbrakk>
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    24
   \<Longrightarrow> P"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    25
  by (cases x rule: word_unat.Abs_cases) (simp add: unats_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    26
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    27
lemma max_word_eq:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    28
  "(max_word::'a::len word) = 2^len_of TYPE('a) - 1"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    29
  by (simp add: max_word_def word_of_int_hom_syms word_of_int_2p)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    30
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    31
lemma max_word_max [simp,intro!]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    32
  "n \<le> max_word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    33
  by (cases n rule: word_int_cases)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    34
     (simp add: max_word_def word_le_def int_word_uint int_mod_eq')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    35
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    36
lemma word_of_int_2p_len: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    37
  "word_of_int (2 ^ len_of TYPE('a)) = (0::'a::len0 word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    38
  by (subst word_uint.Abs_norm [symmetric]) 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    39
     (simp add: word_of_int_hom_syms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    40
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    41
lemma word_pow_0:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    42
  "(2::'a::len word) ^ len_of TYPE('a) = 0"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    43
proof -
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    44
  have "word_of_int (2 ^ len_of TYPE('a)) = (0::'a word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    45
    by (rule word_of_int_2p_len)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    46
  thus ?thesis by (simp add: word_of_int_2p)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    47
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    48
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    49
lemma max_word_wrap: "x + 1 = 0 \<Longrightarrow> x = max_word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    50
  apply (simp add: max_word_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    51
  apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    52
  apply auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    53
  apply (simp add: word_pow_0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    54
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    55
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    56
lemma max_word_minus: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    57
  "max_word = (-1::'a::len word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    58
proof -
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    59
  have "-1 + 1 = (0::'a word)" by simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    60
  thus ?thesis by (rule max_word_wrap [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    61
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    62
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    63
lemma max_word_bl [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    64
  "to_bl (max_word::'a::len word) = replicate (len_of TYPE('a)) True"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    65
  by (subst max_word_minus to_bl_n1)+ simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    66
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    67
lemma max_test_bit [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    68
  "(max_word::'a::len word) !! n = (n < len_of TYPE('a))"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    69
  by (auto simp add: test_bit_bl word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    70
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    71
lemma word_and_max [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    72
  "x AND max_word = x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    73
  by (rule word_eqI) (simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    74
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    75
lemma word_or_max [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    76
  "x OR max_word = max_word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    77
  by (rule word_eqI) (simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    78
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    79
lemma word_ao_dist2:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    80
  "x AND (y OR z) = x AND y OR x AND (z::'a::len0 word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    81
  by (rule word_eqI) (auto simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    82
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    83
lemma word_oa_dist2:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    84
  "x OR y AND z = (x OR y) AND (x OR (z::'a::len0 word))"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    85
  by (rule word_eqI) (auto simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    86
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    87
lemma word_and_not [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
    88
  "x AND NOT x = (0::'a::len0 word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    89
  by (rule word_eqI) (auto simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    90
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    91
lemma word_or_not [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    92
  "x OR NOT x = max_word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    93
  by (rule word_eqI) (auto simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    94
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    95
lemma word_boolean:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    96
  "boolean (op AND) (op OR) bitNOT 0 max_word"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    97
  apply (rule boolean.intro)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    98
           apply (rule word_bw_assocs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
    99
          apply (rule word_bw_assocs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   100
         apply (rule word_bw_comms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   101
        apply (rule word_bw_comms)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   102
       apply (rule word_ao_dist2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   103
      apply (rule word_oa_dist2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   104
     apply (rule word_and_max)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   105
    apply (rule word_log_esimps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   106
   apply (rule word_and_not)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   107
  apply (rule word_or_not)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   108
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   109
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   110
interpretation word_bool_alg:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   111
  boolean ["op AND" "op OR" bitNOT 0 max_word]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   112
  by (rule word_boolean)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   113
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   114
lemma word_xor_and_or:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   115
  "x XOR y = x AND NOT y OR NOT x AND (y::'a::len0 word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   116
  by (rule word_eqI) (auto simp add: word_ops_nth_size word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   117
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   118
interpretation word_bool_alg:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   119
  boolean_xor ["op AND" "op OR" bitNOT 0 max_word "op XOR"]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   120
  apply (rule boolean_xor.intro)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   121
   apply (rule word_boolean)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   122
  apply (rule boolean_xor_axioms.intro)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   123
  apply (rule word_xor_and_or)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   124
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   125
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   126
lemma shiftr_0 [iff]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   127
  "(x::'a::len0 word) >> 0 = x"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   128
  by (simp add: shiftr_bl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   129
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   130
lemma shiftl_0 [simp]: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   131
  "(x :: 'a :: len word) << 0 = x"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   132
  by (simp add: shiftl_t2n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   133
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   134
lemma shiftl_1 [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   135
  "(1::'a::len word) << n = 2^n"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   136
  by (simp add: shiftl_t2n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   137
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   138
lemma uint_lt_0 [simp]:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   139
  "uint x < 0 = False"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   140
  by (simp add: linorder_not_less)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   141
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   142
lemma shiftr1_1 [simp]: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   143
  "shiftr1 (1::'a::len word) = 0"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   144
  by (simp add: shiftr1_def word_0_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   145
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   146
lemma shiftr_1[simp]: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   147
  "(1::'a::len word) >> n = (if n = 0 then 1 else 0)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   148
  by (induct n) (auto simp: shiftr_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   149
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   150
lemma word_less_1 [simp]: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   151
  "((x::'a::len word) < 1) = (x = 0)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   152
  by (simp add: word_less_nat_alt unat_0_iff)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   153
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   154
lemma to_bl_mask:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   155
  "to_bl (mask n :: 'a::len word) = 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   156
  replicate (len_of TYPE('a) - n) False @ 
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   157
    replicate (min (len_of TYPE('a)) n) True"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   158
  by (simp add: mask_bl word_rep_drop min_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   159
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   160
lemma map_replicate_True:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   161
  "n = length xs ==>
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   162
    map (\<lambda>(x,y). x & y) (zip xs (replicate n True)) = xs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   163
  by (induct xs arbitrary: n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   164
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   165
lemma map_replicate_False:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   166
  "n = length xs ==> map (\<lambda>(x,y). x & y)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   167
    (zip xs (replicate n False)) = replicate n False"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   168
  by (induct xs arbitrary: n) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   169
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   170
lemma bl_and_mask:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   171
  fixes w :: "'a::len word"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   172
  fixes n
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   173
  defines "n' \<equiv> len_of TYPE('a) - n"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   174
  shows "to_bl (w AND mask n) =  replicate n' False @ drop n' (to_bl w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   175
proof - 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   176
  note [simp] = map_replicate_True map_replicate_False
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   177
  have "to_bl (w AND mask n) = 
26558
7fcc10088e72 renamed app2 to map2
haftmann
parents: 25349
diff changeset
   178
        map2 op & (to_bl w) (to_bl (mask n::'a::len word))"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   179
    by (simp add: bl_word_and)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   180
  also
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   181
  have "to_bl w = take n' (to_bl w) @ drop n' (to_bl w)" by simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   182
  also
26558
7fcc10088e72 renamed app2 to map2
haftmann
parents: 25349
diff changeset
   183
  have "map2 op & \<dots> (to_bl (mask n::'a::len word)) = 
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   184
        replicate n' False @ drop n' (to_bl w)"
26558
7fcc10088e72 renamed app2 to map2
haftmann
parents: 25349
diff changeset
   185
    unfolding to_bl_mask n'_def map2_def
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   186
    by (subst zip_append) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   187
  finally
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   188
  show ?thesis .
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   189
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   190
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   191
lemma drop_rev_takefill:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   192
  "length xs \<le> n ==>
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   193
    drop (n - length xs) (rev (takefill False n (rev xs))) = xs"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   194
  by (simp add: takefill_alt rev_take)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   195
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   196
lemma map_nth_0 [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   197
  "map (op !! (0::'a::len0 word)) xs = replicate (length xs) False"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   198
  by (induct xs) auto
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   199
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   200
lemma uint_plus_if_size:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   201
  "uint (x + y) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   202
  (if uint x + uint y < 2^size x then 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   203
      uint x + uint y 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   204
   else 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   205
      uint x + uint y - 2^size x)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   206
  by (simp add: word_arith_alts int_word_uint mod_add_if_z 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   207
                word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   208
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   209
lemma unat_plus_if_size:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   210
  "unat (x + (y::'a::len word)) = 
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   211
  (if unat x + unat y < 2^size x then 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   212
      unat x + unat y 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   213
   else 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   214
      unat x + unat y - 2^size x)" 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   215
  apply (subst word_arith_nat_defs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   216
  apply (subst unat_of_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   217
  apply (simp add:  mod_nat_add word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   218
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   219
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   220
lemma word_neq_0_conv [simp]:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   221
  fixes w :: "'a :: len word"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   222
  shows "(w \<noteq> 0) = (0 < w)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   223
proof -
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   224
  have "0 \<le> w" by (rule word_zero_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   225
  thus ?thesis by (auto simp add: word_less_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   226
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   227
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   228
lemma max_lt:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   229
  "unat (max a b div c) = unat (max a b) div unat (c:: 'a :: len word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   230
  apply (subst word_arith_nat_defs)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   231
  apply (subst word_unat.eq_norm)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   232
  apply (subst mod_if)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   233
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   234
  apply (erule notE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   235
  apply (insert div_le_dividend [of "unat (max a b)" "unat c"])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   236
  apply (erule order_le_less_trans)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   237
  apply (insert unat_lt2p [of "max a b"])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   238
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   239
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   240
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   241
lemma uint_sub_if_size:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   242
  "uint (x - y) = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   243
  (if uint y \<le> uint x then 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   244
      uint x - uint y 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   245
   else 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   246
      uint x - uint y + 2^size x)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   247
  by (simp add: word_arith_alts int_word_uint mod_sub_if_z 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   248
                word_size)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   249
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   250
lemma unat_sub_simple:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   251
  "x \<le> y ==> unat (y - x) = unat y - unat x"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   252
  by (simp add: unat_def uint_sub_if_size word_le_def nat_diff_distrib)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   253
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   254
lemmas unat_sub = unat_sub_simple
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   255
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   256
lemma word_less_sub1:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   257
  fixes x :: "'a :: len word"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   258
  shows "x \<noteq> 0 ==> 1 < x = (0 < x - 1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   259
  by (simp add: unat_sub_if_size word_less_nat_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   260
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   261
lemma word_le_sub1:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   262
  fixes x :: "'a :: len word"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   263
  shows "x \<noteq> 0 ==> 1 \<le> x = (0 \<le> x - 1)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   264
  by (simp add: unat_sub_if_size order_le_less word_less_nat_alt)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   265
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   266
lemmas word_less_sub1_numberof [simp] =
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   267
  word_less_sub1 [of "number_of w", standard]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   268
lemmas word_le_sub1_numberof [simp] =
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   269
  word_le_sub1 [of "number_of w", standard]
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   270
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   271
lemma word_of_int_minus: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   272
  "word_of_int (2^len_of TYPE('a) - i) = (word_of_int (-i)::'a::len word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   273
proof -
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   274
  have x: "2^len_of TYPE('a) - i = -i + 2^len_of TYPE('a)" by simp
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   275
  show ?thesis
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   276
    apply (subst x)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   277
    apply (subst word_uint.Abs_norm [symmetric], subst zmod_zadd_self2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   278
    apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   279
    done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   280
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   281
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   282
lemmas word_of_int_inj = 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   283
  word_uint.Abs_inject [unfolded uints_num, simplified]
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   284
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   285
lemma word_le_less_eq:
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   286
  "(x ::'z::len word) \<le> y = (x = y \<or> x < y)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   287
  by (auto simp add: word_less_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   288
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   289
lemma mod_plus_cong:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   290
  assumes 1: "(b::int) = b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   291
      and 2: "x mod b' = x' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   292
      and 3: "y mod b' = y' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   293
      and 4: "x' + y' = z'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   294
  shows "(x + y) mod b = z' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   295
proof -
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   296
  from 1 2[symmetric] 3[symmetric] have "(x + y) mod b = (x' mod b' + y' mod b') mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   297
    by (simp add: zmod_zadd1_eq[symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   298
  also have "\<dots> = (x' + y') mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   299
    by (simp add: zmod_zadd1_eq[symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   300
  finally show ?thesis by (simp add: 4)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   301
qed
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   302
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   303
lemma mod_minus_cong:
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   304
  assumes 1: "(b::int) = b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   305
      and 2: "x mod b' = x' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   306
      and 3: "y mod b' = y' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   307
      and 4: "x' - y' = z'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   308
  shows "(x - y) mod b = z' mod b'"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   309
  using assms
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   310
  apply (subst zmod_zsub_left_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   311
  apply (subst zmod_zsub_right_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   312
  apply (simp add: zmod_zsub_left_eq [symmetric] zmod_zsub_right_eq [symmetric])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   313
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   314
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   315
lemma word_induct_less: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   316
  "\<lbrakk>P (0::'a::len word); \<And>n. \<lbrakk>n < m; P n\<rbrakk> \<Longrightarrow> P (1 + n)\<rbrakk> \<Longrightarrow> P m"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   317
  apply (cases m)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   318
  apply atomize
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   319
  apply (erule rev_mp)+
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   320
  apply (rule_tac x=m in spec)
27136
06a8f65e32f6 recovered nat_induct as default for induct_tac;
wenzelm
parents: 27133
diff changeset
   321
  apply (induct_tac n)
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   322
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   323
  apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   324
  apply (erule impE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   325
   apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   326
   apply (erule_tac x=n in allE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   327
   apply (erule impE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   328
    apply (simp add: unat_arith_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   329
    apply (clarsimp simp: unat_of_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   330
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   331
  apply (erule_tac x="of_nat na" in allE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   332
  apply (erule impE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   333
   apply (simp add: unat_arith_simps)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   334
   apply (clarsimp simp: unat_of_nat)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   335
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   336
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   337
  
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   338
lemma word_induct: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   339
  "\<lbrakk>P (0::'a::len word); \<And>n. P n \<Longrightarrow> P (1 + n)\<rbrakk> \<Longrightarrow> P m"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   340
  by (erule word_induct_less, simp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   341
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   342
lemma word_induct2 [induct type]: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   343
  "\<lbrakk>P 0; \<And>n. \<lbrakk>1 + n \<noteq> 0; P n\<rbrakk> \<Longrightarrow> P (1 + n)\<rbrakk> \<Longrightarrow> P (n::'b::len word)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   344
  apply (rule word_induct, simp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   345
  apply (case_tac "1+n = 0", auto)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   346
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   347
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   348
constdefs
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   349
  word_rec :: "'a \<Rightarrow> ('b::len word \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> 'b word \<Rightarrow> 'a"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   350
  "word_rec forZero forSuc n \<equiv> nat_rec forZero (forSuc \<circ> of_nat) (unat n)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   351
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   352
lemma word_rec_0: "word_rec z s 0 = z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   353
  by (simp add: word_rec_def)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   354
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   355
lemma word_rec_Suc: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   356
  "1 + n \<noteq> (0::'a::len word) \<Longrightarrow> word_rec z s (1 + n) = s n (word_rec z s n)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   357
  apply (simp add: word_rec_def unat_word_ariths)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   358
  apply (subst nat_mod_eq')
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   359
   apply (cut_tac x=n in unat_lt2p)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   360
   apply (drule Suc_mono)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   361
   apply (simp add: less_Suc_eq_le)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   362
   apply (simp only: order_less_le, simp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   363
   apply (erule contrapos_pn, simp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   364
   apply (drule arg_cong[where f=of_nat])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   365
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   366
   apply (subst (asm) word_unat.Rep_Abs_A.Rep_inverse[of n])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   367
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   368
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   369
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   370
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   371
lemma word_rec_Pred: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   372
  "n \<noteq> 0 \<Longrightarrow> word_rec z s n = s (n - 1) (word_rec z s (n - 1))"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   373
  apply (rule subst[where t="n" and s="1 + (n - 1)"])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   374
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   375
  apply (subst word_rec_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   376
   apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   377
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   378
  done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   379
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   380
lemma word_rec_in: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   381
  "f (word_rec z (\<lambda>_. f) n) = word_rec (f z) (\<lambda>_. f) n"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   382
  by (induct n) (simp_all add: word_rec_0 word_rec_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   383
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   384
lemma word_rec_in2: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   385
  "f n (word_rec z f n) = word_rec (f 0 z) (f \<circ> op + 1) n"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   386
  by (induct n) (simp_all add: word_rec_0 word_rec_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   387
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   388
lemma word_rec_twice: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   389
  "m \<le> n \<Longrightarrow> word_rec z f n = word_rec (word_rec z f (n - m)) (f \<circ> op + (n - m)) m"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   390
apply (erule rev_mp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   391
apply (rule_tac x=z in spec)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   392
apply (rule_tac x=f in spec)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   393
apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   394
 apply (simp add: word_rec_0)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   395
apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   396
apply (rule_tac t="1 + n - m" and s="1 + (n - m)" in subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   397
 apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   398
apply (case_tac "1 + (n - m) = 0")
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   399
 apply (simp add: word_rec_0)
25349
0d46bea01741 eliminated illegal schematic variables in where/of;
wenzelm
parents: 24465
diff changeset
   400
 apply (rule_tac f = "word_rec ?a ?b" in arg_cong)
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   401
 apply (rule_tac t="m" and s="m + (1 + (n - m))" in subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   402
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   403
 apply (simp (no_asm_use))
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   404
apply (simp add: word_rec_Suc word_rec_in2)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   405
apply (erule impE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   406
 apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   407
apply (drule_tac x="x \<circ> op + 1" in spec)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   408
apply (drule_tac x="x 0 xa" in spec)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   409
apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   410
apply (rule_tac t="\<lambda>a. x (1 + (n - m + a))" and s="\<lambda>a. x (1 + (n - m) + a)"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   411
       in subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   412
 apply (clarsimp simp add: expand_fun_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   413
 apply (rule_tac t="(1 + (n - m + xb))" and s="1 + (n - m) + xb" in subst)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   414
  apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   415
 apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   416
apply (rule refl)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   417
done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   418
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   419
lemma word_rec_id: "word_rec z (\<lambda>_. id) n = z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   420
  by (induct n) (auto simp add: word_rec_0 word_rec_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   421
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   422
lemma word_rec_id_eq: "\<forall>m < n. f m = id \<Longrightarrow> word_rec z f n = z"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   423
apply (erule rev_mp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   424
apply (induct n)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   425
 apply (auto simp add: word_rec_0 word_rec_Suc)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   426
 apply (drule spec, erule mp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   427
 apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   428
apply (drule_tac x=n in spec, erule impE)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   429
 apply uint_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   430
apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   431
done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   432
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   433
lemma word_rec_max: 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   434
  "\<forall>m\<ge>n. m \<noteq> -1 \<longrightarrow> f m = id \<Longrightarrow> word_rec z f -1 = word_rec z f n"
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   435
apply (subst word_rec_twice[where n="-1" and m="-1 - n"])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   436
 apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   437
apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   438
apply (rule word_rec_id_eq)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   439
apply clarsimp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   440
apply (drule spec, rule mp, erule mp)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   441
 apply (rule word_plus_mono_right2[OF _ order_less_imp_le])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   442
  prefer 2 
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   443
  apply assumption
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   444
 apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   445
apply (erule contrapos_pn)
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   446
apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   447
apply (drule arg_cong[where f="\<lambda>x. x - n"])
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   448
apply simp
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   449
done
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   450
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   451
lemma unatSuc: 
24465
70f0214b3ecc revert to Word library version from 2007/08/20
huffman
parents: 24408
diff changeset
   452
  "1 + n \<noteq> (0::'a::len word) \<Longrightarrow> unat (1 + n) = Suc (unat n)"
24333
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   453
  by unat_arith
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   454
e77ea0ea7f2c * HOL-Word:
kleing
parents:
diff changeset
   455
end