Theory "words"

Parents     sum_num   ASCIInumbers   numeral_bit   fcp

Signature

Constant Type
BIT_SET :num -> num reln
BIT_SET_tupled :num # num -> num -> bool
INT_MAX :α itself -> num
INT_MIN :α itself -> num
UINT_MAX :α itself -> num
add_with_carry :α word # α word # bool -> α word # bool # bool
bit_count :α word -> num
bit_count_upto :num -> α word -> num
bit_field_insert :num -> num -> β word -> α word -> α word
concat_word_list :α word list -> β word
dimword :α itself -> num
l2w :num -> num list -> α word
n2w :num -> α word
n2w_itself :num # α itself -> α word
nzcv :α word -> α word -> bool # bool # bool # bool
reduce_and :α word -> word1
reduce_nand :α word -> word1
reduce_nor :α word -> word1
reduce_or :α word -> word1
reduce_xnor :α word -> word1
reduce_xor :α word -> word1
s2w :num -> (char -> num) -> string -> α word
saturate_add :α word -> α word -> α word
saturate_mul :α word -> α word -> α word
saturate_n2w :num -> α word
saturate_sub :α word -> α word -> α word
saturate_w2w :α word -> β word
sw2sw :α word -> β word
w2l :num -> α word -> num list
w2n :α word -> num
w2s :num -> (num -> char) -> α word -> string
w2w :α word -> β word
word_1comp :α word -> α word
word_2comp :α word -> α word
word_H :α word
word_L :α word
word_L2 :α word
word_T :α word
word_abs :α word -> α word
word_add :α word -> α word -> α word
word_and :α word -> α word -> α word
word_asr :α word -> num -> α word
word_asr_bv :α word -> α word -> α word
word_bit :num -> α word -> bool
word_bits :num -> num -> α word -> α word
word_compare :α word -> α word -> word1
word_concat :α word -> β word -> γ word
word_div :α word -> α word -> α word
word_extract :num -> num -> α word -> β word
word_from_bin_list :num list -> α word
word_from_bin_string :string -> α word
word_from_dec_list :num list -> α word
word_from_dec_string :string -> α word
word_from_hex_list :num list -> α word
word_from_hex_string :string -> α word
word_from_oct_list :num list -> α word
word_from_oct_string :string -> α word
word_ge :α word reln
word_gt :α word reln
word_hi :α word reln
word_hs :α word reln
word_join :α word -> β word -> (α + β) word
word_le :α word reln
word_len :α word -> num
word_lo :α word reln
word_log2 :α word -> α word
word_ls :α word reln
word_lsb :α word -> bool
word_lsl :α word -> num -> α word
word_lsl_bv :α word -> α word -> α word
word_lsr :α word -> num -> α word
word_lsr_bv :α word -> α word -> α word
word_lt :α word reln
word_max :α word -> α word -> α word
word_min :α word -> α word -> α word
word_mod :α word -> α word -> α word
word_modify :(num -> bool -> bool) -> α word -> α word
word_msb :α word -> bool
word_mul :α word -> α word -> α word
word_nand :α word -> α word -> α word
word_nor :α word -> α word -> α word
word_or :α word -> α word -> α word
word_reduce :bool reln -> α word -> word1
word_replicate :num -> α word -> β word
word_reverse :α word -> α word
word_rol :α word -> num -> α word
word_rol_bv :α word -> α word -> α word
word_ror :α word -> num -> α word
word_ror_bv :α word -> α word -> α word
word_rrx :bool # α word -> bool # α word
word_sdiv :α word -> α word -> α word
word_sign_extend :num -> α word -> α word
word_signed_bits :num -> num -> α word -> α word
word_slice :num -> num -> α word -> α word
word_smax :α word -> α word -> α word
word_smin :α word -> α word -> α word
word_smod :α word -> α word -> α word
word_srem :α word -> α word -> α word
word_sub :α word -> α word -> α word
word_to_bin_list :α word -> num list
word_to_bin_string :α word -> string
word_to_dec_list :α word -> num list
word_to_dec_string :α word -> string
word_to_hex_list :α word -> num list
word_to_hex_string :α word -> string
word_to_oct_list :α word -> num list
word_to_oct_string :α word -> string
word_xnor :α word -> α word -> α word
word_xor :α word -> α word -> α word

Definitions

dimword_def
|- dimword (:α) = 2 ** dimindex (:α)
INT_MIN_def
|- INT_MIN (:α) = 2 ** (dimindex (:α) − 1)
UINT_MAX_def
|- UINT_MAX (:α) = dimword (:α) − 1
INT_MAX_def
|- INT_MAX (:α) = INT_MIN (:α) − 1
w2n_def
|- ∀w. w2n w = SUM (dimindex (:α)) (λi. SBIT (w ' i) i)
n2w_def
|- ∀n. n2w n = FCP i. BIT i n
w2w_def
|- ∀w. w2w w = n2w (w2n w)
sw2sw_def
|- ∀w. sw2sw w = n2w (SIGN_EXTEND (dimindex (:α)) (dimindex (:β)) (w2n w))
w2l_def
|- ∀b w. w2l b w = n2l b (w2n w)
l2w_def
|- ∀b l. l2w b l = n2w (l2n b l)
w2s_def
|- ∀b f w. w2s b f w = n2s b f (w2n w)
s2w_def
|- ∀b f s. s2w b f s = n2w (s2n b f s)
word_from_bin_list_def
|- word_from_bin_list = l2w 2
word_from_oct_list_def
|- word_from_oct_list = l2w 8
word_from_dec_list_def
|- word_from_dec_list = l2w 10
word_from_hex_list_def
|- word_from_hex_list = l2w 16
word_to_bin_list_def
|- word_to_bin_list = w2l 2
word_to_oct_list_def
|- word_to_oct_list = w2l 8
word_to_dec_list_def
|- word_to_dec_list = w2l 10
word_to_hex_list_def
|- word_to_hex_list = w2l 16
word_from_bin_string_def
|- word_from_bin_string = s2w 2 UNHEX
word_from_oct_string_def
|- word_from_oct_string = s2w 8 UNHEX
word_from_dec_string_def
|- word_from_dec_string = s2w 10 UNHEX
word_from_hex_string_def
|- word_from_hex_string = s2w 16 UNHEX
word_to_bin_string_def
|- word_to_bin_string = w2s 2 HEX
word_to_oct_string_def
|- word_to_oct_string = w2s 8 HEX
word_to_dec_string_def
|- word_to_dec_string = w2s 10 HEX
word_to_hex_string_def
|- word_to_hex_string = w2s 16 HEX
word_T_def
|- UINT_MAXw = n2w (UINT_MAX (:α))
word_L_def
|- INT_MINw = n2w (INT_MIN (:α))
word_H_def
|- INT_MAXw = n2w (INT_MAX (:α))
word_1comp_def
|- ∀w. ¬w = FCP i. ¬w ' i
word_and_def
|- ∀v w. v && w = FCP i. v ' i ∧ w ' i
word_or_def
|- ∀v w. v ‖ w = FCP i. v ' i ∨ w ' i
word_xor_def
|- ∀v w. v ⊕ w = FCP i. v ' i ⇎ w ' i
word_nand_def
|- ∀v w. v ~&& w = FCP i. ¬(v ' i ∧ w ' i)
word_nor_def
|- ∀v w. v ~|| w = FCP i. ¬(v ' i ∨ w ' i)
word_xnor_def
|- ∀v w. v ~?? w = FCP i. v ' i ⇔ w ' i
word_reduce_def
|- ∀f w.
     word_reduce f w =
     $FCP
       (K
          (let l = GENLIST (λi. w ' (dimindex (:α) − 1 − i)) (dimindex (:α))
           in
             FOLDL f (HD l) (TL l)))
word_compare_def
|- ∀a b. word_compare a b = if a = b then 1w else 0w
reduce_and_def
|- reduce_and = word_reduce $/\
reduce_or_def
|- reduce_or = word_reduce $\/
reduce_xor_def
|- reduce_xor = word_reduce (λx y. x ⇎ y)
reduce_nand_def
|- reduce_nand = word_reduce (λa b. ¬(a ∧ b))
reduce_nor_def
|- reduce_nor = word_reduce (λa b. ¬(a ∨ b))
reduce_xnor_def
|- reduce_xnor = word_reduce $<=>
word_lsb_def
|- ∀w. word_lsb w ⇔ w ' 0
word_msb_def
|- ∀w. word_msb w ⇔ w ' (dimindex (:α) − 1)
word_slice_def
|- ∀h l. h '' l = (λw. FCP i. l ≤ i ∧ i ≤ MIN h (dimindex (:α) − 1) ∧ w ' i)
word_bits_def
|- ∀h l. h -- l = (λw. FCP i. i + l ≤ MIN h (dimindex (:α) − 1) ∧ w ' (i + l))
word_signed_bits_def
|- ∀h l.
     h --- l =
     (λw.
        FCP i.
          l ≤ MIN h (dimindex (:α) − 1) ∧
          w ' (MIN (i + l) (MIN h (dimindex (:α) − 1))))
word_extract_def
|- ∀h l. h >< l = w2w o (h -- l)
word_bit_def
|- ∀b w. word_bit b w ⇔ b ≤ dimindex (:α) − 1 ∧ w ' b
word_reverse_def
|- ∀w. word_reverse w = FCP i. w ' (dimindex (:α) − 1 − i)
word_modify_def
|- ∀f w. word_modify f w = FCP i. f i (w ' i)
BIT_SET_tupled_primitive_def
|- BIT_SET_tupled =
   WFREC
     (@R.
        WF R ∧ (∀i n. n ≠ 0 ∧ ODD n ⇒ R (SUC i,n DIV 2) (i,n)) ∧
        ∀i n. n ≠ 0 ∧ ¬ODD n ⇒ R (SUC i,n DIV 2) (i,n))
     (λBIT_SET_tupled a.
        case a of
          (i,n) =>
            I
              (if n = 0 then ∅
               else if ODD n then i INSERT BIT_SET_tupled (SUC i,n DIV 2)
               else BIT_SET_tupled (SUC i,n DIV 2)))
BIT_SET_curried_def
|- ∀x x1. BIT_SET x x1 = BIT_SET_tupled (x,x1)
bit_field_insert_def
|- ∀h l a.
     bit_field_insert h l a =
     word_modify (λi. COND (l ≤ i ∧ i ≤ h) (a ' (i − l)))
word_sign_extend_def
|- ∀n w. word_sign_extend n w = n2w (SIGN_EXTEND n (dimindex (:α)) (w2n w))
word_len_def
|- ∀w. word_len w = dimindex (:α)
bit_count_upto_def
|- ∀n w. bit_count_upto n w = SUM n (λi. if w ' i then 1 else 0)
bit_count_def
|- ∀w. bit_count w = bit_count_upto (dimindex (:α)) w
word_2comp_def
|- ∀w. -w = n2w (dimword (:α) − w2n w)
word_add_def
|- ∀v w. v + w = n2w (w2n v + w2n w)
word_mul_def
|- ∀v w. v * w = n2w (w2n v * w2n w)
word_log2_def
|- ∀w. word_log2 w = n2w (LOG2 (w2n w))
add_with_carry_def
|- ∀x y carry_in.
     add_with_carry (x,y,carry_in) =
     (let unsigned_sum = w2n x + w2n y + if carry_in then 1 else 0 in
      let result = n2w unsigned_sum in
      let carry_out = w2n result ≠ unsigned_sum and
          overflow =
            (word_msb x ⇔ word_msb y) ∧ (word_msb x ⇎ word_msb result)
      in
        (result,carry_out,overflow))
word_sub_def
|- ∀v w. v − w = v + -w
word_div_def
|- ∀v w. v // w = n2w (w2n v DIV w2n w)
word_sdiv_def
|- ∀a b.
     a / b =
     if word_msb a then if word_msb b then -a // -b else -(-a // b)
     else if word_msb b then -(a // -b)
     else a // b
word_mod_def
|- ∀v w. word_mod v w = n2w (w2n v MOD w2n w)
word_srem_def
|- ∀a b.
     word_srem a b =
     if word_msb a then
       if word_msb b then -word_mod (-a) (-b) else -word_mod (-a) b
     else if word_msb b then word_mod a (-b)
     else word_mod a b
word_smod_def
|- ∀s t.
     word_smod s t =
     (let abs_s = if word_msb s then -s else s and
          abs_t = if word_msb t then -t else t
      in
      let u = word_mod abs_s abs_t
      in
        if u = 0w then u
        else if word_msb s then if word_msb t then -u else -u + t
        else if word_msb t then u + t
        else u)
word_L2_def
|- INT_MINw2 = INT_MINw * INT_MINw
nzcv_def
|- ∀a b.
     nzcv a b =
     (let q = w2n a + w2n (-b) in
      let r = n2w q
      in
        (word_msb r,r = 0w,BIT (dimindex (:α)) q ∨ (b = 0w),
         (word_msb a ⇎ word_msb b) ∧ (word_msb r ⇎ word_msb a)))
word_lt_def
|- ∀a b. a < b ⇔ (let (n,z,c,v) = nzcv a b in n ⇎ v)
word_gt_def
|- ∀a b. a > b ⇔ (let (n,z,c,v) = nzcv a b in ¬z ∧ (n ⇔ v))
word_le_def
|- ∀a b. a ≤ b ⇔ (let (n,z,c,v) = nzcv a b in z ∨ (n ⇎ v))
word_ge_def
|- ∀a b. a ≥ b ⇔ (let (n,z,c,v) = nzcv a b in n ⇔ v)
word_ls_def
|- ∀a b. a ≤₊ b ⇔ (let (n,z,c,v) = nzcv a b in ¬c ∨ z)
word_hi_def
|- ∀a b. a >₊ b ⇔ (let (n,z,c,v) = nzcv a b in c ∧ ¬z)
word_lo_def
|- ∀a b. a <₊ b ⇔ (let (n,z,c,v) = nzcv a b in ¬c)
word_hs_def
|- ∀a b. a ≥₊ b ⇔ (let (n,z,c,v) = nzcv a b in c)
word_min_def
|- ∀a b. word_min a b = if a <₊ b then a else b
word_max_def
|- ∀a b. word_max a b = if a <₊ b then b else a
word_smin_def
|- ∀a b. word_smin a b = if a < b then a else b
word_smax_def
|- ∀a b. word_smax a b = if a < b then b else a
word_abs_def
|- ∀w. word_abs w = if w < 0w then -w else w
word_lsl_def
|- ∀w n. w ≪ n = FCP i. i < dimindex (:α) ∧ n ≤ i ∧ w ' (i − n)
word_lsr_def
|- ∀w n. w ⋙ n = FCP i. i + n < dimindex (:α) ∧ w ' (i + n)
word_asr_def
|- ∀w n.
     w ≫ n = FCP i. if dimindex (:α) ≤ i + n then word_msb w else w ' (i + n)
word_ror_def
|- ∀w n. w ⇄ n = FCP i. w ' ((i + n) MOD dimindex (:α))
word_rol_def
|- ∀w n. w ⇆ n = w ⇄ (dimindex (:α) − n MOD dimindex (:α))
word_rrx_def
|- ∀c w.
     word_rrx (c,w) =
     (word_lsb w,FCP i. if i = dimindex (:α) − 1 then c else (w ⋙ 1) ' i)
word_lsl_bv_def
|- ∀w n. w <<~ n = w ≪ w2n n
word_lsr_bv_def
|- ∀w n. w >>>~ n = w ⋙ w2n n
word_asr_bv_def
|- ∀w n. w >>~ n = w ≫ w2n n
word_ror_bv_def
|- ∀w n. w #>>~ n = w ⇄ w2n n
word_rol_bv_def
|- ∀w n. w #<<~ n = w ⇆ w2n n
word_join_def
|- ∀v w.
     word_join v w =
     (let cv = w2w v and cw = w2w w in cv ≪ dimindex (:β) ‖ cw)
word_concat_def
|- ∀v w. v @@ w = w2w (word_join v w)
word_replicate_def
|- ∀n w.
     word_replicate n w =
     FCP i. i < n * dimindex (:α) ∧ w ' (i MOD dimindex (:α))
concat_word_list_def
|- (concat_word_list [] = 0w) ∧
   ∀h t. concat_word_list (h::t) = w2w h ‖ concat_word_list t ≪ dimindex (:α)
saturate_n2w_def
|- ∀n. saturate_n2w n = if dimword (:α) ≤ n then UINT_MAXw else n2w n
saturate_w2w_def
|- ∀w. saturate_w2w w = saturate_n2w (w2n w)
saturate_add_def
|- ∀a b. saturate_add a b = saturate_n2w (w2n a + w2n b)
saturate_sub_def
|- ∀a b. saturate_sub a b = n2w (w2n a − w2n b)
saturate_mul_def
|- ∀a b. saturate_mul a b = saturate_n2w (w2n a * w2n b)
n2w_itself_primitive_def
|- n2w_itself =
   WFREC (@R. WF R) (λn2w_itself a. case a of (n,v1) => I (n2w n))


Theorems

BIT_SET_ind
|- ∀P.
     (∀i n.
        (n ≠ 0 ∧ ODD n ⇒ P (SUC i) (n DIV 2)) ∧
        (n ≠ 0 ∧ ¬ODD n ⇒ P (SUC i) (n DIV 2)) ⇒
        P i n) ⇒
     ∀v v1. P v v1
BIT_SET_def
|- ∀n i.
     BIT_SET i n =
     if n = 0 then ∅
     else if ODD n then i INSERT BIT_SET (SUC i) (n DIV 2)
     else BIT_SET (SUC i) (n DIV 2)
ZERO_LT_dimword
|- 0 < dimword (:α)
dimword_IS_TWICE_INT_MIN
|- dimword (:α) = 2 * INT_MIN (:α)
dimword_sub_int_min
|- dimword (:α) − INT_MIN (:α) = INT_MIN (:α)
DIMINDEX_GT_0
|- 0 < dimindex (:α)
ONE_LT_dimword
|- 1 < dimword (:α)
EXISTS_HB
|- ∃m. dimindex (:α) = SUC m
MOD_DIMINDEX
|- ∀n. n MOD dimword (:α) = BITS (dimindex (:α) − 1) 0 n
BITS_ZEROL_DIMINDEX
|- ∀n. n < dimword (:α) ⇒ (BITS (dimindex (:α) − 1) 0 n = n)
MOD_2EXP_DIMINDEX
|- ∀n. n MOD dimword (:α) = MOD_2EXP (dimindex (:α)) n
INT_MIN_SUM
|- INT_MIN (:α + β) =
   if FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) then dimword (:α) * INT_MIN (:β)
   else INT_MIN (:α + β)
ZERO_LT_INT_MIN
|- 0 < INT_MIN (:α)
ZERO_LT_INT_MAX
|- 1 < dimindex (:α) ⇒ 0 < INT_MAX (:α)
ZERO_LE_INT_MAX
|- 0 ≤ INT_MAX (:α)
ZERO_LT_UINT_MAX
|- 0 < UINT_MAX (:α)
INT_MIN_LT_DIMWORD
|- INT_MIN (:α) < dimword (:α)
INT_MAX_LT_DIMWORD
|- INT_MAX (:α) < dimword (:α)
dimindex_lt_dimword
|- dimindex (:α) < dimword (:α)
BOUND_ORDER
|- INT_MAX (:α) < INT_MIN (:α) ∧ INT_MIN (:α) ≤ UINT_MAX (:α) ∧
   UINT_MAX (:α) < dimword (:α)
dimindex_dimword_iso
|- (dimindex (:α) = dimindex (:β)) ⇔ (dimword (:α) = dimword (:β))
dimindex_dimword_le_iso
|- dimindex (:α) ≤ dimindex (:β) ⇔ dimword (:α) ≤ dimword (:β)
dimindex_dimword_lt_iso
|- dimindex (:α) < dimindex (:β) ⇔ dimword (:α) < dimword (:β)
dimindex_int_min_iso
|- (dimindex (:α) = dimindex (:β)) ⇔ (INT_MIN (:α) = INT_MIN (:β))
dimindex_int_min_le_iso
|- dimindex (:α) ≤ dimindex (:β) ⇔ INT_MIN (:α) ≤ INT_MIN (:β)
dimindex_int_min_lt_iso
|- dimindex (:α) < dimindex (:β) ⇔ INT_MIN (:α) < INT_MIN (:β)
dimindex_int_max_iso
|- (dimindex (:α) = dimindex (:β)) ⇔ (INT_MAX (:α) = INT_MAX (:β))
dimindex_int_max_le_iso
|- dimindex (:α) ≤ dimindex (:β) ⇔ INT_MAX (:α) ≤ INT_MAX (:β)
dimindex_int_max_lt_iso
|- dimindex (:α) < dimindex (:β) ⇔ INT_MAX (:α) < INT_MAX (:β)
dimindex_uint_max_iso
|- (dimindex (:α) = dimindex (:β)) ⇔ (UINT_MAX (:α) = UINT_MAX (:β))
dimindex_uint_max_le_iso
|- dimindex (:α) ≤ dimindex (:β) ⇔ UINT_MAX (:α) ≤ UINT_MAX (:β)
dimindex_uint_max_lt_iso
|- dimindex (:α) < dimindex (:β) ⇔ UINT_MAX (:α) < UINT_MAX (:β)
w2n_n2w
|- ∀n. w2n (n2w n) = n MOD dimword (:α)
n2w_w2n
|- ∀w. n2w (w2n w) = w
word_nchotomy
|- ∀w. ∃n. w = n2w n
n2w_mod
|- ∀n. n2w (n MOD dimword (:α)) = n2w n
n2w_11
|- ∀m n. (n2w m = n2w n) ⇔ (m MOD dimword (:α) = n MOD dimword (:α))
ranged_word_nchotomy
|- ∀w. ∃n. (w = n2w n) ∧ n < dimword (:α)
dimindex_1_cases
|- ∀a. (dimindex (:α) = 1) ⇒ (a = 0w) ∨ (a = 1w)
mod_dimindex
|- ∀n. n MOD dimindex (:α) < dimword (:α)
WORD_INDUCT
|- ∀P.
     P 0w ∧ (∀n. SUC n < dimword (:α) ⇒ P (n2w n) ⇒ P (n2w (SUC n))) ⇒ ∀x. P x
w2n_11
|- ∀v w. (w2n v = w2n w) ⇔ (v = w)
w2n_lt
|- ∀w. w2n w < dimword (:α)
word_0_n2w
|- w2n 0w = 0
word_1_n2w
|- w2n 1w = 1
w2n_eq_0
|- ∀w. (w2n w = 0) ⇔ (w = 0w)
n2w_dimword
|- n2w (dimword (:α)) = 0w
word_2comp_dimindex_1
|- ∀w. (dimindex (:α) = 1) ⇒ (-w = w)
word_add_n2w
|- ∀m n. n2w m + n2w n = n2w (m + n)
word_mul_n2w
|- ∀m n. n2w m * n2w n = n2w (m * n)
word_log2_n2w
|- ∀n. word_log2 (n2w n) = n2w (LOG2 (n MOD dimword (:α)))
word_1comp_n2w
|- ∀n. ¬n2w n = n2w (dimword (:α) − 1 − n MOD dimword (:α))
word_2comp_n2w
|- ∀n. -n2w n = n2w (dimword (:α) − n MOD dimword (:α))
word_lsb
|- word_lsb = word_bit 0
word_msb
|- word_msb = word_bit (dimindex (:α) − 1)
word_lsb_n2w
|- ∀n. word_lsb (n2w n) ⇔ ODD n
word_msb_n2w
|- ∀n. word_msb (n2w n) ⇔ BIT (dimindex (:α) − 1) n
word_msb_n2w_numeric
|- word_msb (n2w n) ⇔ INT_MIN (:α) ≤ n MOD dimword (:α)
word_and_n2w
|- ∀n m. n2w n && n2w m = n2w (BITWISE (dimindex (:α)) $/\ n m)
word_or_n2w
|- ∀n m. n2w n ‖ n2w m = n2w (BITWISE (dimindex (:α)) $\/ n m)
word_xor_n2w
|- ∀n m. n2w n ⊕ n2w m = n2w (BITWISE (dimindex (:α)) (λx y. x ⇎ y) n m)
word_nand_n2w
|- ∀n m. n2w n ~&& n2w m = n2w (BITWISE (dimindex (:α)) (λx y. ¬(x ∧ y)) n m)
word_nor_n2w
|- ∀n m. n2w n ~|| n2w m = n2w (BITWISE (dimindex (:α)) (λx y. ¬(x ∨ y)) n m)
word_xnor_n2w
|- ∀n m. n2w n ~?? n2w m = n2w (BITWISE (dimindex (:α)) $<=> n m)
l2w_w2l
|- ∀b w. 1 < b ⇒ (l2w b (w2l b w) = w)
w2l_l2w
|- ∀b l. w2l b (l2w b l) = n2l b (l2n b l MOD dimword (:α))
s2w_w2s
|- ∀c2n n2c b w.
     1 < b ∧ (∀x. x < b ⇒ (c2n (n2c x) = x)) ⇒ (s2w b c2n (w2s b n2c w) = w)
w2s_s2w
|- ∀b c2n n2c s.
     w2s b n2c (s2w b c2n s) = n2s b n2c (s2n b c2n s MOD dimword (:α))
NUMERAL_LESS_THM
|- (∀m n.
      m < NUMERAL (BIT1 n) ⇔
      (m = NUMERAL (BIT1 n) − 1) ∨ m < NUMERAL (BIT1 n) − 1) ∧
   ∀m n. m < NUMERAL (BIT2 n) ⇔ (m = NUMERAL (BIT1 n)) ∨ m < NUMERAL (BIT1 n)
word_bin_list
|- word_from_bin_list o word_to_bin_list = I
word_oct_list
|- word_from_oct_list o word_to_oct_list = I
word_dec_list
|- word_from_dec_list o word_to_dec_list = I
word_hex_list
|- word_from_hex_list o word_to_hex_list = I
word_bin_string
|- word_from_bin_string o word_to_bin_string = I
word_oct_string
|- word_from_oct_string o word_to_oct_string = I
word_dec_string
|- word_from_dec_string o word_to_dec_string = I
word_hex_string
|- word_from_hex_string o word_to_hex_string = I
word_0
|- ∀i. i < dimindex (:α) ⇒ ¬0w ' i
word_eq_0
|- ∀w. (w = 0w) ⇔ ∀i. i < dimindex (:α) ⇒ ¬w ' i
word_T
|- ∀i. i < dimindex (:α) ⇒ UINT_MAXw ' i
FCP_T_F
|- ($FCP (K T) = UINT_MAXw) ∧ ($FCP (K F) = 0w)
word_L
|- ∀n. n < dimindex (:α) ⇒ (INT_MINw ' n ⇔ (n = dimindex (:α) − 1))
word_H
|- ∀n. n < dimindex (:α) ⇒ (INT_MAXw ' n ⇔ n < dimindex (:α) − 1)
word_L2
|- INT_MINw2 = if 1 < dimindex (:α) then 0w else INT_MINw
WORD_NEG_1
|- -1w = UINT_MAXw
WORD_NEG_1_T
|- ∀i. i < dimindex (:α) ⇒ (-1w) ' i
WORD_MSB_1COMP
|- ∀w. word_msb (¬w) ⇔ ¬word_msb w
w2n_minus1
|- w2n (-1w) = dimword (:α) − 1
WORD_NOT_NOT
|- ∀a. ¬ ¬a = a
WORD_DE_MORGAN_THM
|- ∀a b. (¬(a && b) = ¬a ‖ ¬b) ∧ (¬(a ‖ b) = ¬a && ¬b)
WORD_NOT_XOR
|- ∀a b. (¬a ⊕ ¬b = a ⊕ b) ∧ (a ⊕ ¬b = ¬(a ⊕ b)) ∧ (¬a ⊕ b = ¬(a ⊕ b))
WORD_AND_CLAUSES
|- ∀a.
     (UINT_MAXw && a = a) ∧ (a && UINT_MAXw = a) ∧ (0w && a = 0w) ∧
     (a && 0w = 0w) ∧ (a && a = a)
WORD_OR_CLAUSES
|- ∀a.
     (UINT_MAXw ‖ a = UINT_MAXw) ∧ (a ‖ UINT_MAXw = UINT_MAXw) ∧
     (0w ‖ a = a) ∧ (a ‖ 0w = a) ∧ (a ‖ a = a)
WORD_XOR_CLAUSES
|- ∀a.
     (UINT_MAXw ⊕ a = ¬a) ∧ (a ⊕ UINT_MAXw = ¬a) ∧ (0w ⊕ a = a) ∧
     (a ⊕ 0w = a) ∧ (a ⊕ a = 0w)
WORD_AND_ASSOC
|- ∀a b c. (a && b) && c = a && b && c
WORD_OR_ASSOC
|- ∀a b c. (a ‖ b) ‖ c = a ‖ b ‖ c
WORD_XOR_ASSOC
|- ∀a b c. (a ⊕ b) ⊕ c = a ⊕ b ⊕ c
WORD_AND_COMM
|- ∀a b. a && b = b && a
WORD_OR_COMM
|- ∀a b. a ‖ b = b ‖ a
WORD_XOR_COMM
|- ∀a b. a ⊕ b = b ⊕ a
WORD_AND_IDEM
|- ∀a. a && a = a
WORD_OR_IDEM
|- ∀a. a ‖ a = a
WORD_AND_ABSORD
|- ∀a b. a ‖ a && b = a
WORD_OR_ABSORB
|- ∀a b. a && (a ‖ b) = a
WORD_AND_COMP
|- ∀a. a && ¬a = 0w
WORD_OR_COMP
|- ∀a. a ‖ ¬a = UINT_MAXw
WORD_XOR_COMP
|- ∀a. a ⊕ ¬a = UINT_MAXw
WORD_RIGHT_AND_OVER_OR
|- ∀a b c. (a ‖ b) && c = a && c ‖ b && c
WORD_RIGHT_OR_OVER_AND
|- ∀a b c. a && b ‖ c = (a ‖ c) && (b ‖ c)
WORD_RIGHT_AND_OVER_XOR
|- ∀a b c. (a ⊕ b) && c = a && c ⊕ b && c
WORD_LEFT_AND_OVER_OR
|- ∀a b c. a && (b ‖ c) = a && b ‖ a && c
WORD_LEFT_OR_OVER_AND
|- ∀a b c. a ‖ b && c = (a ‖ b) && (a ‖ c)
WORD_LEFT_AND_OVER_XOR
|- ∀a b c. a && (b ⊕ c) = a && b ⊕ a && c
WORD_XOR
|- ∀a b. a ⊕ b = a && ¬b ‖ b && ¬a
WORD_NAND_NOT_AND
|- ∀a b. a ~&& b = ¬(a && b)
WORD_NOR_NOT_OR
|- ∀a b. a ~|| b = ¬(a ‖ b)
WORD_XNOR_NOT_XOR
|- ∀a b. a ~?? b = ¬(a ⊕ b)
WORD_ADD_OR
|- ∀a b. (a && b = 0w) ⇒ (a + b = a ‖ b)
WORD_ADD_XOR
|- ∀a b. (a && b = 0w) ⇒ (a + b = a ⊕ b)
WORD_AND_EXP_SUB1
|- ∀m n. n2w n && n2w (2 ** m − 1) = n2w (n MOD 2 ** m)
w2w
|- ∀w i. i < dimindex (:β) ⇒ (w2w w ' i ⇔ i < dimindex (:α) ∧ w ' i)
sw2sw
|- ∀w i.
     i < dimindex (:β) ⇒
     (sw2sw w ' i ⇔
      if i < dimindex (:α) ∨ dimindex (:β) < dimindex (:α) then w ' i
      else word_msb w)
w2w_id
|- ∀w. w2w w = w
sw2sw_id
|- ∀w. sw2sw w = w
w2w_w2w
|- ∀w. w2w (w2w w) = w2w ((dimindex (:β) − 1 -- 0) w)
sw2sw_sw2sw
|- ∀w.
     sw2sw (sw2sw w) =
     if dimindex (:β) < dimindex (:α) ∧ dimindex (:β) < dimindex (:γ) then
       sw2sw (w2w w)
     else sw2sw w
sw2sw_w2w
|- ∀w. sw2sw w = (if word_msb w then -1w ≪ dimindex (:α) else 0w) ‖ w2w w
word_bit
|- ∀w b. b < dimindex (:α) ⇒ (w ' b ⇔ word_bit b w)
word_slice_n2w
|- ∀h l n. (h '' l) (n2w n) = n2w (SLICE (MIN h (dimindex (:α) − 1)) l n)
word_bits_n2w
|- ∀h l n. (h -- l) (n2w n) = n2w (BITS (MIN h (dimindex (:α) − 1)) l n)
word_bit_n2w
|- ∀b n. word_bit b (n2w n) ⇔ b ≤ dimindex (:α) − 1 ∧ BIT b n
word_signed_bits_n2w
|- ∀h l n.
     (h --- l) (n2w n) =
     n2w
       (SIGN_EXTEND (MIN (SUC h) (dimindex (:α)) − l) (dimindex (:α))
          (BITS (MIN h (dimindex (:α) − 1)) l n))
word_sign_extend_bits
|- ∀h l w.
     (h --- l) w =
     word_sign_extend (MIN (SUC h) (dimindex (:α)) − l) ((h -- l) w)
word_index_n2w
|- ∀n i.
     n2w n ' i ⇔
     if i < dimindex (:α) then BIT i n else FAIL $' index too large (n2w n) i
word_index
|- ∀n i. i < dimindex (:α) ⇒ (n2w n ' i ⇔ BIT i n)
word_bits_w2w
|- ∀w h l. (h -- l) (w2w w) = w2w ((MIN h (dimindex (:β) − 1) -- l) w)
word_reverse_n2w
|- ∀n. word_reverse (n2w n) = n2w (BIT_REVERSE (dimindex (:α)) n)
word_modify_n2w
|- ∀f n. word_modify f (n2w n) = n2w (BIT_MODIFY (dimindex (:α)) f n)
fcp_n2w
|- ∀f. $FCP f = word_modify (λi b. f i) 0w
w2n_w2w
|- ∀w.
     w2n (w2w w) =
     if dimindex (:α) ≤ dimindex (:β) then w2n w
     else w2n ((dimindex (:β) − 1 -- 0) w)
w2n_w2w_le
|- ∀w. w2n (w2w w) ≤ w2n w
w2w_lt
|- ∀w. w2n (w2w w) < dimword (:α)
w2w_n2w
|- ∀n.
     w2w (n2w n) =
     if dimindex (:β) ≤ dimindex (:α) then n2w n
     else n2w (BITS (dimindex (:α) − 1) 0 n)
w2w_0
|- w2w 0w = 0w
w2n_11_lift
|- ∀a b.
     dimindex (:α) ≤ dimindex (:γ) ∧ dimindex (:β) ≤ dimindex (:γ) ⇒
     ((w2n a = w2n b) ⇔ (w2w a = w2w b))
word_extract_n2w
|- (h >< l) (n2w n) =
   if dimindex (:β) ≤ dimindex (:α) then
     n2w (BITS (MIN h (dimindex (:α) − 1)) l n)
   else
     n2w (BITS (MIN (MIN h (dimindex (:α) − 1)) (dimindex (:α) − 1 + l)) l n)
n2w_BITS
|- ∀h l n. h < dimindex (:α) ⇒ (n2w (BITS h l n) = (h -- l) (n2w n))
word_extract_w2w
|- ∀w h l. dimindex (:α) ≤ dimindex (:β) ⇒ ((h >< l) (w2w w) = (h >< l) w)
WORD_w2w_EXTRACT
|- ∀w. w2w w = (dimindex (:α) − 1 >< 0) w
WORD_EQ
|- ∀v w. (∀x. x < dimindex (:α) ⇒ (word_bit x v ⇔ word_bit x w)) ⇔ (v = w)
BIT_UPDATE
|- ∀n x. n :+ x = word_modify (λi b. if i = n then x else b)
WORD_MODIFY_BIT
|- ∀f w i. i < dimindex (:α) ⇒ (word_modify f w ' i ⇔ f i (w ' i))
WORD_BIT_BITS
|- ∀b w. word_bit b w ⇔ ((b -- b) w = 1w)
WORD_BITS_COMP_THM
|- ∀h1 l1 h2 l2 w. (h2 -- l2) ((h1 -- l1) w) = (MIN h1 (h2 + l1) -- l2 + l1) w
WORD_BITS_EXTRACT
|- ∀h l w. (h -- l) w = (h >< l) w
WORD_BITS_LSR
|- ∀h l w n. (h -- l) w ⋙ n = (h -- l + n) w
WORD_BITS_ZERO
|- ∀h l w. h < l ⇒ ((h -- l) w = 0w)
WORD_BITS_ZERO2
|- ∀h l. (h -- l) 0w = 0w
WORD_BITS_ZERO3
|- ∀h l w. dimindex (:α) ≤ l ⇒ ((h -- l) w = 0w)
WORD_BITS_LT
|- ∀h l w. w2n ((h -- l) w) < 2 ** (SUC h − l)
WORD_EXTRACT_LT
|- ∀h l w. w2n ((h >< l) w) < 2 ** (SUC h − l)
WORD_EXTRACT_ZERO
|- ∀h l w. h < l ⇒ ((h >< l) w = 0w)
WORD_EXTRACT_ZERO2
|- ∀h l. (h >< l) 0w = 0w
WORD_EXTRACT_ZERO3
|- ∀h l w. dimindex (:α) ≤ l ⇒ ((h >< l) w = 0w)
WORD_SLICE_THM
|- ∀h l w. (h '' l) w = (h -- l) w ≪ l
WORD_SLICE_ZERO
|- ∀h l w. h < l ⇒ ((h '' l) w = 0w)
WORD_SLICE_ZERO2
|- ∀l h. (h '' l) 0w = 0w
WORD_SLICE_BITS_THM
|- ∀h w. (h '' 0) w = (h -- 0) w
WORD_BITS_SLICE_THM
|- ∀h l w. (h -- l) ((h '' l) w) = (h -- l) w
WORD_SLICE_COMP_THM
|- ∀h m' m l w.
     l ≤ m ∧ (m' = m + 1) ∧ m < h ⇒ ((h '' m') w ‖ (m '' l) w = (h '' l) w)
WORD_EXTRACT_COMP_THM
|- ∀w h l m n.
     (h >< l) ((m >< n) w) =
     (MIN m (MIN (h + n) (MIN (dimindex (:γ) − 1) (dimindex (:β) + n − 1))) ><
      l + n) w
WORD_EXTRACT_BITS_COMP
|- ∀n l k j h. (j >< k) ((h -- l) n) = (MIN h (j + l) >< k + l) n
WORD_ALL_BITS
|- ∀w h. dimindex (:α) − 1 ≤ h ⇒ ((h -- 0) w = w)
EXTRACT_ALL_BITS
|- ∀h w. dimindex (:α) − 1 ≤ h ⇒ ((h >< 0) w = w2w w)
WORD_BITS_MIN_HIGH
|- ∀w h l. dimindex (:α) − 1 < h ⇒ ((h -- l) w = (dimindex (:α) − 1 -- l) w)
WORD_EXTRACT_MIN_HIGH
|- (∀h l w.
      dimindex (:α) ≤ dimindex (:β) + l ∧ dimindex (:α) ≤ h ⇒
      ((h >< l) w = (dimindex (:α) − 1 >< l) w)) ∧
   ∀h l w.
     dimindex (:β) + l < dimindex (:α) ∧ dimindex (:β) + l ≤ h ⇒
     ((h >< l) w = (dimindex (:β) + l − 1 >< l) w)
CONCAT_EXTRACT
|- ∀h m l w.
     (h − m = dimindex (:β)) ∧ (m + 1 − l = dimindex (:γ)) ∧
     (h + 1 − l = dimindex (:δ)) ∧ dimindex (:β + γ) ≠ 1 ⇒
     ((h >< m + 1) w @@ (m >< l) w = (h >< l) w)
EXTRACT_CONCAT
|- ∀v w.
     FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) ∧
     dimindex (:α) + dimindex (:β) ≤ dimindex (:γ) ⇒
     ((dimindex (:β) − 1 >< 0) (v @@ w) = w) ∧
     ((dimindex (:α) + dimindex (:β) − 1 >< dimindex (:β)) (v @@ w) = v)
EXTRACT_JOIN
|- ∀h m m' l s w.
     l ≤ m ∧ m' ≤ h ∧ (m' = m + 1) ∧ (s = m' − l) ⇒
     ((h >< m') w ≪ s ‖ (m >< l) w =
      (MIN h (MIN (dimindex (:β) + l − 1) (dimindex (:α) − 1)) >< l) w)
EXTRACT_JOIN_ADD
|- ∀h m m' l s w.
     l ≤ m ∧ m' ≤ h ∧ (m' = m + 1) ∧ (s = m' − l) ⇒
     ((h >< m') w ≪ s + (m >< l) w =
      (MIN h (MIN (dimindex (:β) + l − 1) (dimindex (:α) − 1)) >< l) w)
EXTEND_EXTRACT
|- ∀h l w. (dimindex (:γ) = h + 1 − l) ⇒ ((h >< l) w = w2w ((h >< l) w))
WORD_SLICE_OVER_BITWISE
|- (∀h l v w. (h '' l) v && (h '' l) w = (h '' l) (v && w)) ∧
   (∀h l v w. (h '' l) v ‖ (h '' l) w = (h '' l) (v ‖ w)) ∧
   ∀h l v w. (h '' l) v ⊕ (h '' l) w = (h '' l) (v ⊕ w)
WORD_BITS_OVER_BITWISE
|- (∀h l v w. (h -- l) v && (h -- l) w = (h -- l) (v && w)) ∧
   (∀h l v w. (h -- l) v ‖ (h -- l) w = (h -- l) (v ‖ w)) ∧
   ∀h l v w. (h -- l) v ⊕ (h -- l) w = (h -- l) (v ⊕ w)
WORD_w2w_OVER_BITWISE
|- (∀v w. w2w v && w2w w = w2w (v && w)) ∧
   (∀v w. w2w v ‖ w2w w = w2w (v ‖ w)) ∧ ∀v w. w2w v ⊕ w2w w = w2w (v ⊕ w)
WORD_EXTRACT_OVER_BITWISE
|- (∀h l v w. (h >< l) v && (h >< l) w = (h >< l) (v && w)) ∧
   (∀h l v w. (h >< l) v ‖ (h >< l) w = (h >< l) (v ‖ w)) ∧
   ∀h l v w. (h >< l) v ⊕ (h >< l) w = (h >< l) (v ⊕ w)
WORD_w2w_OVER_ADD
|- ∀a b. w2w (a + b) = (dimindex (:α) − 1 -- 0) (w2w a + w2w b)
WORD_w2w_OVER_MUL
|- ∀a b. w2w (a * b) = (dimindex (:α) − 1 -- 0) (w2w a * w2w b)
WORD_EXTRACT_OVER_ADD
|- ∀a b h.
     dimindex (:β) − 1 ≤ h ∧ dimindex (:β) ≤ dimindex (:α) ⇒
     ((h >< 0) (a + b) = (h >< 0) a + (h >< 0) b)
WORD_EXTRACT_OVER_MUL
|- ∀a b h.
     dimindex (:β) − 1 ≤ h ∧ dimindex (:β) ≤ dimindex (:α) ⇒
     ((h >< 0) (a * b) = (h >< 0) a * (h >< 0) b)
WORD_EXTRACT_OVER_ADD2
|- ∀a b h.
     h < dimindex (:α) ⇒
     ((h >< 0) ((h >< 0) a + (h >< 0) b) = (h >< 0) (a + b))
WORD_EXTRACT_OVER_MUL2
|- ∀a b h.
     h < dimindex (:α) ⇒
     ((h >< 0) ((h >< 0) a * (h >< 0) b) = (h >< 0) (a * b))
WORD_EXTRACT_ID
|- ∀w h. w2n w < 2 ** SUC h ⇒ ((h >< 0) w = w)
BIT_SET
|- ∀i n. BIT i n ⇔ i ∈ BIT_SET 0 n
WORD_LITERAL_AND
|- (∀n m.
      n2w n && n2w m = n2w (BITWISE (SUC (MIN (LOG2 n) (LOG2 m))) $/\ n m)) ∧
   (∀n m. n2w n && ¬n2w m = n2w (BITWISE (SUC (LOG2 n)) (λa b. a ∧ ¬b) n m)) ∧
   (∀n m. ¬n2w m && n2w n = n2w (BITWISE (SUC (LOG2 n)) (λa b. a ∧ ¬b) n m)) ∧
   ∀n m.
     ¬n2w n && ¬n2w m = ¬n2w (BITWISE (SUC (MAX (LOG2 n) (LOG2 m))) $\/ n m)
WORD_LITERAL_OR
|- (∀n m.
      n2w n ‖ n2w m = n2w (BITWISE (SUC (MAX (LOG2 n) (LOG2 m))) $\/ n m)) ∧
   (∀n m. n2w n ‖ ¬n2w m = ¬n2w (BITWISE (SUC (LOG2 m)) (λa b. a ∧ ¬b) m n)) ∧
   (∀n m. ¬n2w m ‖ n2w n = ¬n2w (BITWISE (SUC (LOG2 m)) (λa b. a ∧ ¬b) m n)) ∧
   ∀n m.
     ¬n2w n ‖ ¬n2w m = ¬n2w (BITWISE (SUC (MIN (LOG2 n) (LOG2 m))) $/\ n m)
WORD_LITERAL_XOR
|- ∀n m.
     n2w n ⊕ n2w m =
     n2w (BITWISE (SUC (MAX (LOG2 n) (LOG2 m))) (λx y. x ⇎ y) n m)
word_replicate_concat_word_list
|- ∀n w. word_replicate n w = concat_word_list (GENLIST (K w) n)
bit_field_insert
|- ∀h l a b.
     h < l + dimindex (:α) ⇒
     (bit_field_insert h l a b =
      (let mask = (h '' l) (-1w) in w2w a ≪ l && mask ‖ b && ¬mask))
word_join_index
|- ∀i a b.
     FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) ∧ i < dimindex (:α + β) ⇒
     (word_join a b ' i ⇔
      if i < dimindex (:β) then b ' i else a ' (i − dimindex (:β)))
foldl_reduce_and
|- ∀w.
     reduce_and w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $&& (HD l) (TL l))
foldl_reduce_or
|- ∀w.
     reduce_or w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $|| (HD l) (TL l))
foldl_reduce_xor
|- ∀w.
     reduce_xor w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $?? (HD l) (TL l))
foldl_reduce_nand
|- ∀w.
     reduce_nand w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $~&& (HD l) (TL l))
foldl_reduce_nor
|- ∀w.
     reduce_nor w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $~|| (HD l) (TL l))
foldl_reduce_xnor
|- ∀w.
     reduce_xnor w =
     (let l =
            GENLIST (λi. (let n = dimindex (:α) − 1 − i in (n >< n) w))
              (dimindex (:α))
      in
        FOLDL $~?? (HD l) (TL l))
LOG2_w2n_lt
|- ∀w. w ≠ 0w ⇒ LOG2 (w2n w) < dimindex (:α)
LOG2_w2n
|- ∀w.
     w ≠ 0w ⇒
     (LOG2 (w2n w) = dimindex (:α) − 1 − LEAST i. w ' (dimindex (:α) − 1 − i))
LEAST_BIT_LT
|- ∀w. w ≠ 0w ⇒ (LEAST i. w ' i) < dimindex (:α)
word_reduce_n2w
|- ∀n f.
     word_reduce f (n2w n) =
     $FCP (K (let l = BOOLIFY (dimindex (:α)) n [] in FOLDL f (HD l) (TL l)))
NOT_UINTMAXw
|- ∀w. w ≠ UINT_MAXw ⇒ ∃i. i < dimindex (:α) ∧ ¬w ' i
NOT_0w
|- ∀w. w ≠ 0w ⇒ ∃i. i < dimindex (:α) ∧ w ' i
reduce_and
|- ∀w. reduce_and w = if w = UINT_MAXw then 1w else 0w
reduce_or
|- ∀w. reduce_or w = if w = 0w then 0w else 1w
WORD_ADD_0
|- (∀w. w + 0w = w) ∧ ∀w. 0w + w = w
WORD_ADD_ASSOC
|- ∀v w x. v + (w + x) = v + w + x
WORD_MULT_ASSOC
|- ∀v w x. v * (w * x) = v * w * x
WORD_ADD_COMM
|- ∀v w. v + w = w + v
WORD_MULT_COMM
|- ∀v w. v * w = w * v
WORD_MULT_CLAUSES
|- ∀v w.
     (0w * v = 0w) ∧ (v * 0w = 0w) ∧ (1w * v = v) ∧ (v * 1w = v) ∧
     ((v + 1w) * w = v * w + w) ∧ (v * (w + 1w) = v + v * w)
WORD_LEFT_ADD_DISTRIB
|- ∀v w x. v * (w + x) = v * w + v * x
WORD_RIGHT_ADD_DISTRIB
|- ∀v w x. (v + w) * x = v * x + w * x
WORD_ADD_SUB_ASSOC
|- ∀v w x. v + w − x = v + (w − x)
WORD_ADD_SUB_SYM
|- ∀v w x. v + w − x = v − x + w
WORD_ADD_LINV
|- ∀w. -w + w = 0w
WORD_ADD_RINV
|- ∀w. w + -w = 0w
WORD_SUB_REFL
|- ∀w. w − w = 0w
WORD_SUB_ADD2
|- ∀v w. v + (w − v) = w
WORD_ADD_SUB
|- ∀v w. v + w − w = v
WORD_SUB_ADD
|- ∀v w. v − w + w = v
WORD_ADD_EQ_SUB
|- ∀v w x. (v + w = x) ⇔ (v = x − w)
WORD_ADD_INV_0_EQ
|- ∀v w. (v + w = v) ⇔ (w = 0w)
WORD_EQ_ADD_LCANCEL
|- ∀v w x. (v + w = v + x) ⇔ (w = x)
WORD_EQ_ADD_RCANCEL
|- ∀v w x. (v + w = x + w) ⇔ (v = x)
WORD_NEG
|- ∀w. -w = ¬w + 1w
WORD_NOT
|- ∀w. ¬w = -w − 1w
WORD_NEG_0
|- -0w = 0w
WORD_NEG_ADD
|- ∀v w. -(v + w) = -v + -w
WORD_NEG_NEG
|- ∀w. - -w = w
WORD_SUB_LNEG
|- ∀v w. -v − w = -(v + w)
WORD_SUB_RNEG
|- ∀v w. v − -w = v + w
WORD_SUB_SUB
|- ∀v w x. v − (w − x) = v + x − w
WORD_SUB_SUB2
|- ∀v w. v − (v − w) = w
WORD_EQ_SUB_LADD
|- ∀v w x. (v = w − x) ⇔ (v + x = w)
WORD_EQ_SUB_RADD
|- ∀v w x. (v − w = x) ⇔ (v = x + w)
WORD_EQ_SUB_ZERO
|- ∀w v. (v − w = 0w) ⇔ (v = w)
WORD_LCANCEL_SUB
|- ∀v w x. (v − w = x − w) ⇔ (v = x)
WORD_RCANCEL_SUB
|- ∀v w x. (v − w = v − x) ⇔ (w = x)
WORD_SUB_PLUS
|- ∀v w x. v − (w + x) = v − w − x
WORD_SUB_LZERO
|- ∀w. 0w − w = -w
WORD_SUB_RZERO
|- ∀w. w − 0w = w
WORD_ADD_LID_UNIQ
|- ∀v w. (v + w = w) ⇔ (v = 0w)
WORD_ADD_RID_UNIQ
|- ∀v w. (v + w = v) ⇔ (w = 0w)
WORD_SUM_ZERO
|- ∀a b. (a + b = 0w) ⇔ (a = -b)
WORD_ADD_SUB2
|- ∀v w. w + v − w = v
WORD_ADD_SUB3
|- ∀v x. v − (v + x) = -x
WORD_SUB_SUB3
|- ∀w v. v − w − v = -w
WORD_EQ_NEG
|- ∀v w. (-v = -w) ⇔ (v = w)
WORD_NEG_EQ
|- ∀w v. (-v = w) ⇔ (v = -w)
WORD_NEG_EQ_0
|- (-v = 0w) ⇔ (v = 0w)
WORD_SUB
|- ∀v w. -w + v = v − w
WORD_SUB_NEG
|- ∀v w. -v − -w = w − v
WORD_NEG_SUB
|- ∀w v. -(v − w) = w − v
WORD_SUB_TRIANGLE
|- ∀v w x. v − w + (w − x) = v − x
WORD_NOT_0
|- ¬0w = UINT_MAXw
WORD_NOT_T
|- ¬UINT_MAXw = 0w
WORD_NEG_T
|- -UINT_MAXw = 1w
WORD_MULT_SUC
|- ∀v n. v * n2w (n + 1) = v * n2w n + v
WORD_NEG_LMUL
|- ∀v w. -(v * w) = -v * w
WORD_NEG_RMUL
|- ∀v w. -(v * w) = v * -w
WORD_NEG_MUL
|- ∀w. -w = -1w * w
sw2sw_w2w_add
|- ∀w. sw2sw w = (if word_msb w then -1w ≪ dimindex (:α) else 0w) + w2w w
WORD_ADD_BIT0
|- ∀a b. (a + b) ' 0 ⇔ (a ' 0 ⇎ b ' 0)
WORD_ADD_BIT
|- ∀n a b.
     n < dimindex (:α) ⇒
     ((a + b) ' n ⇔
      if n = 0 then a ' 0 ⇎ b ' 0
      else if ((n − 1 -- 0) a + (n − 1 -- 0) b) ' n then a ' n ⇔ b ' n
      else a ' n ⇎ b ' n)
WORD_LEFT_SUB_DISTRIB
|- ∀v w x. v * (w − x) = v * w − v * x
WORD_RIGHT_SUB_DISTRIB
|- ∀v w x. (w − x) * v = w * v − x * v
WORD_LITERAL_MULT
|- (∀m n. n2w m * -n2w n = -n2w (m * n)) ∧ ∀m n. -n2w m * -n2w n = n2w (m * n)
WORD_LITERAL_ADD
|- (∀m n. -n2w m + -n2w n = -n2w (m + n)) ∧
   ∀m n. n2w m + -n2w n = if n ≤ m then n2w (m − n) else -n2w (n − m)
WORD_SUB_INTRO
|- (∀x y. -y + x = x − y) ∧ (∀x y. x + -y = x − y) ∧
   (∀x y z. -x * y + z = z − x * y) ∧ (∀x y z. z + -x * y = z − x * y) ∧
   (∀x. -1w * x = -x) ∧ (∀x y z. z − -x * y = z + x * y) ∧
   ∀x y z. -x * y − z = -(x * y + z)
n2w_SUC
|- ∀n. n2w (SUC n) = n2w n + 1w
n2w_sub
|- ∀a b. b ≤ a ⇒ (n2w (a − b) = n2w a − n2w b)
n2w_sub_eq_0
|- ∀a b. a ≤ b ⇒ (n2w (a − b) = 0w)
WORD_H_WORD_L
|- INT_MAXw = INT_MINw − 1w
word_L_MULT
|- ∀n. n2w n * INT_MINw = if EVEN n then 0w else INT_MINw
ASR_ADD
|- ∀w m n. w ≫ m ≫ n = w ≫ (m + n)
LSR_ADD
|- ∀w m n. w ⋙ m ⋙ n = w ⋙ (m + n)
ROR_ADD
|- ∀w m n. w ⇄ m ⇄ n = w ⇄ (m + n)
LSL_ADD
|- ∀w m n. w ≪ m ≪ n = w ≪ (m + n)
ASR_LIMIT
|- ∀w n. dimindex (:α) ≤ n ⇒ (w ≫ n = if word_msb w then UINT_MAXw else 0w)
ASR_UINT_MAX
|- ∀n. UINT_MAXw ≫ n = UINT_MAXw
LSR_LIMIT
|- ∀w n. dimindex (:α) ≤ n ⇒ (w ⋙ n = 0w)
LSL_LIMIT
|- ∀w n. dimindex (:α) ≤ n ⇒ (w ≪ n = 0w)
ROR_CYCLE
|- ∀w n. w ⇄ (n * dimindex (:α)) = w
ROR_MOD
|- ∀w n. w ⇄ (n MOD dimindex (:α)) = w ⇄ n
ROL_MOD
|- ∀w n. w ⇆ (n MOD dimindex (:α)) = w ⇆ n
LSL_ONE
|- ∀w. w ≪ 1 = w + w
ROR_UINT_MAX
|- ∀n. UINT_MAXw ⇄ n = UINT_MAXw
ROR_ROL
|- ∀w n. (w ⇄ n ⇆ n = w) ∧ (w ⇆ n ⇄ n = w)
MOD_COMPLEMENT
|- ∀n q a.
     0 < n ∧ 0 < q ∧ a < q * n ⇒ ((q * n − a) MOD n = (n − a MOD n) MOD n)
ROL_ADD
|- ∀w m n. w ⇆ m ⇆ n = w ⇆ (m + n)
ZERO_SHIFT
|- (∀n. 0w ≪ n = 0w) ∧ (∀n. 0w ≫ n = 0w) ∧ (∀n. 0w ⋙ n = 0w) ∧
   (∀n. 0w ⇆ n = 0w) ∧ ∀n. 0w ⇄ n = 0w
SHIFT_ZERO
|- (∀a. a ≪ 0 = a) ∧ (∀a. a ≫ 0 = a) ∧ (∀a. a ⋙ 0 = a) ∧ (∀a. a ⇆ 0 = a) ∧
   ∀a. a ⇄ 0 = a
word_lsl_n2w
|- ∀n m. n2w m ≪ n = if dimindex (:α) − 1 < n then 0w else n2w (m * 2 ** n)
word_lsr_n2w
|- ∀w n. w ⋙ n = (dimindex (:α) − 1 -- n) w
LSL_UINT_MAX
|- ∀n. UINT_MAXw ≪ n = n2w (dimword (:α) − 2 ** n)
word_asr_n2w
|- ∀n w.
     w ≫ n =
     if word_msb w then
       n2w (dimword (:α) − 2 ** (dimindex (:α) − MIN n (dimindex (:α)))) ‖
       w ⋙ n
     else w ⋙ n
word_ror_n2w
|- ∀n a.
     n2w a ⇄ n =
     (let x = n MOD dimindex (:α)
      in
        n2w
          (BITS (dimindex (:α) − 1) x a +
           BITS (x − 1) 0 a * 2 ** (dimindex (:α) − x)))
word_rrx_n2w
|- ∀c a.
     word_rrx (c,n2w a) =
     (ODD a,n2w (BITS (dimindex (:α) − 1) 1 a + SBIT c (dimindex (:α) − 1)))
word_ror
|- ∀w n.
     w ⇄ n =
     (let x = n MOD dimindex (:α)
      in
        (dimindex (:α) − 1 -- x) w ‖ (x − 1 -- 0) w ≪ (dimindex (:α) − x))
word_asr
|- ∀w n.
     w ≫ n =
     if word_msb w then
       (dimindex (:α) − 1 '' dimindex (:α) − n) UINT_MAXw ‖ w ⋙ n
     else w ⋙ n
w2n_lsr
|- ∀w m. w2n (w ⋙ m) = w2n w DIV 2 ** m
WORD_MUL_LSL
|- ∀a n. a ≪ n = n2w (2 ** n) * a
WORD_ADD_LSL
|- ∀n a b. (a + b) ≪ n = a ≪ n + b ≪ n
WORD_DIV_LSR
|- ∀m n. n < dimindex (:α) ⇒ (m ⋙ n = m // n2w (2 ** n))
WORD_MOD_1
|- ∀m. word_mod m 1w = 0w
WORD_MOD_POW2
|- ∀m v. v < dimindex (:α) − 1 ⇒ (word_mod m (n2w (2 ** SUC v)) = (v -- 0) m)
SHIFT_1_SUB_1
|- ∀i n. i < dimindex (:α) ⇒ ((1w ≪ n − 1w) ' i ⇔ i < n)
LSR_BITWISE
|- (∀n v w. w ⋙ n && v ⋙ n = (w && v) ⋙ n) ∧
   (∀n v w. w ⋙ n ‖ v ⋙ n = (w ‖ v) ⋙ n) ∧ ∀n v w. w ⋙ n ⊕ v ⋙ n = (w ⊕ v) ⋙ n
LSL_BITWISE
|- (∀n v w. w ≪ n && v ≪ n = (w && v) ≪ n) ∧
   (∀n v w. w ≪ n ‖ v ≪ n = (w ‖ v) ≪ n) ∧ ∀n v w. w ≪ n ⊕ v ≪ n = (w ⊕ v) ≪ n
ROR_BITWISE
|- (∀n v w. w ⇄ n && v ⇄ n = (w && v) ⇄ n) ∧
   (∀n v w. w ⇄ n ‖ v ⇄ n = (w ‖ v) ⇄ n) ∧ ∀n v w. w ⇄ n ⊕ v ⇄ n = (w ⊕ v) ⇄ n
ROL_BITWISE
|- (∀n v w. w ⇆ n && v ⇆ n = (w && v) ⇆ n) ∧
   (∀n v w. w ⇆ n ‖ v ⇆ n = (w ‖ v) ⇆ n) ∧ ∀n v w. w ⇆ n ⊕ v ⇆ n = (w ⊕ v) ⇆ n
WORD_2COMP_LSL
|- ∀n a. -a ≪ n = -(a ≪ n)
w2w_LSL
|- ∀w n.
     w2w (w ≪ n) =
     if n < dimindex (:α) then w2w ((dimindex (:α) − 1 − n -- 0) w) ≪ n
     else 0w
n2w_DIV
|- ∀a n. a < dimword (:α) ⇒ (n2w (a DIV 2 ** n) = n2w a ⋙ n)
WORD_BITS_LSL
|- ∀h l n w.
     h < dimindex (:α) ⇒
     ((h -- l) (w ≪ n) = if n ≤ h then (h − n -- l − n) w ≪ (n − l) else 0w)
WORD_EXTRACT_LSL
|- ∀h l n w.
     h < dimindex (:α) ⇒
     ((h >< l) (w ≪ n) = if n ≤ h then (h − n >< l − n) w ≪ (n − l) else 0w)
WORD_EXTRACT_LSL2
|- ∀h l n w.
     dimindex (:β) + l ≤ h + n ⇒
     ((h >< l) w ≪ n = (dimindex (:β) + l − (n + 1) >< l) w ≪ n)
EXTRACT_JOIN_LSL
|- ∀h m m' l s n w.
     l ≤ m ∧ m' ≤ h ∧ (m' = m + 1) ∧ (s = m' − l + n) ⇒
     ((h >< m') w ≪ s ‖ (m >< l) w ≪ n =
      (MIN h (MIN (dimindex (:β) + l − 1) (dimindex (:α) − 1)) >< l) w ≪ n)
EXTRACT_JOIN_ADD_LSL
|- ∀h m m' l s n w.
     l ≤ m ∧ m' ≤ h ∧ (m' = m + 1) ∧ (s = m' − l + n) ⇒
     ((h >< m') w ≪ s + (m >< l) w ≪ n =
      (MIN h (MIN (dimindex (:β) + l − 1) (dimindex (:α) − 1)) >< l) w ≪ n)
word_extract_mask
|- ∀h l a. (h >< l) a = if l ≤ h then a ⋙ l && 2w ≪ (h − l) − 1w else 0w
word_shift_bv
|- (∀w n. n < dimword (:α) ⇒ (w ≪ n = w <<~ n2w n)) ∧
   (∀w n. n < dimword (:α) ⇒ (w ≫ n = w >>~ n2w n)) ∧
   (∀w n. n < dimword (:α) ⇒ (w ⋙ n = w >>>~ n2w n)) ∧
   (∀w n. w ⇄ n = w #>>~ n2w (n MOD dimindex (:α))) ∧
   ∀w n. w ⇆ n = w #<<~ n2w (n MOD dimindex (:α))
WORD_NEG_L
|- -INT_MINw = INT_MINw
word_L_MULT_NEG
|- ∀n. -n2w n * INT_MINw = if EVEN n then 0w else INT_MINw
word_L2_MULT
|- (INT_MINw2 * INT_MINw2 = INT_MINw2) ∧ (INT_MINw * INT_MINw2 = INT_MINw2) ∧
   (∀n. n2w n * INT_MINw2 = if EVEN n then 0w else INT_MINw2) ∧
   ∀n. -n2w n * INT_MINw2 = if EVEN n then 0w else INT_MINw2
TWO_COMP_NEG
|- ∀a.
     word_msb a ⇒
     if (dimindex (:α) − 1 = 0) ∨ (a = INT_MINw) then word_msb (-a)
     else ¬word_msb (-a)
TWO_COMP_POS_NEG
|- ∀a.
     ¬((dimindex (:α) − 1 = 0) ∨ (a = 0w) ∨ (a = INT_MINw)) ⇒
     (¬word_msb a ⇔ word_msb (-a))
WORD_0_POS
|- ¬word_msb 0w
TWO_COMP_POS
|- ∀a. ¬word_msb a ⇒ (a = 0w) ∨ word_msb (-a)
WORD_H_POS
|- ¬word_msb INT_MAXw
WORD_L_NEG
|- word_msb INT_MINw
WORD_GREATER
|- ∀a b. a > b ⇔ b < a
WORD_GREATER_EQ
|- ∀a b. a ≥ b ⇔ b ≤ a
WORD_NOT_LESS
|- ∀a b. ¬(a < b) ⇔ b ≤ a
WORD_LT
|- ∀a b.
     a < b ⇔
     (word_msb a ⇔ word_msb b) ∧ w2n a < w2n b ∨ word_msb a ∧ ¬word_msb b
WORD_GT
|- ∀a b.
     a > b ⇔
     (word_msb b ⇔ word_msb a) ∧ w2n a > w2n b ∨ word_msb b ∧ ¬word_msb a
WORD_LE
|- ∀a b.
     a ≤ b ⇔
     (word_msb a ⇔ word_msb b) ∧ w2n a ≤ w2n b ∨ word_msb a ∧ ¬word_msb b
WORD_GE
|- ∀a b.
     a ≥ b ⇔
     (word_msb b ⇔ word_msb a) ∧ w2n a ≥ w2n b ∨ word_msb b ∧ ¬word_msb a
WORD_LO
|- ∀a b. a <₊ b ⇔ w2n a < w2n b
WORD_LS
|- ∀a b. a ≤₊ b ⇔ w2n a ≤ w2n b
WORD_HI
|- ∀a b. a >₊ b ⇔ w2n a > w2n b
WORD_HS
|- ∀a b. a ≥₊ b ⇔ w2n a ≥ w2n b
WORD_NOT_LESS_EQUAL
|- ∀a b. ¬(a ≤ b) ⇔ b < a
WORD_LESS_OR_EQ
|- ∀a b. a ≤ b ⇔ a < b ∨ (a = b)
WORD_GREATER_OR_EQ
|- ∀a b. a ≥ b ⇔ a > b ∨ (a = b)
WORD_LESS_TRANS
|- ∀a b c. a < b ∧ b < c ⇒ a < c
WORD_LESS_EQ_TRANS
|- ∀a b c. a ≤ b ∧ b ≤ c ⇒ a ≤ c
WORD_LESS_EQ_LESS_TRANS
|- ∀a b c. a ≤ b ∧ b < c ⇒ a < c
WORD_LESS_LESS_EQ_TRANS
|- ∀a b c. a < b ∧ b ≤ c ⇒ a < c
WORD_LESS_EQ_CASES
|- ∀a b. a ≤ b ∨ b ≤ a
WORD_LESS_CASES
|- ∀a b. a < b ∨ b ≤ a
WORD_LESS_CASES_IMP
|- ∀a b. ¬(a < b) ∧ a ≠ b ⇒ b < a
WORD_LESS_ANTISYM
|- ∀a b. ¬(a < b ∧ b < a)
WORD_LESS_EQ_ANTISYM
|- ∀a b. ¬(a < b ∧ b ≤ a)
WORD_LESS_EQ_REFL
|- ∀a. a ≤ a
WORD_LESS_EQUAL_ANTISYM
|- ∀a b. a ≤ b ∧ b ≤ a ⇒ (a = b)
WORD_LESS_IMP_LESS_OR_EQ
|- ∀a b. a < b ⇒ a ≤ b
WORD_LESS_REFL
|- ∀a. ¬(a < a)
WORD_LESS_LESS_CASES
|- ∀a b. (a = b) ∨ a < b ∨ b < a
WORD_NOT_GREATER
|- ∀a b. ¬(a > b) ⇔ a ≤ b
WORD_LESS_NOT_EQ
|- ∀a b. a < b ⇒ a ≠ b
WORD_NOT_LESS_EQ
|- ∀a b. (a = b) ⇒ ¬(a < b)
WORD_HIGHER
|- ∀a b. a >₊ b ⇔ b <₊ a
WORD_HIGHER_EQ
|- ∀a b. a ≥₊ b ⇔ b ≤₊ a
WORD_NOT_LOWER
|- ∀a b. ¬(a <₊ b) ⇔ b ≤₊ a
WORD_NOT_LOWER_EQUAL
|- ∀a b. ¬(a ≤₊ b) ⇔ b <₊ a
WORD_LOWER_OR_EQ
|- ∀a b. a ≤₊ b ⇔ a <₊ b ∨ (a = b)
WORD_HIGHER_OR_EQ
|- ∀a b. a ≥₊ b ⇔ a >₊ b ∨ (a = b)
WORD_LOWER_TRANS
|- ∀a b c. a <₊ b ∧ b <₊ c ⇒ a <₊ c
WORD_LOWER_EQ_TRANS
|- ∀a b c. a ≤₊ b ∧ b ≤₊ c ⇒ a ≤₊ c
WORD_LOWER_EQ_LOWER_TRANS
|- ∀a b c. a ≤₊ b ∧ b <₊ c ⇒ a <₊ c
WORD_LOWER_LOWER_EQ_TRANS
|- ∀a b c. a <₊ b ∧ b ≤₊ c ⇒ a <₊ c
WORD_LOWER_EQ_CASES
|- ∀a b. a ≤₊ b ∨ b ≤₊ a
WORD_LOWER_CASES
|- ∀a b. a <₊ b ∨ b ≤₊ a
WORD_LOWER_CASES_IMP
|- ∀a b. ¬(a <₊ b) ∧ a ≠ b ⇒ b <₊ a
WORD_LOWER_ANTISYM
|- ∀a b. ¬(a <₊ b ∧ b <₊ a)
WORD_LOWER_EQ_ANTISYM
|- ∀a b. ¬(a <₊ b ∧ b ≤₊ a)
WORD_LOWER_EQ_REFL
|- ∀a. a ≤₊ a
WORD_LOWER_EQUAL_ANTISYM
|- ∀a b. a ≤₊ b ∧ b ≤₊ a ⇒ (a = b)
WORD_LOWER_IMP_LOWER_OR_EQ
|- ∀a b. a <₊ b ⇒ a ≤₊ b
WORD_LOWER_REFL
|- ∀a. ¬(a <₊ a)
WORD_LOWER_LOWER_CASES
|- ∀a b. (a = b) ∨ a <₊ b ∨ b <₊ a
WORD_NOT_HIGHER
|- ∀a b. ¬(a >₊ b) ⇔ a ≤₊ b
WORD_LOWER_NOT_EQ
|- ∀a b. a <₊ b ⇒ a ≠ b
WORD_NOT_LOWER_EQ
|- ∀a b. (a = b) ⇒ ¬(a <₊ b)
WORD_L_PLUS_H
|- INT_MINw + INT_MAXw = UINT_MAXw
WORD_L_LESS_EQ
|- ∀a. INT_MINw ≤ a
WORD_LESS_EQ_H
|- ∀a. a ≤ INT_MAXw
WORD_L_LESS_H
|- INT_MINw < INT_MAXw
NOT_INT_MIN_ZERO
|- INT_MINw ≠ 0w
ZERO_LO_INT_MIN
|- 0w <₊ INT_MINw
WORD_0_LS
|- ∀w. 0w ≤₊ w
WORD_LS_T
|- ∀w. w ≤₊ UINT_MAXw
WORD_ADD_LEFT_LO
|- ∀b c a.
     a + b <₊ c ⇔
     if b ≤₊ c then
       (let x = n2w (w2n c − w2n b) in a <₊ x ∨ b ≠ 0w ∧ -c + x ≤₊ a)
     else -b ≤₊ a ∧ a <₊ -b + c
WORD_ADD_LEFT_LS
|- ∀b c a.
     a + b ≤₊ c ⇔
     if b ≤₊ c then
       (let x = n2w (w2n c − w2n b) in a ≤₊ x ∨ b ≠ 0w ∧ -c + x ≤₊ a)
     else -b ≤₊ a ∧ a ≤₊ -b + c
WORD_ADD_RIGHT_LS
|- ∀c a b.
     a ≤₊ b + c ⇔
     if c ≤₊ a then
       (let x = n2w (w2n a − w2n c) in x ≤₊ b ∧ ((c = 0w) ∨ b <₊ -a + x))
     else b <₊ -c ∨ -c + a ≤₊ b
WORD_ADD_RIGHT_LO
|- ∀c a b.
     a <₊ b + c ⇔
     if c ≤₊ a then
       (let x = n2w (w2n a − w2n c) in x <₊ b ∧ ((c = 0w) ∨ b <₊ -a + x))
     else b <₊ -c ∨ -c + a <₊ b
WORD_MSB_INT_MIN_LS
|- ∀a. word_msb a ⇔ INT_MINw ≤₊ a
WORD_LT_LO
|- ∀a b.
     a < b ⇔
     INT_MINw ≤₊ a ∧ (b <₊ INT_MINw ∨ a <₊ b) ∨
     a <₊ INT_MINw ∧ b <₊ INT_MINw ∧ a <₊ b
WORD_LE_LS
|- ∀a b.
     a ≤ b ⇔
     INT_MINw ≤₊ a ∧ (b <₊ INT_MINw ∨ a ≤₊ b) ∨
     a <₊ INT_MINw ∧ b <₊ INT_MINw ∧ a ≤₊ b
WORD_LESS_NEG_LEFT
|- ∀a b. -a <₊ b ⇔ b ≠ 0w ∧ ((a = 0w) ∨ -b <₊ a)
WORD_LESS_NEG_RIGHT
|- ∀a b. a <₊ -b ⇔ b ≠ 0w ∧ ((a = 0w) ∨ b <₊ -a)
WORD_LS_word_0
|- ∀n. n ≤₊ 0w ⇔ (n = 0w)
WORD_LO_word_0
|- (∀n. 0w <₊ n ⇔ n ≠ 0w) ∧ ∀n. ¬(n <₊ 0w)
WORD_ADD_LEFT_LO2
|- ∀c a. c + a <₊ a ⇔ a ≠ 0w ∧ (c ≠ 0w ∧ -c <₊ a ∨ (a = -c))
WORD_ADD_LEFT_LS2
|- ∀c a. c + a ≤₊ a ⇔ (c = 0w) ∨ a ≠ 0w ∧ (-c <₊ a ∨ (a = -c))
WORD_ADD_RIGHT_LO2
|- ∀c a. a <₊ c + a ⇔ c ≠ 0w ∧ ((a = 0w) ∨ a <₊ -c)
WORD_ADD_RIGHT_LS2
|- ∀c a. a ≤₊ c + a ⇔ (a = 0w) ∨ (c = 0w) ∨ a <₊ -c
word_msb_neg
|- ∀w. word_msb w ⇔ w < 0w
word_abs
|- ∀w. word_abs w = FCP i. ¬word_msb w ∧ w ' i ∨ word_msb w ∧ (-w) ' i
word_abs_word_abs
|- ∀w. word_abs (word_abs w) = word_abs w
word_abs_neg
|- ∀w. word_abs (-w) = word_abs w
word_abs_diff
|- ∀a b. word_abs (a − b) = word_abs (b − a)
FST_ADD_WITH_CARRY
|- ((∀a b. FST (add_with_carry (a,b,F)) = a + b) ∧
    (∀a b. FST (add_with_carry (a,¬b,T)) = a − b) ∧
    ∀a b. FST (add_with_carry (¬a,b,T)) = b − a) ∧
   (∀n a. FST (add_with_carry (a,n2w n,T)) = a − ¬n2w n) ∧
   ∀n b. FST (add_with_carry (n2w n,b,T)) = b − ¬n2w n
ADD_WITH_CARRY_SUB
|- ∀x y.
     add_with_carry (x,¬y,T) =
     (x − y,y ≤₊ x,
      (word_msb x ⇎ word_msb y) ∧ (word_msb (x − y) ⇎ word_msb x))
word_eq_n2w
|- (∀m n. (n2w m = n2w n) ⇔ MOD_2EXP_EQ (dimindex (:α)) m n) ∧
   (∀n. (n2w n = -1w) ⇔ MOD_2EXP_MAX (dimindex (:α)) n) ∧
   ∀n. (-1w = n2w n) ⇔ MOD_2EXP_MAX (dimindex (:α)) n
word_lt_n2w
|- ∀a b.
     n2w a < n2w b ⇔
     (let sa = BIT (dimindex (:α) − 1) a and sb = BIT (dimindex (:α) − 1) b
      in
        (sa ⇔ sb) ∧ a MOD dimword (:α) < b MOD dimword (:α) ∨ sa ∧ ¬sb)
word_gt_n2w
|- ∀a b.
     n2w a > n2w b ⇔
     (let sa = BIT (dimindex (:α) − 1) a and sb = BIT (dimindex (:α) − 1) b
      in
        (sa ⇔ sb) ∧ a MOD dimword (:α) > b MOD dimword (:α) ∨ ¬sa ∧ sb)
word_le_n2w
|- ∀a b.
     n2w a ≤ n2w b ⇔
     (let sa = BIT (dimindex (:α) − 1) a and sb = BIT (dimindex (:α) − 1) b
      in
        (sa ⇔ sb) ∧ a MOD dimword (:α) ≤ b MOD dimword (:α) ∨ sa ∧ ¬sb)
word_ge_n2w
|- ∀a b.
     n2w a ≥ n2w b ⇔
     (let sa = BIT (dimindex (:α) − 1) a and sb = BIT (dimindex (:α) − 1) b
      in
        (sa ⇔ sb) ∧ a MOD dimword (:α) ≥ b MOD dimword (:α) ∨ ¬sa ∧ sb)
word_ls_n2w
|- ∀a b. n2w a ≤₊ n2w b ⇔ a MOD dimword (:α) ≤ b MOD dimword (:α)
word_hi_n2w
|- ∀a b. n2w a >₊ n2w b ⇔ a MOD dimword (:α) > b MOD dimword (:α)
word_lo_n2w
|- ∀a b. n2w a <₊ n2w b ⇔ a MOD dimword (:α) < b MOD dimword (:α)
word_hs_n2w
|- ∀a b. n2w a ≥₊ n2w b ⇔ a MOD dimword (:α) ≥ b MOD dimword (:α)
w2n_add
|- ∀a b. ¬word_msb a ∧ ¬word_msb b ⇒ (w2n (a + b) = w2n a + w2n b)
saturate_w2w_n2w
|- ∀n.
     saturate_w2w (n2w n) =
     (let m = n MOD dimword (:α)
      in
        if dimindex (:β) ≤ dimindex (:α) ∧ dimword (:β) ≤ m then UINT_MAXw
        else n2w m)
saturate_w2w
|- ∀w.
     saturate_w2w w =
     if dimindex (:β) ≤ dimindex (:α) ∧ w2w UINT_MAXw ≤₊ w then UINT_MAXw
     else w2w w
saturate_sub
|- ∀a b. saturate_sub a b = if a ≤₊ b then 0w else a − b
saturate_add
|- ∀a b. saturate_add a b = if UINT_MAXw − a ≤₊ b then UINT_MAXw else a + b
NOT_FINITE_IMP_dimword_2
|- INFINITE 𝕌(:α) ⇒ (dimword (:α) = 2)
saturate_mul
|- ∀a b.
     saturate_mul a b =
     if FINITE 𝕌(:α) ∧ w2w UINT_MAXw ≤₊ w2w a * w2w b then UINT_MAXw
     else a * b
WORD_DIVISION
|- ∀w. w ≠ 0w ⇒ ∀v. (v = v // w * w + word_mod v w) ∧ word_mod v w <₊ w
word_reverse_0
|- word_reverse 0w = 0w
word_reverse_word_T
|- word_reverse (-1w) = -1w
sw2sw_0
|- sw2sw 0w = 0w
sw2sw_word_T
|- sw2sw (-1w) = -1w
word_div_1
|- ∀v. v // 1w = v
word_bit_0
|- ∀h. ¬word_bit h 0w
word_lsb_word_T
|- word_lsb (-1w)
word_msb_word_T
|- word_msb (-1w)
word_bit_0_word_T
|- word_bit 0 (-1w)
word_log2_1
|- word_log2 1w = 0w
word_join_0
|- ∀a. word_join 0w a = w2w a
word_concat_0_0
|- 0w @@ 0w = 0w
w2w_eq_n2w
|- ∀x y.
     dimindex (:α) ≤ dimindex (:β) ∧ y < dimword (:α) ⇒
     ((w2w x = n2w y) ⇔ (x = n2w y))
word_extract_eq_n2w
|- ∀x h y.
     dimindex (:α) ≤ dimindex (:β) ∧ dimindex (:α) − 1 ≤ h ∧
     y < dimword (:α) ⇒
     (((h >< 0) x = n2w y) ⇔ (x = n2w y))
word_concat_0
|- ∀x. FINITE 𝕌(:α) ∧ x < dimword (:β) ⇒ (0w @@ n2w x = n2w x)
word_concat_0_eq
|- ∀x y.
     FINITE 𝕌(:α) ∧ dimindex (:β) ≤ dimindex (:γ) ∧ y < dimword (:β) ⇒
     ((0w @@ x = n2w y) ⇔ (x = n2w y))
word_join_word_T
|- word_join (-1w) (-1w) = -1w
word_concat_word_T
|- -1w @@ -1w = w2w (-1w)
lsr_1_word_T
|- -1w ⋙ 1 = INT_MAXw
word_rrx_0
|- (word_rrx (F,0w) = (F,0w)) ∧ (word_rrx (T,0w) = (F,INT_MINw))
word_rrx_word_T
|- (word_rrx (F,-1w) = (T,INT_MAXw)) ∧ (word_rrx (T,-1w) = (T,-1w))
word_T_not_zero
|- -1w ≠ 0w
WORD_LS_word_T
|- (∀n. -1w ≤₊ n ⇔ (n = -1w)) ∧ ∀n. n ≤₊ -1w
WORD_LO_word_T
|- (∀n. ¬(-1w <₊ n)) ∧ ∀n. n <₊ -1w ⇔ n ≠ -1w
WORD_LESS_0_word_T
|- ¬(0w < -1w) ∧ ¬(0w ≤ -1w) ∧ -1w < 0w ∧ -1w ≤ 0w
word_reverse_thm
|- ∀w v n.
     (word_reverse (word_reverse w) = w) ∧
     (word_reverse (w ≪ n) = word_reverse w ⋙ n) ∧
     (word_reverse (w ⋙ n) = word_reverse w ≪ n) ∧
     (word_reverse (w ‖ v) = word_reverse w ‖ word_reverse v) ∧
     (word_reverse (w && v) = word_reverse w && word_reverse v) ∧
     (word_reverse (w ⊕ v) = word_reverse w ⊕ word_reverse v) ∧
     (word_reverse (¬w) = ¬word_reverse w) ∧ (word_reverse 0w = 0w) ∧
     (word_reverse (-1w) = -1w) ∧ ((word_reverse w = 0w) ⇔ (w = 0w)) ∧
     ((word_reverse w = -1w) ⇔ (w = -1w))
bit_count_upto_0
|- ∀w. bit_count_upto 0 w = 0
bit_count_upto_SUC
|- ∀w n.
     bit_count_upto (SUC n) w = (if w ' n then 1 else 0) + bit_count_upto n w
bit_count_upto_is_zero
|- ∀n w. (bit_count_upto n w = 0) ⇔ ∀i. i < n ⇒ ¬w ' i
bit_count_is_zero
|- ∀w. (bit_count w = 0) ⇔ (w = 0w)
WORD_FINITE
|- ∀s. FINITE s
WORD_SET_INDUCT
|- ∀P. P ∅ ∧ (∀s. P s ⇒ ∀e. e ∉ s ⇒ P (e INSERT s)) ⇒ ∀s. P s
SUC_WORD_PRED
|- ∀x. x ≠ 0w ⇒ (SUC (w2n (x − 1w)) = w2n x)
WORD_PRED_THM
|- ∀m. m ≠ 0w ⇒ w2n (m − 1w) < w2n m
LSR_LESS
|- ∀m y. y ≠ 0w ∧ 0 < m ⇒ w2n (y ⋙ m) < w2n y
word_sub_w2n
|- ∀x y. y ≤₊ x ⇒ (w2n (x − y) = w2n x − w2n y)
WORD_LE_EQ_LS
|- ∀x y. 0w ≤ x ∧ 0w ≤ y ⇒ (x ≤ y ⇔ x ≤₊ y)
WORD_LT_EQ_LO
|- ∀x y. 0w ≤ x ∧ 0w ≤ y ⇒ (x < y ⇔ x <₊ y)
WORD_ZERO_LE
|- ∀w. 0w ≤ w ⇔ w2n w < INT_MIN (:α)
WORD_LT_SUB_UPPER
|- ∀x y. 0w < y ∧ y < x ⇒ x − y < x
WORD_SUB_LT
|- ∀x y. 0w < y ∧ y < x ⇒ 0w < x − y ∧ x − y < x
WORD_SUB_LE
|- ∀x y. 0w ≤ y ∧ y ≤ x ⇒ 0w ≤ x − y ∧ x − y ≤ x
dimindex_1
|- dimindex (:unit) = 1
finite_1
|- FINITE 𝕌(:unit)
INT_MIN_1
|- INT_MIN (:unit) = 1
dimword_1
|- dimword (:unit) = 2
dimindex_2
|- dimindex (:2) = 2
finite_2
|- FINITE 𝕌(:2)
INT_MIN_2
|- INT_MIN (:2) = 2
dimword_2
|- dimword (:2) = 4
dimindex_3
|- dimindex (:3) = 3
finite_3
|- FINITE 𝕌(:3)
INT_MIN_3
|- INT_MIN (:3) = 4
dimword_3
|- dimword (:3) = 8
dimindex_4
|- dimindex (:4) = 4
finite_4
|- FINITE 𝕌(:4)
INT_MIN_4
|- INT_MIN (:4) = 8
dimword_4
|- dimword (:4) = 16
dimindex_5
|- dimindex (:5) = 5
finite_5
|- FINITE 𝕌(:5)
INT_MIN_5
|- INT_MIN (:5) = 16
dimword_5
|- dimword (:5) = 32
dimindex_6
|- dimindex (:6) = 6
finite_6
|- FINITE 𝕌(:6)
INT_MIN_6
|- INT_MIN (:6) = 32
dimword_6
|- dimword (:6) = 64
dimindex_7
|- dimindex (:7) = 7
finite_7
|- FINITE 𝕌(:7)
INT_MIN_7
|- INT_MIN (:7) = 64
dimword_7
|- dimword (:7) = 128
dimindex_8
|- dimindex (:8) = 8
finite_8
|- FINITE 𝕌(:8)
INT_MIN_8
|- INT_MIN (:8) = 128
dimword_8
|- dimword (:8) = 256
dimindex_9
|- dimindex (:9) = 9
finite_9
|- FINITE 𝕌(:9)
INT_MIN_9
|- INT_MIN (:9) = 256
dimword_9
|- dimword (:9) = 512
dimindex_10
|- dimindex (:10) = 10
finite_10
|- FINITE 𝕌(:10)
INT_MIN_10
|- INT_MIN (:10) = 512
dimword_10
|- dimword (:10) = 1024
dimindex_11
|- dimindex (:11) = 11
finite_11
|- FINITE 𝕌(:11)
INT_MIN_11
|- INT_MIN (:11) = 1024
dimword_11
|- dimword (:11) = 2048
dimindex_12
|- dimindex (:12) = 12
finite_12
|- FINITE 𝕌(:12)
INT_MIN_12
|- INT_MIN (:12) = 2048
dimword_12
|- dimword (:12) = 4096
dimindex_16
|- dimindex (:16) = 16
finite_16
|- FINITE 𝕌(:16)
INT_MIN_16
|- INT_MIN (:16) = 32768
dimword_16
|- dimword (:16) = 65536
dimindex_20
|- dimindex (:20) = 20
finite_20
|- FINITE 𝕌(:20)
INT_MIN_20
|- INT_MIN (:20) = 524288
dimword_20
|- dimword (:20) = 1048576
dimindex_24
|- dimindex (:24) = 24
finite_24
|- FINITE 𝕌(:24)
INT_MIN_24
|- INT_MIN (:24) = 8388608
dimword_24
|- dimword (:24) = 16777216
dimindex_28
|- dimindex (:28) = 28
finite_28
|- FINITE 𝕌(:28)
INT_MIN_28
|- INT_MIN (:28) = 134217728
dimword_28
|- dimword (:28) = 268435456
dimindex_30
|- dimindex (:30) = 30
finite_30
|- FINITE 𝕌(:30)
INT_MIN_30
|- INT_MIN (:30) = 536870912
dimword_30
|- dimword (:30) = 1073741824
dimindex_32
|- dimindex (:32) = 32
finite_32
|- FINITE 𝕌(:32)
INT_MIN_32
|- INT_MIN (:32) = 2147483648
dimword_32
|- dimword (:32) = 4294967296
dimindex_48
|- dimindex (:48) = 48
finite_48
|- FINITE 𝕌(:48)
INT_MIN_48
|- INT_MIN (:48) = 140737488355328
dimword_48
|- dimword (:48) = 281474976710656
dimindex_64
|- dimindex (:64) = 64
finite_64
|- FINITE 𝕌(:64)
INT_MIN_64
|- INT_MIN (:64) = 9223372036854775808
dimword_64
|- dimword (:64) = 18446744073709551616
dimindex_96
|- dimindex (:96) = 96
finite_96
|- FINITE 𝕌(:96)
INT_MIN_96
|- INT_MIN (:96) = 39614081257132168796771975168
dimword_96
|- dimword (:96) = 79228162514264337593543950336
dimindex_128
|- dimindex (:128) = 128
finite_128
|- FINITE 𝕌(:128)
INT_MIN_128
|- INT_MIN (:128) = 170141183460469231731687303715884105728
dimword_128
|- dimword (:128) = 340282366920938463463374607431768211456
n2w_itself_ind
|- ∀P. (∀n. P (n,(:α))) ⇒ ∀v v1. P (v,v1)
n2w_itself_def
|- n2w_itself (n,(:α)) = n2w n