src/HOL/Import/HOL/HOL4Word32.thy
changeset 17652 b1ef33ebfa17
parent 17644 bd59bfd4bf37
child 20485 3078fd2eec7b
equal deleted inserted replaced
17651:a6499b0c5a40 17652:b1ef33ebfa17
     6 
     6 
     7 consts
     7 consts
     8   DIV2 :: "nat => nat" 
     8   DIV2 :: "nat => nat" 
     9 
     9 
    10 defs
    10 defs
    11   DIV2_primdef: "DIV2 == %n::nat. n div (2::nat)"
    11   DIV2_primdef: "DIV2 == %n::nat. n div 2"
    12 
    12 
    13 lemma DIV2_def: "ALL n::nat. DIV2 n = n div (2::nat)"
    13 lemma DIV2_def: "ALL n::nat. DIV2 n = n div 2"
    14   by (import bits DIV2_def)
    14   by (import bits DIV2_def)
    15 
    15 
    16 consts
    16 consts
    17   TIMES_2EXP :: "nat => nat => nat" 
    17   TIMES_2EXP :: "nat => nat => nat" 
    18 
    18 
    19 defs
    19 defs
    20   TIMES_2EXP_primdef: "TIMES_2EXP == %(x::nat) n::nat. n * (2::nat) ^ x"
    20   TIMES_2EXP_primdef: "TIMES_2EXP == %(x::nat) n::nat. n * 2 ^ x"
    21 
    21 
    22 lemma TIMES_2EXP_def: "ALL (x::nat) n::nat. TIMES_2EXP x n = n * (2::nat) ^ x"
    22 lemma TIMES_2EXP_def: "ALL (x::nat) n::nat. TIMES_2EXP x n = n * 2 ^ x"
    23   by (import bits TIMES_2EXP_def)
    23   by (import bits TIMES_2EXP_def)
    24 
    24 
    25 consts
    25 consts
    26   DIV_2EXP :: "nat => nat => nat" 
    26   DIV_2EXP :: "nat => nat => nat" 
    27 
    27 
    28 defs
    28 defs
    29   DIV_2EXP_primdef: "DIV_2EXP == %(x::nat) n::nat. n div (2::nat) ^ x"
    29   DIV_2EXP_primdef: "DIV_2EXP == %(x::nat) n::nat. n div 2 ^ x"
    30 
    30 
    31 lemma DIV_2EXP_def: "ALL (x::nat) n::nat. DIV_2EXP x n = n div (2::nat) ^ x"
    31 lemma DIV_2EXP_def: "ALL (x::nat) n::nat. DIV_2EXP x n = n div 2 ^ x"
    32   by (import bits DIV_2EXP_def)
    32   by (import bits DIV_2EXP_def)
    33 
    33 
    34 consts
    34 consts
    35   MOD_2EXP :: "nat => nat => nat" 
    35   MOD_2EXP :: "nat => nat => nat" 
    36 
    36 
    37 defs
    37 defs
    38   MOD_2EXP_primdef: "MOD_2EXP == %(x::nat) n::nat. n mod (2::nat) ^ x"
    38   MOD_2EXP_primdef: "MOD_2EXP == %(x::nat) n::nat. n mod 2 ^ x"
    39 
    39 
    40 lemma MOD_2EXP_def: "ALL (x::nat) n::nat. MOD_2EXP x n = n mod (2::nat) ^ x"
    40 lemma MOD_2EXP_def: "ALL (x::nat) n::nat. MOD_2EXP x n = n mod 2 ^ x"
    41   by (import bits MOD_2EXP_def)
    41   by (import bits MOD_2EXP_def)
    42 
    42 
    43 consts
    43 consts
    44   DIVMOD_2EXP :: "nat => nat => nat * nat" 
    44   DIVMOD_2EXP :: "nat => nat => nat * nat" 
    45 
    45 
    46 defs
    46 defs
    47   DIVMOD_2EXP_primdef: "DIVMOD_2EXP == %(x::nat) n::nat. (n div (2::nat) ^ x, n mod (2::nat) ^ x)"
    47   DIVMOD_2EXP_primdef: "DIVMOD_2EXP == %(x::nat) n::nat. (n div 2 ^ x, n mod 2 ^ x)"
    48 
    48 
    49 lemma DIVMOD_2EXP_def: "ALL (x::nat) n::nat.
    49 lemma DIVMOD_2EXP_def: "ALL (x::nat) n::nat. DIVMOD_2EXP x n = (n div 2 ^ x, n mod 2 ^ x)"
    50    DIVMOD_2EXP x n = (n div (2::nat) ^ x, n mod (2::nat) ^ x)"
       
    51   by (import bits DIVMOD_2EXP_def)
    50   by (import bits DIVMOD_2EXP_def)
    52 
    51 
    53 consts
    52 consts
    54   SBIT :: "bool => nat => nat" 
    53   SBIT :: "bool => nat => nat" 
    55 
    54 
    56 defs
    55 defs
    57   SBIT_primdef: "(op ==::(bool => nat => nat) => (bool => nat => nat) => prop)
    56   SBIT_primdef: "SBIT == %(b::bool) n::nat. if b then 2 ^ n else 0"
    58  (SBIT::bool => nat => nat)
    57 
    59  (%(b::bool) n::nat.
    58 lemma SBIT_def: "ALL (b::bool) n::nat. SBIT b n = (if b then 2 ^ n else 0)"
    60      (If::bool => nat => nat => nat) b
    59   by (import bits SBIT_def)
       
    60 
       
    61 consts
       
    62   BITS :: "nat => nat => nat => nat" 
       
    63 
       
    64 defs
       
    65   BITS_primdef: "BITS == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h - l) (DIV_2EXP l n)"
       
    66 
       
    67 lemma BITS_def: "ALL (h::nat) (l::nat) n::nat.
       
    68    BITS h l n = MOD_2EXP (Suc h - l) (DIV_2EXP l n)"
       
    69   by (import bits BITS_def)
       
    70 
       
    71 constdefs
       
    72   bit :: "nat => nat => bool" 
       
    73   "bit == %(b::nat) n::nat. BITS b b n = 1"
       
    74 
       
    75 lemma BIT_def: "ALL (b::nat) n::nat. bit b n = (BITS b b n = 1)"
       
    76   by (import bits BIT_def)
       
    77 
       
    78 consts
       
    79   SLICE :: "nat => nat => nat => nat" 
       
    80 
       
    81 defs
       
    82   SLICE_primdef: "SLICE == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h) n - MOD_2EXP l n"
       
    83 
       
    84 lemma SLICE_def: "ALL (h::nat) (l::nat) n::nat.
       
    85    SLICE h l n = MOD_2EXP (Suc h) n - MOD_2EXP l n"
       
    86   by (import bits SLICE_def)
       
    87 
       
    88 consts
       
    89   LSBn :: "nat => bool" 
       
    90 
       
    91 defs
       
    92   LSBn_primdef: "LSBn == bit 0"
       
    93 
       
    94 lemma LSBn_def: "LSBn = bit 0"
       
    95   by (import bits LSBn_def)
       
    96 
       
    97 consts
       
    98   BITWISE :: "nat => (bool => bool => bool) => nat => nat => nat" 
       
    99 
       
   100 specification (BITWISE_primdef: BITWISE) BITWISE_def: "(ALL (oper::bool => bool => bool) (x::nat) y::nat. BITWISE 0 oper x y = 0) &
       
   101 (ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat.
       
   102     BITWISE (Suc n) oper x y =
       
   103     BITWISE n oper x y + SBIT (oper (bit n x) (bit n y)) n)"
       
   104   by (import bits BITWISE_def)
       
   105 
       
   106 lemma DIV1: "ALL x::nat. x div 1 = x"
       
   107   by (import bits DIV1)
       
   108 
       
   109 lemma SUC_SUB: "Suc (a::nat) - a = 1"
       
   110   by (import bits SUC_SUB)
       
   111 
       
   112 lemma DIV_MULT_1: "ALL (r::nat) n::nat. r < n --> (n + r) div n = 1"
       
   113   by (import bits DIV_MULT_1)
       
   114 
       
   115 lemma ZERO_LT_TWOEXP: "(All::(nat => bool) => bool)
       
   116  (%n::nat.
       
   117      (op <::nat => nat => bool) (0::nat)
    61       ((op ^::nat => nat => nat)
   118       ((op ^::nat => nat => nat)
    62         ((number_of::bin => nat)
   119         ((number_of::bin => nat)
    63           ((op BIT::bin => bit => bin)
   120           ((op BIT::bin => bit => bin)
    64             ((op BIT::bin => bit => bin) (Numeral.Pls::bin) (bit.B1::bit))
   121             ((op BIT::bin => bit => bin) (Numeral.Pls::bin) (bit.B1::bit))
    65             (bit.B0::bit)))
   122             (bit.B0::bit)))
    66         n)
   123         n))"
    67       (0::nat))"
   124   by (import bits ZERO_LT_TWOEXP)
    68 
   125 
    69 lemma SBIT_def: "(All::(bool => bool) => bool)
   126 lemma MOD_2EXP_LT: "ALL (n::nat) k::nat. k mod 2 ^ n < 2 ^ n"
    70  (%b::bool.
   127   by (import bits MOD_2EXP_LT)
       
   128 
       
   129 lemma TWOEXP_DIVISION: "ALL (n::nat) k::nat. k = k div 2 ^ n * 2 ^ n + k mod 2 ^ n"
       
   130   by (import bits TWOEXP_DIVISION)
       
   131 
       
   132 lemma TWOEXP_MONO: "(All::(nat => bool) => bool)
       
   133  (%a::nat.
    71      (All::(nat => bool) => bool)
   134      (All::(nat => bool) => bool)
    72       (%n::nat.
   135       (%b::nat.
    73           (op =::nat => nat => bool) ((SBIT::bool => nat => nat) b n)
   136           (op -->::bool => bool => bool) ((op <::nat => nat => bool) a b)
    74            ((If::bool => nat => nat => nat) b
   137            ((op <::nat => nat => bool)
    75              ((op ^::nat => nat => nat)
   138              ((op ^::nat => nat => nat)
    76                ((number_of::bin => nat)
   139                ((number_of::bin => nat)
    77                  ((op BIT::bin => bit => bin)
   140                  ((op BIT::bin => bit => bin)
    78                    ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
   141                    ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
    79                      (bit.B1::bit))
   142                      (bit.B1::bit))
    80                    (bit.B0::bit)))
   143                    (bit.B0::bit)))
    81                n)
   144                a)
    82              (0::nat))))"
   145              ((op ^::nat => nat => nat)
    83   by (import bits SBIT_def)
   146                ((number_of::bin => nat)
    84 
   147                  ((op BIT::bin => bit => bin)
    85 consts
   148                    ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
    86   BITS :: "nat => nat => nat => nat" 
   149                      (bit.B1::bit))
    87 
   150                    (bit.B0::bit)))
    88 defs
   151                b))))"
    89   BITS_primdef: "BITS == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h - l) (DIV_2EXP l n)"
       
    90 
       
    91 lemma BITS_def: "ALL (h::nat) (l::nat) n::nat.
       
    92    BITS h l n = MOD_2EXP (Suc h - l) (DIV_2EXP l n)"
       
    93   by (import bits BITS_def)
       
    94 
       
    95 constdefs
       
    96   bit :: "nat => nat => bool" 
       
    97   "bit == %(b::nat) n::nat. BITS b b n = (1::nat)"
       
    98 
       
    99 lemma BIT_def: "ALL (b::nat) n::nat. bit b n = (BITS b b n = (1::nat))"
       
   100   by (import bits BIT_def)
       
   101 
       
   102 consts
       
   103   SLICE :: "nat => nat => nat => nat" 
       
   104 
       
   105 defs
       
   106   SLICE_primdef: "SLICE == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h) n - MOD_2EXP l n"
       
   107 
       
   108 lemma SLICE_def: "ALL (h::nat) (l::nat) n::nat.
       
   109    SLICE h l n = MOD_2EXP (Suc h) n - MOD_2EXP l n"
       
   110   by (import bits SLICE_def)
       
   111 
       
   112 consts
       
   113   LSBn :: "nat => bool" 
       
   114 
       
   115 defs
       
   116   LSBn_primdef: "LSBn == bit (0::nat)"
       
   117 
       
   118 lemma LSBn_def: "LSBn = bit (0::nat)"
       
   119   by (import bits LSBn_def)
       
   120 
       
   121 consts
       
   122   BITWISE :: "nat => (bool => bool => bool) => nat => nat => nat" 
       
   123 
       
   124 specification (BITWISE_primdef: BITWISE) BITWISE_def: "(ALL (oper::bool => bool => bool) (x::nat) y::nat.
       
   125     BITWISE (0::nat) oper x y = (0::nat)) &
       
   126 (ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat.
       
   127     BITWISE (Suc n) oper x y =
       
   128     BITWISE n oper x y + SBIT (oper (bit n x) (bit n y)) n)"
       
   129   by (import bits BITWISE_def)
       
   130 
       
   131 lemma DIV1: "ALL x::nat. x div (1::nat) = x"
       
   132   by (import bits DIV1)
       
   133 
       
   134 lemma SUC_SUB: "Suc (a::nat) - a = (1::nat)"
       
   135   by (import bits SUC_SUB)
       
   136 
       
   137 lemma DIV_MULT_1: "ALL (r::nat) n::nat. r < n --> (n + r) div n = (1::nat)"
       
   138   by (import bits DIV_MULT_1)
       
   139 
       
   140 lemma ZERO_LT_TWOEXP: "ALL n::nat. (0::nat) < (2::nat) ^ n"
       
   141   by (import bits ZERO_LT_TWOEXP)
       
   142 
       
   143 lemma MOD_2EXP_LT: "ALL (n::nat) k::nat. k mod (2::nat) ^ n < (2::nat) ^ n"
       
   144   by (import bits MOD_2EXP_LT)
       
   145 
       
   146 lemma TWOEXP_DIVISION: "ALL (n::nat) k::nat.
       
   147    k = k div (2::nat) ^ n * (2::nat) ^ n + k mod (2::nat) ^ n"
       
   148   by (import bits TWOEXP_DIVISION)
       
   149 
       
   150 lemma TWOEXP_MONO: "ALL (a::nat) b::nat. a < b --> (2::nat) ^ a < (2::nat) ^ b"
       
   151   by (import bits TWOEXP_MONO)
   152   by (import bits TWOEXP_MONO)
   152 
   153 
   153 lemma TWOEXP_MONO2: "ALL (a::nat) b::nat. a <= b --> (2::nat) ^ a <= (2::nat) ^ b"
   154 lemma TWOEXP_MONO2: "(All::(nat => bool) => bool)
       
   155  (%a::nat.
       
   156      (All::(nat => bool) => bool)
       
   157       (%b::nat.
       
   158           (op -->::bool => bool => bool) ((op <=::nat => nat => bool) a b)
       
   159            ((op <=::nat => nat => bool)
       
   160              ((op ^::nat => nat => nat)
       
   161                ((number_of::bin => nat)
       
   162                  ((op BIT::bin => bit => bin)
       
   163                    ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   164                      (bit.B1::bit))
       
   165                    (bit.B0::bit)))
       
   166                a)
       
   167              ((op ^::nat => nat => nat)
       
   168                ((number_of::bin => nat)
       
   169                  ((op BIT::bin => bit => bin)
       
   170                    ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   171                      (bit.B1::bit))
       
   172                    (bit.B0::bit)))
       
   173                b))))"
   154   by (import bits TWOEXP_MONO2)
   174   by (import bits TWOEXP_MONO2)
   155 
   175 
   156 lemma EXP_SUB_LESS_EQ: "ALL (a::nat) b::nat. (2::nat) ^ (a - b) <= (2::nat) ^ a"
   176 lemma EXP_SUB_LESS_EQ: "(All::(nat => bool) => bool)
       
   177  (%a::nat.
       
   178      (All::(nat => bool) => bool)
       
   179       (%b::nat.
       
   180           (op <=::nat => nat => bool)
       
   181            ((op ^::nat => nat => nat)
       
   182              ((number_of::bin => nat)
       
   183                ((op BIT::bin => bit => bin)
       
   184                  ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   185                    (bit.B1::bit))
       
   186                  (bit.B0::bit)))
       
   187              ((op -::nat => nat => nat) a b))
       
   188            ((op ^::nat => nat => nat)
       
   189              ((number_of::bin => nat)
       
   190                ((op BIT::bin => bit => bin)
       
   191                  ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   192                    (bit.B1::bit))
       
   193                  (bit.B0::bit)))
       
   194              a)))"
   157   by (import bits EXP_SUB_LESS_EQ)
   195   by (import bits EXP_SUB_LESS_EQ)
   158 
   196 
   159 lemma BITS_THM: "ALL (x::nat) (xa::nat) xb::nat.
   197 lemma BITS_THM: "ALL (x::nat) (xa::nat) xb::nat.
   160    BITS x xa xb = xb div (2::nat) ^ xa mod (2::nat) ^ (Suc x - xa)"
   198    BITS x xa xb = xb div 2 ^ xa mod 2 ^ (Suc x - xa)"
   161   by (import bits BITS_THM)
   199   by (import bits BITS_THM)
   162 
   200 
   163 lemma BITSLT_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n < (2::nat) ^ (Suc h - l)"
   201 lemma BITSLT_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n < 2 ^ (Suc h - l)"
   164   by (import bits BITSLT_THM)
   202   by (import bits BITSLT_THM)
   165 
   203 
   166 lemma DIV_MULT_LEM: "ALL (m::nat) n::nat. (0::nat) < n --> m div n * n <= m"
   204 lemma DIV_MULT_LEM: "ALL (m::nat) n::nat. 0 < n --> m div n * n <= m"
   167   by (import bits DIV_MULT_LEM)
   205   by (import bits DIV_MULT_LEM)
   168 
   206 
   169 lemma MOD_2EXP_LEM: "ALL (n::nat) x::nat.
   207 lemma MOD_2EXP_LEM: "ALL (n::nat) x::nat. n mod 2 ^ x = n - n div 2 ^ x * 2 ^ x"
   170    n mod (2::nat) ^ x = n - n div (2::nat) ^ x * (2::nat) ^ x"
       
   171   by (import bits MOD_2EXP_LEM)
   208   by (import bits MOD_2EXP_LEM)
   172 
   209 
   173 lemma BITS2_THM: "ALL (h::nat) (l::nat) n::nat.
   210 lemma BITS2_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n = n mod 2 ^ Suc h div 2 ^ l"
   174    BITS h l n = n mod (2::nat) ^ Suc h div (2::nat) ^ l"
       
   175   by (import bits BITS2_THM)
   211   by (import bits BITS2_THM)
   176 
   212 
   177 lemma BITS_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat.
   213 lemma BITS_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat.
   178    h2 + l1 <= h1 --> BITS h2 l2 (BITS h1 l1 n) = BITS (h2 + l1) (l2 + l1) n"
   214    h2 + l1 <= h1 --> BITS h2 l2 (BITS h1 l1 n) = BITS (h2 + l1) (l2 + l1) n"
   179   by (import bits BITS_COMP_THM)
   215   by (import bits BITS_COMP_THM)
   180 
   216 
   181 lemma BITS_DIV_THM: "ALL (h::nat) (l::nat) (x::nat) n::nat.
   217 lemma BITS_DIV_THM: "ALL (h::nat) (l::nat) (x::nat) n::nat.
   182    BITS h l x div (2::nat) ^ n = BITS h (l + n) x"
   218    BITS h l x div 2 ^ n = BITS h (l + n) x"
   183   by (import bits BITS_DIV_THM)
   219   by (import bits BITS_DIV_THM)
   184 
   220 
   185 lemma BITS_LT_HIGH: "ALL (h::nat) (l::nat) n::nat.
   221 lemma BITS_LT_HIGH: "ALL (h::nat) (l::nat) n::nat. n < 2 ^ Suc h --> BITS h l n = n div 2 ^ l"
   186    n < (2::nat) ^ Suc h --> BITS h l n = n div (2::nat) ^ l"
       
   187   by (import bits BITS_LT_HIGH)
   222   by (import bits BITS_LT_HIGH)
   188 
   223 
   189 lemma BITS_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> BITS h l n = (0::nat)"
   224 lemma BITS_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> BITS h l n = 0"
   190   by (import bits BITS_ZERO)
   225   by (import bits BITS_ZERO)
   191 
   226 
   192 lemma BITS_ZERO2: "ALL (h::nat) l::nat. BITS h l (0::nat) = (0::nat)"
   227 lemma BITS_ZERO2: "ALL (h::nat) l::nat. BITS h l 0 = 0"
   193   by (import bits BITS_ZERO2)
   228   by (import bits BITS_ZERO2)
   194 
   229 
   195 lemma BITS_ZERO3: "ALL (h::nat) x::nat. BITS h (0::nat) x = x mod (2::nat) ^ Suc h"
   230 lemma BITS_ZERO3: "ALL (h::nat) x::nat. BITS h 0 x = x mod 2 ^ Suc h"
   196   by (import bits BITS_ZERO3)
   231   by (import bits BITS_ZERO3)
   197 
   232 
   198 lemma BITS_COMP_THM2: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat.
   233 lemma BITS_COMP_THM2: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat.
   199    BITS h2 l2 (BITS h1 l1 n) = BITS (min h1 (h2 + l1)) (l2 + l1) n"
   234    BITS h2 l2 (BITS h1 l1 n) = BITS (min h1 (h2 + l1)) (l2 + l1) n"
   200   by (import bits BITS_COMP_THM2)
   235   by (import bits BITS_COMP_THM2)
   201 
   236 
   202 lemma NOT_MOD2_LEM: "ALL n::nat. (n mod (2::nat) ~= (0::nat)) = (n mod (2::nat) = (1::nat))"
   237 lemma NOT_MOD2_LEM: "ALL n::nat. (n mod 2 ~= 0) = (n mod 2 = 1)"
   203   by (import bits NOT_MOD2_LEM)
   238   by (import bits NOT_MOD2_LEM)
   204 
   239 
   205 lemma NOT_MOD2_LEM2: "ALL (n::nat) a::'a::type.
   240 lemma NOT_MOD2_LEM2: "ALL (n::nat) a::'a::type. (n mod 2 ~= 1) = (n mod 2 = 0)"
   206    (n mod (2::nat) ~= (1::nat)) = (n mod (2::nat) = (0::nat))"
       
   207   by (import bits NOT_MOD2_LEM2)
   241   by (import bits NOT_MOD2_LEM2)
   208 
   242 
   209 lemma EVEN_MOD2_LEM: "ALL n::nat. EVEN n = (n mod (2::nat) = (0::nat))"
   243 lemma EVEN_MOD2_LEM: "ALL n::nat. EVEN n = (n mod 2 = 0)"
   210   by (import bits EVEN_MOD2_LEM)
   244   by (import bits EVEN_MOD2_LEM)
   211 
   245 
   212 lemma ODD_MOD2_LEM: "ALL n::nat. ODD n = (n mod (2::nat) = (1::nat))"
   246 lemma ODD_MOD2_LEM: "ALL n::nat. ODD n = (n mod 2 = 1)"
   213   by (import bits ODD_MOD2_LEM)
   247   by (import bits ODD_MOD2_LEM)
   214 
   248 
   215 lemma LSB_ODD: "LSBn = ODD"
   249 lemma LSB_ODD: "LSBn = ODD"
   216   by (import bits LSB_ODD)
   250   by (import bits LSB_ODD)
   217 
   251 
   218 lemma DIV_MULT_THM: "ALL (x::nat) n::nat.
   252 lemma DIV_MULT_THM: "ALL (x::nat) n::nat. n div 2 ^ x * 2 ^ x = n - n mod 2 ^ x"
   219    n div (2::nat) ^ x * (2::nat) ^ x = n - n mod (2::nat) ^ x"
       
   220   by (import bits DIV_MULT_THM)
   253   by (import bits DIV_MULT_THM)
   221 
   254 
   222 lemma DIV_MULT_THM2: "ALL x::nat. (2::nat) * (x div (2::nat)) = x - x mod (2::nat)"
   255 lemma DIV_MULT_THM2: "ALL x::nat. 2 * (x div 2) = x - x mod 2"
   223   by (import bits DIV_MULT_THM2)
   256   by (import bits DIV_MULT_THM2)
   224 
   257 
   225 lemma LESS_EQ_EXP_MULT: "ALL (a::nat) b::nat. a <= b --> (EX x::nat. (2::nat) ^ b = x * (2::nat) ^ a)"
   258 lemma LESS_EQ_EXP_MULT: "ALL (a::nat) b::nat. a <= b --> (EX x::nat. 2 ^ b = x * 2 ^ a)"
   226   by (import bits LESS_EQ_EXP_MULT)
   259   by (import bits LESS_EQ_EXP_MULT)
   227 
   260 
   228 lemma SLICE_LEM1: "ALL (a::nat) (x::nat) y::nat.
   261 lemma SLICE_LEM1: "ALL (a::nat) (x::nat) y::nat.
   229    a div (2::nat) ^ (x + y) * (2::nat) ^ (x + y) =
   262    a div 2 ^ (x + y) * 2 ^ (x + y) =
   230    a div (2::nat) ^ x * (2::nat) ^ x -
   263    a div 2 ^ x * 2 ^ x - a div 2 ^ x mod 2 ^ y * 2 ^ x"
   231    a div (2::nat) ^ x mod (2::nat) ^ y * (2::nat) ^ x"
       
   232   by (import bits SLICE_LEM1)
   264   by (import bits SLICE_LEM1)
   233 
   265 
   234 lemma SLICE_LEM2: "ALL (a::'a::type) (x::nat) y::nat.
   266 lemma SLICE_LEM2: "ALL (a::'a::type) (x::nat) y::nat.
   235    (n::nat) mod (2::nat) ^ (x + y) =
   267    (n::nat) mod 2 ^ (x + y) = n mod 2 ^ x + n div 2 ^ x mod 2 ^ y * 2 ^ x"
   236    n mod (2::nat) ^ x + n div (2::nat) ^ x mod (2::nat) ^ y * (2::nat) ^ x"
       
   237   by (import bits SLICE_LEM2)
   268   by (import bits SLICE_LEM2)
   238 
   269 
   239 lemma SLICE_LEM3: "ALL (n::nat) (h::nat) l::nat.
   270 lemma SLICE_LEM3: "ALL (n::nat) (h::nat) l::nat. l < h --> n mod 2 ^ Suc l <= n mod 2 ^ h"
   240    l < h --> n mod (2::nat) ^ Suc l <= n mod (2::nat) ^ h"
       
   241   by (import bits SLICE_LEM3)
   271   by (import bits SLICE_LEM3)
   242 
   272 
   243 lemma SLICE_THM: "ALL (n::nat) (h::nat) l::nat. SLICE h l n = BITS h l n * (2::nat) ^ l"
   273 lemma SLICE_THM: "ALL (n::nat) (h::nat) l::nat. SLICE h l n = BITS h l n * 2 ^ l"
   244   by (import bits SLICE_THM)
   274   by (import bits SLICE_THM)
   245 
   275 
   246 lemma SLICELT_THM: "ALL (h::nat) (l::nat) n::nat. SLICE h l n < (2::nat) ^ Suc h"
   276 lemma SLICELT_THM: "ALL (h::nat) (l::nat) n::nat. SLICE h l n < 2 ^ Suc h"
   247   by (import bits SLICELT_THM)
   277   by (import bits SLICELT_THM)
   248 
   278 
   249 lemma BITS_SLICE_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l (SLICE h l n) = BITS h l n"
   279 lemma BITS_SLICE_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l (SLICE h l n) = BITS h l n"
   250   by (import bits BITS_SLICE_THM)
   280   by (import bits BITS_SLICE_THM)
   251 
   281 
   252 lemma BITS_SLICE_THM2: "ALL (h::nat) (l::nat) n::nat.
   282 lemma BITS_SLICE_THM2: "ALL (h::nat) (l::nat) n::nat.
   253    h <= (h2::nat) --> BITS h2 l (SLICE h l n) = BITS h l n"
   283    h <= (h2::nat) --> BITS h2 l (SLICE h l n) = BITS h l n"
   254   by (import bits BITS_SLICE_THM2)
   284   by (import bits BITS_SLICE_THM2)
   255 
   285 
   256 lemma MOD_2EXP_MONO: "ALL (n::nat) (h::nat) l::nat.
   286 lemma MOD_2EXP_MONO: "ALL (n::nat) (h::nat) l::nat. l <= h --> n mod 2 ^ l <= n mod 2 ^ Suc h"
   257    l <= h --> n mod (2::nat) ^ l <= n mod (2::nat) ^ Suc h"
       
   258   by (import bits MOD_2EXP_MONO)
   287   by (import bits MOD_2EXP_MONO)
   259 
   288 
   260 lemma SLICE_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) n::nat.
   289 lemma SLICE_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) n::nat.
   261    Suc m <= h & l <= m --> SLICE h (Suc m) n + SLICE m l n = SLICE h l n"
   290    Suc m <= h & l <= m --> SLICE h (Suc m) n + SLICE m l n = SLICE h l n"
   262   by (import bits SLICE_COMP_THM)
   291   by (import bits SLICE_COMP_THM)
   263 
   292 
   264 lemma SLICE_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> SLICE h l n = (0::nat)"
   293 lemma SLICE_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> SLICE h l n = 0"
   265   by (import bits SLICE_ZERO)
   294   by (import bits SLICE_ZERO)
   266 
   295 
   267 lemma BIT_COMP_THM3: "ALL (h::nat) (m::nat) (l::nat) n::nat.
   296 lemma BIT_COMP_THM3: "ALL (h::nat) (m::nat) (l::nat) n::nat.
   268    Suc m <= h & l <= m -->
   297    Suc m <= h & l <= m -->
   269    BITS h (Suc m) n * (2::nat) ^ (Suc m - l) + BITS m l n = BITS h l n"
   298    BITS h (Suc m) n * 2 ^ (Suc m - l) + BITS m l n = BITS h l n"
   270   by (import bits BIT_COMP_THM3)
   299   by (import bits BIT_COMP_THM3)
   271 
   300 
   272 lemma NOT_BIT: "ALL (n::nat) a::nat. (~ bit n a) = (BITS n n a = (0::nat))"
   301 lemma NOT_BIT: "ALL (n::nat) a::nat. (~ bit n a) = (BITS n n a = 0)"
   273   by (import bits NOT_BIT)
   302   by (import bits NOT_BIT)
   274 
   303 
   275 lemma NOT_BITS: "ALL (n::nat) a::nat. (BITS n n a ~= (0::nat)) = (BITS n n a = (1::nat))"
   304 lemma NOT_BITS: "ALL (n::nat) a::nat. (BITS n n a ~= 0) = (BITS n n a = 1)"
   276   by (import bits NOT_BITS)
   305   by (import bits NOT_BITS)
   277 
   306 
   278 lemma NOT_BITS2: "ALL (n::nat) a::nat. (BITS n n a ~= (1::nat)) = (BITS n n a = (0::nat))"
   307 lemma NOT_BITS2: "ALL (n::nat) a::nat. (BITS n n a ~= 1) = (BITS n n a = 0)"
   279   by (import bits NOT_BITS2)
   308   by (import bits NOT_BITS2)
   280 
   309 
   281 lemma BIT_SLICE: "ALL (n::nat) (a::nat) b::nat.
   310 lemma BIT_SLICE: "ALL (n::nat) (a::nat) b::nat.
   282    (bit n a = bit n b) = (SLICE n n a = SLICE n n b)"
   311    (bit n a = bit n b) = (SLICE n n a = SLICE n n b)"
   283   by (import bits BIT_SLICE)
   312   by (import bits BIT_SLICE)
   284 
   313 
   285 lemma BIT_SLICE_LEM: "ALL (y::nat) (x::nat) n::nat.
   314 lemma BIT_SLICE_LEM: "ALL (y::nat) (x::nat) n::nat. SBIT (bit x n) (x + y) = SLICE x x n * 2 ^ y"
   286    SBIT (bit x n) (x + y) = SLICE x x n * (2::nat) ^ y"
       
   287   by (import bits BIT_SLICE_LEM)
   315   by (import bits BIT_SLICE_LEM)
   288 
   316 
   289 lemma BIT_SLICE_THM: "ALL (x::nat) xa::nat. SBIT (bit x xa) x = SLICE x x xa"
   317 lemma BIT_SLICE_THM: "ALL (x::nat) xa::nat. SBIT (bit x xa) x = SLICE x x xa"
   290   by (import bits BIT_SLICE_THM)
   318   by (import bits BIT_SLICE_THM)
   291 
   319 
   292 lemma SBIT_DIV: "ALL (b::bool) (m::nat) n::nat.
   320 lemma SBIT_DIV: "ALL (b::bool) (m::nat) n::nat. n < m --> SBIT b (m - n) = SBIT b m div 2 ^ n"
   293    n < m --> SBIT b (m - n) = SBIT b m div (2::nat) ^ n"
       
   294   by (import bits SBIT_DIV)
   321   by (import bits SBIT_DIV)
   295 
   322 
   296 lemma BITS_SUC: "ALL (h::nat) (l::nat) n::nat.
   323 lemma BITS_SUC: "ALL (h::nat) (l::nat) n::nat.
   297    l <= Suc h -->
   324    l <= Suc h -->
   298    SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n = BITS (Suc h) l n"
   325    SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n = BITS (Suc h) l n"
   299   by (import bits BITS_SUC)
   326   by (import bits BITS_SUC)
   300 
   327 
   301 lemma BITS_SUC_THM: "ALL (h::nat) (l::nat) n::nat.
   328 lemma BITS_SUC_THM: "ALL (h::nat) (l::nat) n::nat.
   302    BITS (Suc h) l n =
   329    BITS (Suc h) l n =
   303    (if Suc h < l then 0::nat
   330    (if Suc h < l then 0 else SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n)"
   304     else SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n)"
       
   305   by (import bits BITS_SUC_THM)
   331   by (import bits BITS_SUC_THM)
   306 
   332 
   307 lemma BIT_BITS_THM: "ALL (h::nat) (l::nat) (a::nat) b::nat.
   333 lemma BIT_BITS_THM: "ALL (h::nat) (l::nat) (a::nat) b::nat.
   308    (ALL x::nat. l <= x & x <= h --> bit x a = bit x b) =
   334    (ALL x::nat. l <= x & x <= h --> bit x a = bit x b) =
   309    (BITS h l a = BITS h l b)"
   335    (BITS h l a = BITS h l b)"
   310   by (import bits BIT_BITS_THM)
   336   by (import bits BIT_BITS_THM)
   311 
   337 
   312 lemma BITWISE_LT_2EXP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   338 lemma BITWISE_LT_2EXP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   313    BITWISE n oper a b < (2::nat) ^ n"
   339    BITWISE n oper a b < 2 ^ n"
   314   by (import bits BITWISE_LT_2EXP)
   340   by (import bits BITWISE_LT_2EXP)
   315 
   341 
   316 lemma LESS_EXP_MULT2: "ALL (a::nat) b::nat.
   342 lemma LESS_EXP_MULT2: "(All::(nat => bool) => bool)
   317    a < b -->
   343  (%a::nat.
   318    (EX x::nat. (2::nat) ^ b = (2::nat) ^ (x + (1::nat)) * (2::nat) ^ a)"
   344      (All::(nat => bool) => bool)
       
   345       (%b::nat.
       
   346           (op -->::bool => bool => bool) ((op <::nat => nat => bool) a b)
       
   347            ((Ex::(nat => bool) => bool)
       
   348              (%x::nat.
       
   349                  (op =::nat => nat => bool)
       
   350                   ((op ^::nat => nat => nat)
       
   351                     ((number_of::bin => nat)
       
   352                       ((op BIT::bin => bit => bin)
       
   353                         ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   354                           (bit.B1::bit))
       
   355                         (bit.B0::bit)))
       
   356                     b)
       
   357                   ((op *::nat => nat => nat)
       
   358                     ((op ^::nat => nat => nat)
       
   359                       ((number_of::bin => nat)
       
   360                         ((op BIT::bin => bit => bin)
       
   361                           ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   362                             (bit.B1::bit))
       
   363                           (bit.B0::bit)))
       
   364                       ((op +::nat => nat => nat) x (1::nat)))
       
   365                     ((op ^::nat => nat => nat)
       
   366                       ((number_of::bin => nat)
       
   367                         ((op BIT::bin => bit => bin)
       
   368                           ((op BIT::bin => bit => bin) (Numeral.Pls::bin)
       
   369                             (bit.B1::bit))
       
   370                           (bit.B0::bit)))
       
   371                       a))))))"
   319   by (import bits LESS_EXP_MULT2)
   372   by (import bits LESS_EXP_MULT2)
   320 
   373 
   321 lemma BITWISE_THM: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   374 lemma BITWISE_THM: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   322    x < n --> bit x (BITWISE n oper a b) = oper (bit x a) (bit x b)"
   375    x < n --> bit x (BITWISE n oper a b) = oper (bit x a) (bit x b)"
   323   by (import bits BITWISE_THM)
   376   by (import bits BITWISE_THM)
   324 
   377 
   325 lemma BITWISE_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   378 lemma BITWISE_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   326    x < n -->
   379    x < n -->
   327    oper (bit x a) (bit x b) -->
   380    oper (bit x a) (bit x b) --> BITWISE n oper a b div 2 ^ x mod 2 = 1"
   328    BITWISE n oper a b div (2::nat) ^ x mod (2::nat) = (1::nat)"
       
   329   by (import bits BITWISE_COR)
   381   by (import bits BITWISE_COR)
   330 
   382 
   331 lemma BITWISE_NOT_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   383 lemma BITWISE_NOT_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   332    x < n -->
   384    x < n -->
   333    ~ oper (bit x a) (bit x b) -->
   385    ~ oper (bit x a) (bit x b) --> BITWISE n oper a b div 2 ^ x mod 2 = 0"
   334    BITWISE n oper a b div (2::nat) ^ x mod (2::nat) = (0::nat)"
       
   335   by (import bits BITWISE_NOT_COR)
   386   by (import bits BITWISE_NOT_COR)
   336 
   387 
   337 lemma MOD_PLUS_RIGHT: "ALL n>0::nat. ALL (j::nat) k::nat. (j + k mod n) mod n = (j + k) mod n"
   388 lemma MOD_PLUS_RIGHT: "ALL n>0. ALL (j::nat) k::nat. (j + k mod n) mod n = (j + k) mod n"
   338   by (import bits MOD_PLUS_RIGHT)
   389   by (import bits MOD_PLUS_RIGHT)
   339 
   390 
   340 lemma MOD_PLUS_1: "ALL n>0::nat.
   391 lemma MOD_PLUS_1: "ALL n>0. ALL x::nat. ((x + 1) mod n = 0) = (x mod n + 1 = n)"
   341    ALL x::nat. ((x + (1::nat)) mod n = (0::nat)) = (x mod n + (1::nat) = n)"
       
   342   by (import bits MOD_PLUS_1)
   392   by (import bits MOD_PLUS_1)
   343 
   393 
   344 lemma MOD_ADD_1: "ALL n>0::nat.
   394 lemma MOD_ADD_1: "ALL n>0. ALL x::nat. (x + 1) mod n ~= 0 --> (x + 1) mod n = x mod n + 1"
   345    ALL x::nat.
       
   346       (x + (1::nat)) mod n ~= (0::nat) -->
       
   347       (x + (1::nat)) mod n = x mod n + (1::nat)"
       
   348   by (import bits MOD_ADD_1)
   395   by (import bits MOD_ADD_1)
   349 
   396 
   350 ;end_setup
   397 ;end_setup
   351 
   398 
   352 ;setup_theory word32
   399 ;setup_theory word32
   377 
   424 
   378 consts
   425 consts
   379   MODw :: "nat => nat" 
   426   MODw :: "nat => nat" 
   380 
   427 
   381 defs
   428 defs
   382   MODw_primdef: "MODw == %n::nat. n mod (2::nat) ^ WL"
   429   MODw_primdef: "MODw == %n::nat. n mod 2 ^ WL"
   383 
   430 
   384 lemma MODw_def: "ALL n::nat. MODw n = n mod (2::nat) ^ WL"
   431 lemma MODw_def: "ALL n::nat. MODw n = n mod 2 ^ WL"
   385   by (import word32 MODw_def)
   432   by (import word32 MODw_def)
   386 
   433 
   387 consts
   434 consts
   388   INw :: "nat => bool" 
   435   INw :: "nat => bool" 
   389 
   436 
   390 defs
   437 defs
   391   INw_primdef: "INw == %n::nat. n < (2::nat) ^ WL"
   438   INw_primdef: "INw == %n::nat. n < 2 ^ WL"
   392 
   439 
   393 lemma INw_def: "ALL n::nat. INw n = (n < (2::nat) ^ WL)"
   440 lemma INw_def: "ALL n::nat. INw n = (n < 2 ^ WL)"
   394   by (import word32 INw_def)
   441   by (import word32 INw_def)
   395 
   442 
   396 consts
   443 consts
   397   EQUIV :: "nat => nat => bool" 
   444   EQUIV :: "nat => nat => bool" 
   398 
   445 
   427   by (import word32 MODw_IDEM2)
   474   by (import word32 MODw_IDEM2)
   428 
   475 
   429 lemma TOw_QT: "ALL a::nat. EQUIV (MODw a) a"
   476 lemma TOw_QT: "ALL a::nat. EQUIV (MODw a) a"
   430   by (import word32 TOw_QT)
   477   by (import word32 TOw_QT)
   431 
   478 
   432 lemma MODw_THM: "MODw = BITS HB (0::nat)"
   479 lemma MODw_THM: "MODw = BITS HB 0"
   433   by (import word32 MODw_THM)
   480   by (import word32 MODw_THM)
   434 
   481 
   435 lemma MOD_ADD: "ALL (a::nat) b::nat. MODw (a + b) = MODw (MODw a + MODw b)"
   482 lemma MOD_ADD: "ALL (a::nat) b::nat. MODw (a + b) = MODw (MODw a + MODw b)"
   436   by (import word32 MOD_ADD)
   483   by (import word32 MOD_ADD)
   437 
   484 
   440 
   487 
   441 consts
   488 consts
   442   AONE :: "nat" 
   489   AONE :: "nat" 
   443 
   490 
   444 defs
   491 defs
   445   AONE_primdef: "AONE == 1::nat"
   492   AONE_primdef: "AONE == 1"
   446 
   493 
   447 lemma AONE_def: "AONE = (1::nat)"
   494 lemma AONE_def: "AONE = 1"
   448   by (import word32 AONE_def)
   495   by (import word32 AONE_def)
   449 
   496 
   450 lemma ADD_QT: "(ALL n::nat. EQUIV ((0::nat) + n) n) &
   497 lemma ADD_QT: "(ALL n::nat. EQUIV (0 + n) n) &
   451 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n)))"
   498 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n)))"
   452   by (import word32 ADD_QT)
   499   by (import word32 ADD_QT)
   453 
   500 
   454 lemma ADD_0_QT: "ALL a::nat. EQUIV (a + (0::nat)) a"
   501 lemma ADD_0_QT: "ALL a::nat. EQUIV (a + 0) a"
   455   by (import word32 ADD_0_QT)
   502   by (import word32 ADD_0_QT)
   456 
   503 
   457 lemma ADD_COMM_QT: "ALL (a::nat) b::nat. EQUIV (a + b) (b + a)"
   504 lemma ADD_COMM_QT: "ALL (a::nat) b::nat. EQUIV (a + b) (b + a)"
   458   by (import word32 ADD_COMM_QT)
   505   by (import word32 ADD_COMM_QT)
   459 
   506 
   460 lemma ADD_ASSOC_QT: "ALL (a::nat) (b::nat) c::nat. EQUIV (a + (b + c)) (a + b + c)"
   507 lemma ADD_ASSOC_QT: "ALL (a::nat) (b::nat) c::nat. EQUIV (a + (b + c)) (a + b + c)"
   461   by (import word32 ADD_ASSOC_QT)
   508   by (import word32 ADD_ASSOC_QT)
   462 
   509 
   463 lemma MULT_QT: "(ALL n::nat. EQUIV ((0::nat) * n) (0::nat)) &
   510 lemma MULT_QT: "(ALL n::nat. EQUIV (0 * n) 0) &
   464 (ALL (m::nat) n::nat. EQUIV (Suc m * n) (m * n + n))"
   511 (ALL (m::nat) n::nat. EQUIV (Suc m * n) (m * n + n))"
   465   by (import word32 MULT_QT)
   512   by (import word32 MULT_QT)
   466 
   513 
   467 lemma ADD1_QT: "ALL m::nat. EQUIV (Suc m) (m + AONE)"
   514 lemma ADD1_QT: "ALL m::nat. EQUIV (Suc m) (m + AONE)"
   468   by (import word32 ADD1_QT)
   515   by (import word32 ADD1_QT)
   469 
   516 
   470 lemma ADD_CLAUSES_QT: "(ALL m::nat. EQUIV ((0::nat) + m) m) &
   517 lemma ADD_CLAUSES_QT: "(ALL m::nat. EQUIV (0 + m) m) &
   471 (ALL m::nat. EQUIV (m + (0::nat)) m) &
   518 (ALL m::nat. EQUIV (m + 0) m) &
   472 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n))) &
   519 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n))) &
   473 (ALL (m::nat) n::nat. EQUIV (m + Suc n) (Suc (m + n)))"
   520 (ALL (m::nat) n::nat. EQUIV (m + Suc n) (Suc (m + n)))"
   474   by (import word32 ADD_CLAUSES_QT)
   521   by (import word32 ADD_CLAUSES_QT)
   475 
   522 
   476 lemma SUC_EQUIV_COMP: "ALL (a::nat) b::nat.
   523 lemma SUC_EQUIV_COMP: "ALL (a::nat) b::nat. EQUIV (Suc a) b --> EQUIV a (b + (2 ^ WL - 1))"
   477    EQUIV (Suc a) b --> EQUIV a (b + ((2::nat) ^ WL - (1::nat)))"
       
   478   by (import word32 SUC_EQUIV_COMP)
   524   by (import word32 SUC_EQUIV_COMP)
   479 
   525 
   480 lemma INV_SUC_EQ_QT: "ALL (m::nat) n::nat. EQUIV (Suc m) (Suc n) = EQUIV m n"
   526 lemma INV_SUC_EQ_QT: "ALL (m::nat) n::nat. EQUIV (Suc m) (Suc n) = EQUIV m n"
   481   by (import word32 INV_SUC_EQ_QT)
   527   by (import word32 INV_SUC_EQ_QT)
   482 
   528 
   483 lemma ADD_INV_0_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m --> EQUIV n (0::nat)"
   529 lemma ADD_INV_0_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m --> EQUIV n 0"
   484   by (import word32 ADD_INV_0_QT)
   530   by (import word32 ADD_INV_0_QT)
   485 
   531 
   486 lemma ADD_INV_0_EQ_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m = EQUIV n (0::nat)"
   532 lemma ADD_INV_0_EQ_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m = EQUIV n 0"
   487   by (import word32 ADD_INV_0_EQ_QT)
   533   by (import word32 ADD_INV_0_EQ_QT)
   488 
   534 
   489 lemma EQ_ADD_LCANCEL_QT: "ALL (m::nat) (n::nat) p::nat. EQUIV (m + n) (m + p) = EQUIV n p"
   535 lemma EQ_ADD_LCANCEL_QT: "ALL (m::nat) (n::nat) p::nat. EQUIV (m + n) (m + p) = EQUIV n p"
   490   by (import word32 EQ_ADD_LCANCEL_QT)
   536   by (import word32 EQ_ADD_LCANCEL_QT)
   491 
   537 
   500 
   546 
   501 lemma MULT_COMM_QT: "ALL (m::nat) n::nat. EQUIV (m * n) (n * m)"
   547 lemma MULT_COMM_QT: "ALL (m::nat) n::nat. EQUIV (m * n) (n * m)"
   502   by (import word32 MULT_COMM_QT)
   548   by (import word32 MULT_COMM_QT)
   503 
   549 
   504 lemma MULT_CLAUSES_QT: "ALL (m::nat) n::nat.
   550 lemma MULT_CLAUSES_QT: "ALL (m::nat) n::nat.
   505    EQUIV ((0::nat) * m) (0::nat) &
   551    EQUIV (0 * m) 0 &
   506    EQUIV (m * (0::nat)) (0::nat) &
   552    EQUIV (m * 0) 0 &
   507    EQUIV (AONE * m) m &
   553    EQUIV (AONE * m) m &
   508    EQUIV (m * AONE) m &
   554    EQUIV (m * AONE) m &
   509    EQUIV (Suc m * n) (m * n + n) & EQUIV (m * Suc n) (m + m * n)"
   555    EQUIV (Suc m * n) (m * n + n) & EQUIV (m * Suc n) (m + m * n)"
   510   by (import word32 MULT_CLAUSES_QT)
   556   by (import word32 MULT_CLAUSES_QT)
   511 
   557 
   520 
   566 
   521 consts
   567 consts
   522   ONE_COMP :: "nat => nat" 
   568   ONE_COMP :: "nat => nat" 
   523 
   569 
   524 defs
   570 defs
   525   ONE_COMP_primdef: "ONE_COMP == %x::nat. (2::nat) ^ WL - (1::nat) - MODw x"
   571   ONE_COMP_primdef: "ONE_COMP == %x::nat. 2 ^ WL - 1 - MODw x"
   526 
   572 
   527 lemma ONE_COMP_def: "ALL x::nat. ONE_COMP x = (2::nat) ^ WL - (1::nat) - MODw x"
   573 lemma ONE_COMP_def: "ALL x::nat. ONE_COMP x = 2 ^ WL - 1 - MODw x"
   528   by (import word32 ONE_COMP_def)
   574   by (import word32 ONE_COMP_def)
   529 
   575 
   530 consts
   576 consts
   531   TWO_COMP :: "nat => nat" 
   577   TWO_COMP :: "nat => nat" 
   532 
   578 
   533 defs
   579 defs
   534   TWO_COMP_primdef: "TWO_COMP == %x::nat. (2::nat) ^ WL - MODw x"
   580   TWO_COMP_primdef: "TWO_COMP == %x::nat. 2 ^ WL - MODw x"
   535 
   581 
   536 lemma TWO_COMP_def: "ALL x::nat. TWO_COMP x = (2::nat) ^ WL - MODw x"
   582 lemma TWO_COMP_def: "ALL x::nat. TWO_COMP x = 2 ^ WL - MODw x"
   537   by (import word32 TWO_COMP_def)
   583   by (import word32 TWO_COMP_def)
   538 
   584 
   539 lemma ADD_TWO_COMP_QT: "ALL a::nat. EQUIV (MODw a + TWO_COMP a) (0::nat)"
   585 lemma ADD_TWO_COMP_QT: "ALL a::nat. EQUIV (MODw a + TWO_COMP a) 0"
   540   by (import word32 ADD_TWO_COMP_QT)
   586   by (import word32 ADD_TWO_COMP_QT)
   541 
   587 
   542 lemma TWO_COMP_ONE_COMP_QT: "ALL a::nat. EQUIV (TWO_COMP a) (ONE_COMP a + AONE)"
   588 lemma TWO_COMP_ONE_COMP_QT: "ALL a::nat. EQUIV (TWO_COMP a) (ONE_COMP a + AONE)"
   543   by (import word32 TWO_COMP_ONE_COMP_QT)
   589   by (import word32 TWO_COMP_ONE_COMP_QT)
   544 
   590 
   555                     ((bit::nat => nat => bool) xb x)
   601                     ((bit::nat => nat => bool) xb x)
   556                     ((bit::nat => nat => bool) xb xa))))
   602                     ((bit::nat => nat => bool) xb xa))))
   557            ((EQUIV::nat => nat => bool) x xa)))"
   603            ((EQUIV::nat => nat => bool) x xa)))"
   558   by (import word32 BIT_EQUIV_THM)
   604   by (import word32 BIT_EQUIV_THM)
   559 
   605 
   560 lemma BITS_SUC2: "ALL (n::nat) a::nat.
   606 lemma BITS_SUC2: "ALL (n::nat) a::nat. BITS (Suc n) 0 a = SLICE (Suc n) (Suc n) a + BITS n 0 a"
   561    BITS (Suc n) (0::nat) a = SLICE (Suc n) (Suc n) a + BITS n (0::nat) a"
       
   562   by (import word32 BITS_SUC2)
   607   by (import word32 BITS_SUC2)
   563 
   608 
   564 lemma BITWISE_ONE_COMP_THM: "ALL (a::nat) b::nat. BITWISE WL (%(x::bool) y::bool. ~ x) a b = ONE_COMP a"
   609 lemma BITWISE_ONE_COMP_THM: "ALL (a::nat) b::nat. BITWISE WL (%(x::bool) y::bool. ~ x) a b = ONE_COMP a"
   565   by (import word32 BITWISE_ONE_COMP_THM)
   610   by (import word32 BITWISE_ONE_COMP_THM)
   566 
   611 
   596 
   641 
   597 consts
   642 consts
   598   COMP0 :: "nat" 
   643   COMP0 :: "nat" 
   599 
   644 
   600 defs
   645 defs
   601   COMP0_primdef: "COMP0 == ONE_COMP (0::nat)"
   646   COMP0_primdef: "COMP0 == ONE_COMP 0"
   602 
   647 
   603 lemma COMP0_def: "COMP0 = ONE_COMP (0::nat)"
   648 lemma COMP0_def: "COMP0 = ONE_COMP 0"
   604   by (import word32 COMP0_def)
   649   by (import word32 COMP0_def)
   605 
   650 
   606 lemma BITWISE_THM2: "(All::(nat => bool) => bool)
   651 lemma BITWISE_THM2: "(All::(nat => bool) => bool)
   607  (%y::nat.
   652  (%y::nat.
   608      (All::((bool => bool => bool) => bool) => bool)
   653      (All::((bool => bool => bool) => bool) => bool)
   653   by (import word32 AND_IDEM_QT)
   698   by (import word32 AND_IDEM_QT)
   654 
   699 
   655 lemma OR_COMP_QT: "ALL a::nat. EQUIV (OR a (ONE_COMP a)) COMP0"
   700 lemma OR_COMP_QT: "ALL a::nat. EQUIV (OR a (ONE_COMP a)) COMP0"
   656   by (import word32 OR_COMP_QT)
   701   by (import word32 OR_COMP_QT)
   657 
   702 
   658 lemma AND_COMP_QT: "ALL a::nat. EQUIV (AND a (ONE_COMP a)) (0::nat)"
   703 lemma AND_COMP_QT: "ALL a::nat. EQUIV (AND a (ONE_COMP a)) 0"
   659   by (import word32 AND_COMP_QT)
   704   by (import word32 AND_COMP_QT)
   660 
   705 
   661 lemma ONE_COMP_QT: "ALL a::nat. EQUIV (ONE_COMP (ONE_COMP a)) a"
   706 lemma ONE_COMP_QT: "ALL a::nat. EQUIV (ONE_COMP (ONE_COMP a)) a"
   662   by (import word32 ONE_COMP_QT)
   707   by (import word32 ONE_COMP_QT)
   663 
   708 
   681 
   726 
   682 lemma MSB_WELLDEF: "ALL (a::nat) b::nat. EQUIV a b --> MSBn a = MSBn b"
   727 lemma MSB_WELLDEF: "ALL (a::nat) b::nat. EQUIV a b --> MSBn a = MSBn b"
   683   by (import word32 MSB_WELLDEF)
   728   by (import word32 MSB_WELLDEF)
   684 
   729 
   685 lemma BITWISE_ISTEP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   730 lemma BITWISE_ISTEP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   686    (0::nat) < n -->
   731    0 < n -->
   687    BITWISE n oper (a div (2::nat)) (b div (2::nat)) =
   732    BITWISE n oper (a div 2) (b div 2) =
   688    BITWISE n oper a b div (2::nat) +
   733    BITWISE n oper a b div 2 + SBIT (oper (bit n a) (bit n b)) (n - 1)"
   689    SBIT (oper (bit n a) (bit n b)) (n - (1::nat))"
       
   690   by (import word32 BITWISE_ISTEP)
   734   by (import word32 BITWISE_ISTEP)
   691 
   735 
   692 lemma BITWISE_EVAL: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   736 lemma BITWISE_EVAL: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat.
   693    BITWISE (Suc n) oper a b =
   737    BITWISE (Suc n) oper a b =
   694    (2::nat) * BITWISE n oper (a div (2::nat)) (b div (2::nat)) +
   738    2 * BITWISE n oper (a div 2) (b div 2) + SBIT (oper (LSBn a) (LSBn b)) 0"
   695    SBIT (oper (LSBn a) (LSBn b)) (0::nat)"
       
   696   by (import word32 BITWISE_EVAL)
   739   by (import word32 BITWISE_EVAL)
   697 
   740 
   698 lemma BITWISE_WELLDEF: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) (b::nat) (c::nat) d::nat.
   741 lemma BITWISE_WELLDEF: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) (b::nat) (c::nat) d::nat.
   699    EQUIV a b & EQUIV c d --> EQUIV (BITWISE n oper a c) (BITWISE n oper b d)"
   742    EQUIV a b & EQUIV c d --> EQUIV (BITWISE n oper a c) (BITWISE n oper b d)"
   700   by (import word32 BITWISE_WELLDEF)
   743   by (import word32 BITWISE_WELLDEF)
   726 
   769 
   727 consts
   770 consts
   728   LSR_ONE :: "nat => nat" 
   771   LSR_ONE :: "nat => nat" 
   729 
   772 
   730 defs
   773 defs
   731   LSR_ONE_primdef: "LSR_ONE == %a::nat. MODw a div (2::nat)"
   774   LSR_ONE_primdef: "LSR_ONE == %a::nat. MODw a div 2"
   732 
   775 
   733 lemma LSR_ONE_def: "ALL a::nat. LSR_ONE a = MODw a div (2::nat)"
   776 lemma LSR_ONE_def: "ALL a::nat. LSR_ONE a = MODw a div 2"
   734   by (import word32 LSR_ONE_def)
   777   by (import word32 LSR_ONE_def)
   735 
   778 
   736 consts
   779 consts
   737   ASR_ONE :: "nat => nat" 
   780   ASR_ONE :: "nat => nat" 
   738 
   781 
   770   by (import word32 ROR_ONE_WELLDEF)
   813   by (import word32 ROR_ONE_WELLDEF)
   771 
   814 
   772 lemma RRX_WELLDEF: "ALL (a::nat) (b::nat) c::bool. EQUIV a b --> EQUIV (RRXn c a) (RRXn c b)"
   815 lemma RRX_WELLDEF: "ALL (a::nat) (b::nat) c::bool. EQUIV a b --> EQUIV (RRXn c a) (RRXn c b)"
   773   by (import word32 RRX_WELLDEF)
   816   by (import word32 RRX_WELLDEF)
   774 
   817 
   775 lemma LSR_ONE: "LSR_ONE = BITS HB (1::nat)"
   818 lemma LSR_ONE: "LSR_ONE = BITS HB 1"
   776   by (import word32 LSR_ONE)
   819   by (import word32 LSR_ONE)
   777 
   820 
   778 typedef (open) word32 = "{x::nat => bool. EX xa::nat. x = EQUIV xa}" 
   821 typedef (open) word32 = "{x::nat => bool. EX xa::nat. x = EQUIV xa}" 
   779   by (rule typedef_helper,import word32 word32_TY_DEF)
   822   by (rule typedef_helper,import word32 word32_TY_DEF)
   780 
   823 
   791 
   834 
   792 consts
   835 consts
   793   w_0 :: "word32" 
   836   w_0 :: "word32" 
   794 
   837 
   795 defs
   838 defs
   796   w_0_primdef: "w_0 == mk_word32 (EQUIV (0::nat))"
   839   w_0_primdef: "w_0 == mk_word32 (EQUIV 0)"
   797 
   840 
   798 lemma w_0_def: "w_0 = mk_word32 (EQUIV (0::nat))"
   841 lemma w_0_def: "w_0 = mk_word32 (EQUIV 0)"
   799   by (import word32 w_0_def)
   842   by (import word32 w_0_def)
   800 
   843 
   801 consts
   844 consts
   802   w_1 :: "word32" 
   845   w_1 :: "word32" 
   803 
   846 
  1079    word_1comp (bitwise_and x xa) =
  1122    word_1comp (bitwise_and x xa) =
  1080    bitwise_or (word_1comp x) (word_1comp xa) &
  1123    bitwise_or (word_1comp x) (word_1comp xa) &
  1081    word_1comp (bitwise_or x xa) = bitwise_and (word_1comp x) (word_1comp xa)"
  1124    word_1comp (bitwise_or x xa) = bitwise_and (word_1comp x) (word_1comp xa)"
  1082   by (import word32 DE_MORGAN_THMw)
  1125   by (import word32 DE_MORGAN_THMw)
  1083 
  1126 
  1084 lemma w_0: "w_0 = n2w (0::nat)"
  1127 lemma w_0: "w_0 = n2w 0"
  1085   by (import word32 w_0)
  1128   by (import word32 w_0)
  1086 
  1129 
  1087 lemma w_1: "w_1 = n2w (1::nat)"
  1130 lemma w_1: "w_1 = n2w 1"
  1088   by (import word32 w_1)
  1131   by (import word32 w_1)
  1089 
  1132 
  1090 lemma w_T: "w_T =
  1133 lemma w_T: "w_T =
  1091 n2w (NUMERAL
  1134 n2w (NUMERAL
  1092       (NUMERAL_BIT1
  1135       (NUMERAL_BIT1
  1137 lemma word_sub: "ALL (a::word32) b::word32. word_sub a b = word_add a (word_2comp b)"
  1180 lemma word_sub: "ALL (a::word32) b::word32. word_sub a b = word_add a (word_2comp b)"
  1138   by (import word32 word_sub)
  1181   by (import word32 word_sub)
  1139 
  1182 
  1140 constdefs
  1183 constdefs
  1141   word_lsl :: "word32 => nat => word32" 
  1184   word_lsl :: "word32 => nat => word32" 
  1142   "word_lsl == %(a::word32) n::nat. word_mul a (n2w ((2::nat) ^ n))"
  1185   "word_lsl == %(a::word32) n::nat. word_mul a (n2w (2 ^ n))"
  1143 
  1186 
  1144 lemma word_lsl: "ALL (a::word32) n::nat. word_lsl a n = word_mul a (n2w ((2::nat) ^ n))"
  1187 lemma word_lsl: "ALL (a::word32) n::nat. word_lsl a n = word_mul a (n2w (2 ^ n))"
  1145   by (import word32 word_lsl)
  1188   by (import word32 word_lsl)
  1146 
  1189 
  1147 constdefs
  1190 constdefs
  1148   word_lsr :: "word32 => nat => word32" 
  1191   word_lsr :: "word32 => nat => word32" 
  1149   "word_lsr == %(a::word32) n::nat. (word_lsr1 ^ n) a"
  1192   "word_lsr == %(a::word32) n::nat. (word_lsr1 ^ n) a"
  1318   by (import word32 ROR_ADD)
  1361   by (import word32 ROR_ADD)
  1319 
  1362 
  1320 lemma LSL_LIMIT: "ALL (w::word32) n::nat. HB < n --> word_lsl w n = w_0"
  1363 lemma LSL_LIMIT: "ALL (w::word32) n::nat. HB < n --> word_lsl w n = w_0"
  1321   by (import word32 LSL_LIMIT)
  1364   by (import word32 LSL_LIMIT)
  1322 
  1365 
  1323 lemma MOD_MOD_DIV: "ALL (a::nat) b::nat. INw (MODw a div (2::nat) ^ b)"
  1366 lemma MOD_MOD_DIV: "ALL (a::nat) b::nat. INw (MODw a div 2 ^ b)"
  1324   by (import word32 MOD_MOD_DIV)
  1367   by (import word32 MOD_MOD_DIV)
  1325 
  1368 
  1326 lemma MOD_MOD_DIV_2EXP: "ALL (a::nat) n::nat.
  1369 lemma MOD_MOD_DIV_2EXP: "ALL (a::nat) n::nat. MODw (MODw a div 2 ^ n) div 2 = MODw a div 2 ^ Suc n"
  1327    MODw (MODw a div (2::nat) ^ n) div (2::nat) = MODw a div (2::nat) ^ Suc n"
       
  1328   by (import word32 MOD_MOD_DIV_2EXP)
  1370   by (import word32 MOD_MOD_DIV_2EXP)
  1329 
  1371 
  1330 lemma LSR_EVAL: "ALL n::nat. word_lsr (n2w (a::nat)) n = n2w (MODw a div (2::nat) ^ n)"
  1372 lemma LSR_EVAL: "ALL n::nat. word_lsr (n2w (a::nat)) n = n2w (MODw a div 2 ^ n)"
  1331   by (import word32 LSR_EVAL)
  1373   by (import word32 LSR_EVAL)
  1332 
  1374 
  1333 lemma LSR_THM: "ALL (x::nat) n::nat. word_lsr (n2w n) x = n2w (BITS HB (min WL x) n)"
  1375 lemma LSR_THM: "ALL (x::nat) n::nat. word_lsr (n2w n) x = n2w (BITS HB (min WL x) n)"
  1334   by (import word32 LSR_THM)
  1376   by (import word32 LSR_THM)
  1335 
  1377 
  1336 lemma LSR_LIMIT: "ALL (x::nat) w::word32. HB < x --> word_lsr w x = w_0"
  1378 lemma LSR_LIMIT: "ALL (x::nat) w::word32. HB < x --> word_lsr w x = w_0"
  1337   by (import word32 LSR_LIMIT)
  1379   by (import word32 LSR_LIMIT)
  1338 
  1380 
  1339 lemma LEFT_SHIFT_LESS: "ALL (n::nat) (m::nat) a::nat.
  1381 lemma LEFT_SHIFT_LESS: "ALL (n::nat) (m::nat) a::nat. a < 2 ^ m --> 2 ^ n + a * 2 ^ n <= 2 ^ (m + n)"
  1340    a < (2::nat) ^ m -->
       
  1341    (2::nat) ^ n + a * (2::nat) ^ n <= (2::nat) ^ (m + n)"
       
  1342   by (import word32 LEFT_SHIFT_LESS)
  1382   by (import word32 LEFT_SHIFT_LESS)
  1343 
  1383 
  1344 lemma ROR_THM: "ALL (x::nat) n::nat.
  1384 lemma ROR_THM: "ALL (x::nat) n::nat.
  1345    word_ror (n2w n) x =
  1385    word_ror (n2w n) x =
  1346    (let x'::nat = x mod WL
  1386    (let x'::nat = x mod WL
  1347     in n2w (BITS HB x' n +
  1387     in n2w (BITS HB x' n + BITS (x' - 1) 0 n * 2 ^ (WL - x')))"
  1348             BITS (x' - (1::nat)) (0::nat) n * (2::nat) ^ (WL - x')))"
       
  1349   by (import word32 ROR_THM)
  1388   by (import word32 ROR_THM)
  1350 
  1389 
  1351 lemma ROR_CYCLE: "ALL (x::nat) w::word32. word_ror w (x * WL) = w"
  1390 lemma ROR_CYCLE: "ALL (x::nat) w::word32. word_ror w (x * WL) = w"
  1352   by (import word32 ROR_CYCLE)
  1391   by (import word32 ROR_CYCLE)
  1353 
  1392 
  1354 lemma ASR_THM: "ALL (x::nat) n::nat.
  1393 lemma ASR_THM: "ALL (x::nat) n::nat.
  1355    word_asr (n2w n) x =
  1394    word_asr (n2w n) x =
  1356    (let x'::nat = min HB x; s::nat = BITS HB x' n
  1395    (let x'::nat = min HB x; s::nat = BITS HB x' n
  1357     in n2w (if MSBn n then (2::nat) ^ WL - (2::nat) ^ (WL - x') + s else s))"
  1396     in n2w (if MSBn n then 2 ^ WL - 2 ^ (WL - x') + s else s))"
  1358   by (import word32 ASR_THM)
  1397   by (import word32 ASR_THM)
  1359 
  1398 
  1360 lemma ASR_LIMIT: "ALL (x::nat) w::word32.
  1399 lemma ASR_LIMIT: "ALL (x::nat) w::word32.
  1361    HB <= x --> word_asr w x = (if MSB w then w_T else w_0)"
  1400    HB <= x --> word_asr w x = (if MSB w then w_T else w_0)"
  1362   by (import word32 ASR_LIMIT)
  1401   by (import word32 ASR_LIMIT)
  1364 lemma ZERO_SHIFT: "(ALL n::nat. word_lsl w_0 n = w_0) &
  1403 lemma ZERO_SHIFT: "(ALL n::nat. word_lsl w_0 n = w_0) &
  1365 (ALL n::nat. word_asr w_0 n = w_0) &
  1404 (ALL n::nat. word_asr w_0 n = w_0) &
  1366 (ALL n::nat. word_lsr w_0 n = w_0) & (ALL n::nat. word_ror w_0 n = w_0)"
  1405 (ALL n::nat. word_lsr w_0 n = w_0) & (ALL n::nat. word_ror w_0 n = w_0)"
  1367   by (import word32 ZERO_SHIFT)
  1406   by (import word32 ZERO_SHIFT)
  1368 
  1407 
  1369 lemma ZERO_SHIFT2: "(ALL a::word32. word_lsl a (0::nat) = a) &
  1408 lemma ZERO_SHIFT2: "(ALL a::word32. word_lsl a 0 = a) &
  1370 (ALL a::word32. word_asr a (0::nat) = a) &
  1409 (ALL a::word32. word_asr a 0 = a) &
  1371 (ALL a::word32. word_lsr a (0::nat) = a) &
  1410 (ALL a::word32. word_lsr a 0 = a) & (ALL a::word32. word_ror a 0 = a)"
  1372 (ALL a::word32. word_ror a (0::nat) = a)"
       
  1373   by (import word32 ZERO_SHIFT2)
  1411   by (import word32 ZERO_SHIFT2)
  1374 
  1412 
  1375 lemma ASR_w_T: "ALL n::nat. word_asr w_T n = w_T"
  1413 lemma ASR_w_T: "ALL n::nat. word_asr w_T n = w_T"
  1376   by (import word32 ASR_w_T)
  1414   by (import word32 ASR_w_T)
  1377 
  1415 
  1423 lemma MUL_EVAL2: "ALL (b::nat) a::nat. word_mul (n2w a) (n2w b) = n2w (MODw (a * b))"
  1461 lemma MUL_EVAL2: "ALL (b::nat) a::nat. word_mul (n2w a) (n2w b) = n2w (MODw (a * b))"
  1424   by (import word32 MUL_EVAL2)
  1462   by (import word32 MUL_EVAL2)
  1425 
  1463 
  1426 lemma ONE_COMP_EVAL2: "ALL a::nat.
  1464 lemma ONE_COMP_EVAL2: "ALL a::nat.
  1427    word_1comp (n2w a) =
  1465    word_1comp (n2w a) =
  1428    n2w ((2::nat) ^
  1466    n2w (2 ^
  1429         NUMERAL
  1467         NUMERAL
  1430          (NUMERAL_BIT2
  1468          (NUMERAL_BIT2
  1431            (NUMERAL_BIT1
  1469            (NUMERAL_BIT1
  1432              (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) -
  1470              (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) -
  1433         (1::nat) -
  1471         1 -
  1434         MODw a)"
  1472         MODw a)"
  1435   by (import word32 ONE_COMP_EVAL2)
  1473   by (import word32 ONE_COMP_EVAL2)
  1436 
  1474 
  1437 lemma TWO_COMP_EVAL2: "ALL a::nat.
  1475 lemma TWO_COMP_EVAL2: "ALL a::nat.
  1438    word_2comp (n2w a) =
  1476    word_2comp (n2w a) =
  1439    n2w (MODw
  1477    n2w (MODw
  1440          ((2::nat) ^
  1478          (2 ^
  1441           NUMERAL
  1479           NUMERAL
  1442            (NUMERAL_BIT2
  1480            (NUMERAL_BIT2
  1443              (NUMERAL_BIT1
  1481              (NUMERAL_BIT1
  1444                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) -
  1482                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) -
  1445           MODw a))"
  1483           MODw a))"
  1446   by (import word32 TWO_COMP_EVAL2)
  1484   by (import word32 TWO_COMP_EVAL2)
  1447 
  1485 
  1448 lemma LSR_ONE_EVAL2: "ALL a::nat. word_lsr1 (n2w a) = n2w (MODw a div (2::nat))"
  1486 lemma LSR_ONE_EVAL2: "ALL a::nat. word_lsr1 (n2w a) = n2w (MODw a div 2)"
  1449   by (import word32 LSR_ONE_EVAL2)
  1487   by (import word32 LSR_ONE_EVAL2)
  1450 
  1488 
  1451 lemma ASR_ONE_EVAL2: "ALL a::nat.
  1489 lemma ASR_ONE_EVAL2: "ALL a::nat.
  1452    word_asr1 (n2w a) =
  1490    word_asr1 (n2w a) =
  1453    n2w (MODw a div (2::nat) +
  1491    n2w (MODw a div 2 +
  1454         SBIT (MSBn a)
  1492         SBIT (MSBn a)
  1455          (NUMERAL
  1493          (NUMERAL
  1456            (NUMERAL_BIT1
  1494            (NUMERAL_BIT1
  1457              (NUMERAL_BIT1
  1495              (NUMERAL_BIT1
  1458                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1496                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1459   by (import word32 ASR_ONE_EVAL2)
  1497   by (import word32 ASR_ONE_EVAL2)
  1460 
  1498 
  1461 lemma ROR_ONE_EVAL2: "ALL a::nat.
  1499 lemma ROR_ONE_EVAL2: "ALL a::nat.
  1462    word_ror1 (n2w a) =
  1500    word_ror1 (n2w a) =
  1463    n2w (MODw a div (2::nat) +
  1501    n2w (MODw a div 2 +
  1464         SBIT (LSBn a)
  1502         SBIT (LSBn a)
  1465          (NUMERAL
  1503          (NUMERAL
  1466            (NUMERAL_BIT1
  1504            (NUMERAL_BIT1
  1467              (NUMERAL_BIT1
  1505              (NUMERAL_BIT1
  1468                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1506                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1469   by (import word32 ROR_ONE_EVAL2)
  1507   by (import word32 ROR_ONE_EVAL2)
  1470 
  1508 
  1471 lemma RRX_EVAL2: "ALL (c::bool) a::nat.
  1509 lemma RRX_EVAL2: "ALL (c::bool) a::nat.
  1472    RRX c (n2w a) =
  1510    RRX c (n2w a) =
  1473    n2w (MODw a div (2::nat) +
  1511    n2w (MODw a div 2 +
  1474         SBIT c
  1512         SBIT c
  1475          (NUMERAL
  1513          (NUMERAL
  1476            (NUMERAL_BIT1
  1514            (NUMERAL_BIT1
  1477              (NUMERAL_BIT1
  1515              (NUMERAL_BIT1
  1478                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1516                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))"
  1518              (NUMERAL_BIT1
  1556              (NUMERAL_BIT1
  1519                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))))
  1557                (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))))
  1520          (%(x::bool) y::bool. x ~= y) a b)"
  1558          (%(x::bool) y::bool. x ~= y) a b)"
  1521   by (import word32 EOR_EVAL2)
  1559   by (import word32 EOR_EVAL2)
  1522 
  1560 
  1523 lemma BITWISE_EVAL2: "(All::(nat => bool) => bool)
  1561 lemma BITWISE_EVAL2: "ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat.
  1524  (%n::nat.
  1562    BITWISE n oper x y =
  1525      (All::((bool => bool => bool) => bool) => bool)
  1563    (if n = 0 then 0
  1526       (%oper::bool => bool => bool.
  1564     else 2 * BITWISE (n - 1) oper (x div 2) (y div 2) +
  1527           (All::(nat => bool) => bool)
  1565          (if oper (ODD x) (ODD y) then 1 else 0))"
  1528            (%x::nat.
       
  1529                (All::(nat => bool) => bool)
       
  1530                 (%y::nat.
       
  1531                     (op =::nat => nat => bool)
       
  1532                      ((BITWISE::nat
       
  1533                                 => (bool => bool => bool)
       
  1534                                    => nat => nat => nat)
       
  1535                        n oper x y)
       
  1536                      ((If::bool => nat => nat => nat)
       
  1537                        ((op =::nat => nat => bool) n (0::nat)) (0::nat)
       
  1538                        ((op +::nat => nat => nat)
       
  1539                          ((op *::nat => nat => nat)
       
  1540                            ((number_of::bin => nat)
       
  1541                              ((op BIT::bin => bit => bin)
       
  1542                                ((op BIT::bin => bit => bin)
       
  1543                                  (Numeral.Pls::bin) (bit.B1::bit))
       
  1544                                (bit.B0::bit)))
       
  1545                            ((BITWISE::nat
       
  1546 => (bool => bool => bool) => nat => nat => nat)
       
  1547                              ((op -::nat => nat => nat) n (1::nat)) oper
       
  1548                              ((op div::nat => nat => nat) x
       
  1549                                ((number_of::bin => nat)
       
  1550                                  ((op BIT::bin => bit => bin)
       
  1551                                    ((op BIT::bin => bit => bin)
       
  1552                                      (Numeral.Pls::bin) (bit.B1::bit))
       
  1553                                    (bit.B0::bit))))
       
  1554                              ((op div::nat => nat => nat) y
       
  1555                                ((number_of::bin => nat)
       
  1556                                  ((op BIT::bin => bit => bin)
       
  1557                                    ((op BIT::bin => bit => bin)
       
  1558                                      (Numeral.Pls::bin) (bit.B1::bit))
       
  1559                                    (bit.B0::bit))))))
       
  1560                          ((If::bool => nat => nat => nat)
       
  1561                            (oper ((ODD::nat => bool) x)
       
  1562                              ((ODD::nat => bool) y))
       
  1563                            (1::nat) (0::nat))))))))"
       
  1564   by (import word32 BITWISE_EVAL2)
  1566   by (import word32 BITWISE_EVAL2)
  1565 
  1567 
  1566 lemma BITSwLT_THM: "ALL (h::nat) (l::nat) n::word32. BITSw h l n < (2::nat) ^ (Suc h - l)"
  1568 lemma BITSwLT_THM: "ALL (h::nat) (l::nat) n::word32. BITSw h l n < 2 ^ (Suc h - l)"
  1567   by (import word32 BITSwLT_THM)
  1569   by (import word32 BITSwLT_THM)
  1568 
  1570 
  1569 lemma BITSw_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::word32.
  1571 lemma BITSw_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::word32.
  1570    h2 + l1 <= h1 -->
  1572    h2 + l1 <= h1 -->
  1571    BITS h2 l2 (BITSw h1 l1 n) = BITSw (h2 + l1) (l2 + l1) n"
  1573    BITS h2 l2 (BITSw h1 l1 n) = BITSw (h2 + l1) (l2 + l1) n"
  1572   by (import word32 BITSw_COMP_THM)
  1574   by (import word32 BITSw_COMP_THM)
  1573 
  1575 
  1574 lemma BITSw_DIV_THM: "ALL (h::nat) (l::nat) (n::nat) x::word32.
  1576 lemma BITSw_DIV_THM: "ALL (h::nat) (l::nat) (n::nat) x::word32.
  1575    BITSw h l x div (2::nat) ^ n = BITSw h (l + n) x"
  1577    BITSw h l x div 2 ^ n = BITSw h (l + n) x"
  1576   by (import word32 BITSw_DIV_THM)
  1578   by (import word32 BITSw_DIV_THM)
  1577 
  1579 
  1578 lemma BITw_THM: "ALL (b::nat) n::word32. BITw b n = (BITSw b b n = (1::nat))"
  1580 lemma BITw_THM: "ALL (b::nat) n::word32. BITw b n = (BITSw b b n = 1)"
  1579   by (import word32 BITw_THM)
  1581   by (import word32 BITw_THM)
  1580 
  1582 
  1581 lemma SLICEw_THM: "ALL (n::word32) (h::nat) l::nat. SLICEw h l n = BITSw h l n * (2::nat) ^ l"
  1583 lemma SLICEw_THM: "ALL (n::word32) (h::nat) l::nat. SLICEw h l n = BITSw h l n * 2 ^ l"
  1582   by (import word32 SLICEw_THM)
  1584   by (import word32 SLICEw_THM)
  1583 
  1585 
  1584 lemma BITS_SLICEw_THM: "ALL (h::nat) (l::nat) n::word32. BITS h l (SLICEw h l n) = BITSw h l n"
  1586 lemma BITS_SLICEw_THM: "ALL (h::nat) (l::nat) n::word32. BITS h l (SLICEw h l n) = BITSw h l n"
  1585   by (import word32 BITS_SLICEw_THM)
  1587   by (import word32 BITS_SLICEw_THM)
  1586 
  1588 
  1587 lemma SLICEw_ZERO_THM: "ALL (n::word32) h::nat. SLICEw h (0::nat) n = BITSw h (0::nat) n"
  1589 lemma SLICEw_ZERO_THM: "ALL (n::word32) h::nat. SLICEw h 0 n = BITSw h 0 n"
  1588   by (import word32 SLICEw_ZERO_THM)
  1590   by (import word32 SLICEw_ZERO_THM)
  1589 
  1591 
  1590 lemma SLICEw_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) a::word32.
  1592 lemma SLICEw_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) a::word32.
  1591    Suc m <= h & l <= m --> SLICEw h (Suc m) a + SLICEw m l a = SLICEw h l a"
  1593    Suc m <= h & l <= m --> SLICEw h (Suc m) a + SLICEw m l a = SLICEw h l a"
  1592   by (import word32 SLICEw_COMP_THM)
  1594   by (import word32 SLICEw_COMP_THM)
  1593 
  1595 
  1594 lemma BITSw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> BITSw h l n = (0::nat)"
  1596 lemma BITSw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> BITSw h l n = 0"
  1595   by (import word32 BITSw_ZERO)
  1597   by (import word32 BITSw_ZERO)
  1596 
  1598 
  1597 lemma SLICEw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> SLICEw h l n = (0::nat)"
  1599 lemma SLICEw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> SLICEw h l n = 0"
  1598   by (import word32 SLICEw_ZERO)
  1600   by (import word32 SLICEw_ZERO)
  1599 
  1601 
  1600 ;end_setup
  1602 ;end_setup
  1601 
  1603 
  1602 end
  1604 end