Theory bitstring

Parents

Contents

Type operators

(none)

Constants

Definitions

add_defband_defbitwise_defbnand_defbnor_defbnot_defboolify_defbor_defbxnor_defbxor_defextend_deffield_deffield_insert_deffixwidth_defmodify_defn2v_defreplicate_defrev_count_list_defrotate_defs2v_defshiftl_defshiftr_defsign_extend_deftestbit_defv2n_defv2s_defv2w_defw2v_defzero_extend_def

Theorems

bit_v2wbitify_defbitify_indbitify_reverse_mapbitstring_nchotomyboolify_reverse_mapel_fieldel_fixwidthel_rev_count_listel_shiftrel_sign_extendel_w2vel_zero_extendevery_bit_bitifyextendextend_computeextend_consextract_v2wfield_concat_leftfield_concat_rightfield_fixwidthfield_id_impfixwidthfixwidth_REPLICATEfixwidth_eqfixwidth_fixwidthfixwidth_idfixwidth_id_implength_bitifylength_bitify_nulllength_fieldlength_fixwidthlength_pad_leftlength_pad_rightlength_rev_count_listlength_rotatelength_shiftrlength_sign_extendlength_w2vlength_zero_extendn2w_v2nops_to_n2wops_to_v2wpad_left_extendranged_bitstring_nchotomyreduce_and_v2wreduce_or_v2wshiftl_replicate_Fshiftr_0sw2sw_v2wtestbittestbit_eltestbit_geq_lentestbit_w2vv2nv2n_APPENDv2n_ltv2n_n2vv2w_11v2w_Fv2w_NILv2w_Tv2w_appendv2w_fixwidthv2w_n2vv2w_thmv2w_w2vw2n_v2ww2v_v2ww2w_v2wword_1comp_v2wword_and_v2wword_asr_v2wword_bit_last_shiftrword_bits_v2wword_concat_v2wword_concat_v2w_rwtword_extract_v2wword_index_v2wword_join_v2wword_join_v2w_rwtword_lsb_v2wword_lsl_v2wword_lsr_v2wword_modify_v2wword_msb_v2wword_nand_v2wword_nor_v2wword_or_v2wword_reduce_v2wword_reverse_v2wword_ror_altword_ror_v2wword_slice_v2wword_xnor_v2wword_xor_v2w

Definitions

⊢ ∀a b.
    add a b =
    (let
       m = MAX (LENGTH a) (LENGTH b)
     in
       zero_extend m (n2v (v2n a + v2n b)))
⊢ band = bitwise $/\
⊢ ∀f v1 v2.
    bitwise f v1 v2 =
    (let
       m = MAX (LENGTH v1) (LENGTH v2)
     in
       MAP (UNCURRY f) (ZIP (fixwidth m v1,fixwidth m v2)))
⊢ bnand = bitwise (λx y. ¬(x ∧ y))
⊢ bnor = bitwise (λx y. ¬(x ∨ y))
⊢ bnot = MAP $¬
⊢ (∀a. boolify a [] = a) ∧
  ∀a n l. boolify a (n::l) = boolify ((n ≠ 0)::a) l
⊢ bor = bitwise $\/
⊢ bxnor = bitwise $<=>
⊢ bxor = bitwise (λx y. x ⇎ y)
⊢ (∀v0 l. extend v0 0 l = l) ∧
  ∀c n l. extend c (SUC n) l = extend c n (c::l)
⊢ ∀h l v. field h l v = fixwidth (SUC h − l) (shiftr v l)
⊢ ∀h l s.
    field_insert h l s =
    modify (λi. COND (l ≤ i ∧ i ≤ h) (testbit (i − l) s))
⊢ ∀n v.
    fixwidth n v =
    (let l = LENGTH v in if l < n then zero_extend n v else DROP (l − n) v)
⊢ ∀f v. modify f v = MAP (UNCURRY f) (ZIP (rev_count_list (LENGTH v),v))
⊢ ∀n. n2v n = boolify [] (n2l 2 n)
⊢ ∀v n. replicate v n = FLAT (GENLIST (K v) n)
⊢ ∀n. rev_count_list n = GENLIST (λi. n − 1 − i) n
⊢ ∀v m.
    rotate v m =
    (let
       l = LENGTH v;
       x = m MOD l
     in
       if l = 0 ∨ x = 0 then v else field (x − 1) 0 v ⧺ field (l − 1) x v)
⊢ s2v = MAP (λc. c = #"1" ∨ c = #"T")
⊢ ∀v m. shiftl v m = PAD_RIGHT F (LENGTH v + m) v
⊢ ∀v m. shiftr v m = TAKE (LENGTH v − m) v
⊢ ∀n v. sign_extend n v = PAD_LEFT (HD v) n v
⊢ ∀b v. testbit b v ⇔ field b b v = [T]
⊢ ∀l. v2n l = l2n 2 (bitify [] l)
⊢ v2s = MAP (λb. if b then #"1" else #"0")
⊢ ∀v. v2w v = FCP i. testbit i v
⊢ ∀w. w2v w = GENLIST (λi. w ' (dimindex (:α) − 1 − i)) (dimindex (:α))
⊢ ∀n v. zero_extend n v = PAD_LEFT F n v

Theorems

⊢ ∀n v. word_bit n (v2w v) ⇔ n < dimindex (:α) ∧ testbit n v
⊢ (∀a. bitify a [] = a) ∧ (∀l a. bitify a (F::l) = bitify (0::a) l) ∧
  ∀l a. bitify a (T::l) = bitify (1::a) l
⊢ ∀P. (∀a. P a []) ∧ (∀a l. P (0::a) l ⇒ P a (F::l)) ∧
      (∀a l. P (1::a) l ⇒ P a (T::l)) ⇒
      ∀v v1. P v v1
⊢ ∀v a. bitify a v = REVERSE (MAP (λb. if b then 1 else 0) v) ⧺ a
⊢ ∀w. ∃v. w = v2w v
⊢ ∀v a. boolify a v = REVERSE (MAP (λn. n ≠ 0) v) ⧺ a
⊢ ∀v h l i.
    i < SUC h − l ⇒
    ((field h l v)❲i❳ ⇔ SUC h ≤ i + LENGTH v ∧ v❲i + LENGTH v − SUC h❳)
⊢ ∀i n w.
    i < n ⇒
    ((fixwidth n w)❲i❳ ⇔
     if LENGTH w < n then n − LENGTH w ≤ i ∧ w❲i − (n − LENGTH w)❳
     else w❲i + (LENGTH w − n)❳)
⊢ ∀n i. i < n ⇒ (rev_count_list n)❲i❳ = n − 1 − i
⊢ ∀i v n d.
    n < d ∧ i < d − n ∧ 0 < d ⇒
    ((shiftr (fixwidth d v) n)❲i❳ ⇔ d ≤ i + LENGTH v ∧ v❲i + LENGTH v − d❳)
⊢ ∀n i v.
    (sign_extend n v)❲i❳ =
    if i < n − LENGTH v then v❲0❳ else v❲i − (n − LENGTH v)❳
⊢ ∀w n. n < dimindex (:α) ⇒ ((w2v w)❲n❳ ⇔ w ' (dimindex (:α) − 1 − n))
⊢ ∀n i v. (zero_extend n v)❲i❳ ⇔ n − LENGTH v ≤ i ∧ v❲i − (n − LENGTH v)❳
⊢ ∀v. EVERY ($> 2) (bitify [] v)
⊢ (∀n v. zero_extend n v = extend F (n − LENGTH v) v) ∧
  ∀n v. sign_extend n v = extend (HD v) (n − LENGTH v) v
extend_compute
⊢ (∀v0 l. extend v0 0 l = l) ∧
  (∀c n l.
     extend c (NUMERAL (BIT1 n)) l = extend c (NUMERAL (BIT1 n) − 1) (c::l)) ∧
  ∀c n l.
    extend c (NUMERAL (BIT2 n)) l = extend c (NUMERAL (BIT1 n)) (c::l)
⊢ ∀n c l. extend c (SUC n) l = c::extend c n l
⊢ ∀h l v.
    LENGTH v ≤ dimindex (:α) ∧ dimindex (:β) = SUC h − l ∧
    dimindex (:β) ≤ dimindex (:α) ⇒
    (h >< l) (v2w v) = v2w (field h l v)
⊢ ∀h l a b.
    l ≤ h ∧ LENGTH b ≤ l ⇒
    field h l (a ⧺ b) = field (h − LENGTH b) (l − LENGTH b) a
⊢ ∀h a b. LENGTH b = SUC h ⇒ field h 0 (a ⧺ b) = b
⊢ ∀h v. field h 0 v = fixwidth (SUC h) v
⊢ ∀n v. SUC n = LENGTH v ⇒ field n 0 v = v
⊢ ∀n v.
    fixwidth n v =
    (let
       l = LENGTH v
     in
       if l < n then extend F (n − l) v else DROP (l − n) v)
⊢ ∀len l.
    fixwidth len l =
    if LENGTH l ≤ len then REPLICATE (len − LENGTH l) F ⧺ l
    else DROP (LENGTH l − len) l
⊢ ∀n v w.
    fixwidth n v = fixwidth n w ⇔ ∀i. i < n ⇒ (testbit i v ⇔ testbit i w)
⊢ ∀n v. fixwidth n (fixwidth n v) = fixwidth n v
⊢ ∀w. fixwidth (LENGTH w) w = w
⊢ ∀n w. n = LENGTH w ⇒ fixwidth n w = w
⊢ ∀v l. LENGTH (bitify l v) = LENGTH l + LENGTH v
⊢ ∀v l. LENGTH (bitify [] v) = LENGTH v
⊢ ∀h l v. LENGTH (field h l v) = SUC h − l
⊢ ∀n v. LENGTH (fixwidth n v) = n
⊢ ∀x n a. LENGTH (PAD_LEFT x n a) = if LENGTH a < n then n else LENGTH a
⊢ ∀x n a. LENGTH (PAD_RIGHT x n a) = if LENGTH a < n then n else LENGTH a
⊢ ∀n. LENGTH (rev_count_list n) = n
⊢ ∀v n. LENGTH (rotate v n) = LENGTH v
⊢ ∀v n. LENGTH (shiftr v n) = LENGTH v − n
⊢ ∀n v. LENGTH v ≤ n ⇒ LENGTH (sign_extend n v) = n
⊢ ∀w. LENGTH (w2v w) = dimindex (:α)
⊢ ∀n v. LENGTH v ≤ n ⇒ LENGTH (zero_extend n v) = n
⊢ ∀v. n2w (v2n v) = v2w v
⊢ (∀v. -v2w v = -n2w (v2n v)) ∧
  (∀v. word_log2 (v2w v) = word_log2 (n2w (v2n v))) ∧
  (∀v n. v2w v = n2w n ⇔ n2w (v2n v) = n2w n) ∧
  (∀v n. n2w n = v2w v ⇔ n2w n = n2w (v2n v)) ∧
  (∀v w. v2w v + w = n2w (v2n v) + w) ∧
  (∀v w. w + v2w v = w + n2w (v2n v)) ∧
  (∀v w. v2w v − w = n2w (v2n v) − w) ∧
  (∀v w. w − v2w v = w − n2w (v2n v)) ∧
  (∀v w. v2w v * w = n2w (v2n v) * w) ∧
  (∀v w. w * v2w v = w * n2w (v2n v)) ∧
  (∀v w. v2w v / w = n2w (v2n v) / w) ∧
  (∀v w. w / v2w v = w / n2w (v2n v)) ∧
  (∀v w. v2w v // w = n2w (v2n v) // w) ∧
  (∀v w. w // v2w v = w // n2w (v2n v)) ∧
  (∀v w. word_mod (v2w v) w = word_mod (n2w (v2n v)) w) ∧
  (∀v w. word_mod w (v2w v) = word_mod w (n2w (v2n v))) ∧
  (∀v w. v2w v < w ⇔ n2w (v2n v) < w) ∧
  (∀v w. w < v2w v ⇔ w < n2w (v2n v)) ∧
  (∀v w. v2w v > w ⇔ n2w (v2n v) > w) ∧
  (∀v w. w > v2w v ⇔ w > n2w (v2n v)) ∧
  (∀v w. v2w v ≤ w ⇔ n2w (v2n v) ≤ w) ∧
  (∀v w. w ≤ v2w v ⇔ w ≤ n2w (v2n v)) ∧
  (∀v w. v2w v ≥ w ⇔ n2w (v2n v) ≥ w) ∧
  (∀v w. w ≥ v2w v ⇔ w ≥ n2w (v2n v)) ∧
  (∀v w. v2w v <₊ w ⇔ n2w (v2n v) <₊ w) ∧
  (∀v w. w <₊ v2w v ⇔ w <₊ n2w (v2n v)) ∧
  (∀v w. v2w v >₊ w ⇔ n2w (v2n v) >₊ w) ∧
  (∀v w. w >₊ v2w v ⇔ w >₊ n2w (v2n v)) ∧
  (∀v w. v2w v ≤₊ w ⇔ n2w (v2n v) ≤₊ w) ∧
  (∀v w. w ≤₊ v2w v ⇔ w ≤₊ n2w (v2n v)) ∧
  (∀v w. v2w v ≥₊ w ⇔ n2w (v2n v) ≥₊ w) ∧
  ∀v w. w ≥₊ v2w v ⇔ w ≥₊ n2w (v2n v)
⊢ (∀v n. v2w v ‖ n2w n = v2w v ‖ v2w (n2v n)) ∧
  (∀v n. n2w n ‖ v2w v = v2w (n2v n) ‖ v2w v) ∧
  (∀v n. v2w v && n2w n = v2w v && v2w (n2v n)) ∧
  (∀v n. n2w n && v2w v = v2w (n2v n) && v2w v) ∧
  (∀v n. v2w v ⊕ n2w n = v2w v ⊕ v2w (n2v n)) ∧
  (∀v n. n2w n ⊕ v2w v = v2w (n2v n) ⊕ v2w v) ∧
  (∀v n. v2w v ~|| n2w n = v2w v ~|| v2w (n2v n)) ∧
  (∀v n. n2w n ~|| v2w v = v2w (n2v n) ~|| v2w v) ∧
  (∀v n. v2w v ~&& n2w n = v2w v ~&& v2w (n2v n)) ∧
  (∀v n. n2w n ~&& v2w v = v2w (n2v n) ~&& v2w v) ∧
  (∀v n. v2w v ~?? n2w n = v2w v ~?? v2w (n2v n)) ∧
  (∀v n. n2w n ~?? v2w v = v2w (n2v n) ~?? v2w v) ∧
  (∀v n. v2w v @@ n2w n = v2w v @@ v2w (n2v n)) ∧
  (∀v n. n2w n @@ v2w v = v2w (n2v n) @@ v2w v) ∧
  (∀v n. word_join (v2w v) (n2w n) = word_join (v2w v) (v2w (n2v n))) ∧
  ∀v n. word_join (n2w n) (v2w v) = word_join (v2w (n2v n)) (v2w v)
⊢ ∀n l c. PAD_LEFT c n l = extend c (n − LENGTH l) l
⊢ ∀w. ∃v. w = v2w v ∧ Abbrev (LENGTH v = dimindex (:α))
⊢ ∀v. reduce_and (v2w v) = word_reduce $/\ (v2w v)
⊢ ∀v. reduce_or (v2w v) = word_reduce $\/ (v2w v)
⊢ ∀v n. shiftl v n = v ⧺ replicate [F] n
⊢ ∀v. shiftr v 0 = v
⊢ ∀v. sw2sw (v2w v) =
      if dimindex (:α) < dimindex (:β) then
        v2w (sign_extend (dimindex (:β)) (fixwidth (dimindex (:α)) v))
      else v2w (fixwidth (dimindex (:β)) v)
⊢ ∀b v. testbit b v ⇔ (let n = LENGTH v in b < n ∧ v❲n − 1 − b❳)
⊢ ∀v i. i < LENGTH v ⇒ (testbit i v ⇔ v❲LENGTH v − 1 − i❳)
⊢ ∀v i. LENGTH v ≤ i ⇒ ¬testbit i v
⊢ ∀n w. testbit n (w2v w) ⇔ word_bit n w
⊢ v2n [] = 0 ∧ v2n (b::bs) = if b then 2 ** LENGTH bs + v2n bs else v2n bs
⊢ ∀a b. v2n (a ⧺ b) = v2n b + 2 ** LENGTH b * v2n a
⊢ ∀v. v2n v < 2 ** LENGTH v
⊢ ∀n. v2n (n2v n) = n
⊢ ∀v w.
    v2w v = v2w w ⇔ fixwidth (dimindex (:α)) v = fixwidth (dimindex (:α)) w
⊢ v2w [F] = 0w
⊢ v2w [] = 0w
⊢ v2w [T] = 1w
⊢ v2w (xs ⧺ ys) = v2w xs ≪ LENGTH ys ‖ v2w ys
⊢ ∀v. v2w (fixwidth (dimindex (:α)) v) = v2w v
⊢ ∀n. v2w (n2v n) = n2w n
⊢ v2w [] = 0w ∧ v2w (x::xs) = if x then 1w ≪ LENGTH xs ‖ v2w xs else v2w xs
⊢ ∀w. v2w (w2v w) = w
⊢ ∀v. w2n (v2w v) = MOD_2EXP (dimindex (:α)) (v2n v)
⊢ ∀v. w2v (v2w v) = fixwidth (dimindex (:α)) v
⊢ ∀v. w2w (v2w v) =
      v2w
        (fixwidth
           (if dimindex (:β) < dimindex (:α) then dimindex (:β)
            else dimindex (:α)) v)
⊢ ∀v. ¬v2w v = v2w (bnot (fixwidth (dimindex (:α)) v))
⊢ ∀v w. v2w v && v2w w = v2w (band v w)
⊢ ∀n v.
    v2w v ≫ n =
    (let
       l = fixwidth (dimindex (:α)) v
     in
       v2w
         (sign_extend (dimindex (:α))
            (if dimindex (:α) ≤ n then [HD l] else shiftr l n)))
⊢ ∀i v.
    i < dimindex (:α) ⇒
    (word_bit i (v2w v) ⇔ (let l = shiftr v i in ¬NULL l ∧ LAST l))
⊢ ∀h l v. (h -- l) (v2w v) = v2w (field h l (fixwidth (dimindex (:α)) v))
⊢ ∀v1 v2.
    FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) ⇒
    v2w v1 @@ v2w v2 =
    v2w
      (fixwidth (MIN (dimindex (:γ)) (dimindex (:α) + dimindex (:β)))
         (v1 ⧺ fixwidth (dimindex (:β)) v2))
⊢ ∀v1 v2.
    v2w v1 @@ v2w v2 =
    if FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) then
      v2w
        (fixwidth (MIN (dimindex (:γ)) (dimindex (:α) + dimindex (:β)))
           (v1 ⧺ fixwidth (dimindex (:β)) v2))
    else FAIL $@@ $var$(bad domain) (v2w v1) (v2w v2)
⊢ ∀h l v. (h >< l) (v2w v) = w2w ((h -- l) (v2w v))
⊢ ∀v i.
    v2w v ' i ⇔
    if i < dimindex (:α) then testbit i v
    else FAIL $' $var$(index too large) (v2w v) i
⊢ ∀v1 v2.
    FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) ⇒
    word_join (v2w v1) (v2w v2) = v2w (v1 ⧺ fixwidth (dimindex (:β)) v2)
⊢ ∀v1 v2.
    word_join (v2w v1) (v2w v2) =
    if FINITE 𝕌(:α) ∧ FINITE 𝕌(:β) then
      v2w (v1 ⧺ fixwidth (dimindex (:β)) v2)
    else FAIL word_join $var$(bad domain) (v2w v1) (v2w v2)
⊢ ∀v. word_lsb (v2w v) ⇔ v ≠ [] ∧ LAST v
⊢ ∀n v. v2w v ≪ n = v2w (shiftl v n)
⊢ ∀n v. v2w v ⋙ n = v2w (shiftr (fixwidth (dimindex (:α)) v) n)
⊢ ∀f v. word_modify f (v2w v) = v2w (modify f (fixwidth (dimindex (:α)) v))
⊢ ∀v. word_msb (v2w v) ⇔ testbit (dimindex (:α) − 1) v
⊢ ∀v w.
    v2w v ~&& v2w w =
    v2w (bnand (fixwidth (dimindex (:α)) v) (fixwidth (dimindex (:α)) w))
⊢ ∀v w.
    v2w v ~|| v2w w =
    v2w (bnor (fixwidth (dimindex (:α)) v) (fixwidth (dimindex (:α)) w))
⊢ ∀v w. v2w v ‖ v2w w = v2w (bor v w)
⊢ ∀f v.
    word_reduce f (v2w v) =
    (let l = fixwidth (dimindex (:α)) v in v2w [FOLDL f (HD l) (TL l)])
⊢ ∀v. word_reverse (v2w v) = v2w (REVERSE (fixwidth (dimindex (:α)) v))
⊢ ∀r a.
    a ⇄ r = (let d = dimindex (:α) in a ≪ (d − r MOD d) ‖ a ⋙ (r MOD d))
⊢ ∀n v. v2w v ⇄ n = v2w (rotate (fixwidth (dimindex (:α)) v) n)
⊢ ∀h l v.
    (h '' l) (v2w v) =
    v2w (shiftl (field h l (fixwidth (dimindex (:α)) v)) l)
⊢ ∀v w.
    v2w v ~?? v2w w =
    v2w (bxnor (fixwidth (dimindex (:α)) v) (fixwidth (dimindex (:α)) w))
⊢ ∀v w. v2w v ⊕ v2w w = v2w (bxor v w)