diff --git a/theories/bitvector.v b/theories/bitvector.v index 69515089bb051bf2f5d8a3a8d2f106603ec6d20b..ab9b8187dca598e62df7e4eee8d51cf4bcfd41c8 100644 --- a/theories/bitvector.v +++ b/theories/bitvector.v @@ -804,6 +804,34 @@ Section properties. intros ???. unfold bv_mul. apply bv_eq. rewrite !bv_of_Z_unsigned. bv_wrap_simplify_solve. Qed. + + Lemma bv_add_Z_0 b : bv_add_Z b 0 = b. + Proof. + unfold bv_add_Z. rewrite Z.add_0_r. + apply bv_eq. apply bv_of_Z_small. apply bv_unsigned_in_range. + Qed. + + Lemma bv_add_Z_add_r b m o: + bv_add_Z b (m + o) = bv_add_Z (bv_add_Z b o) m. + Proof. + apply bv_eq. unfold bv_add_Z. rewrite !bv_of_Z_unsigned. + bv_wrap_simplify_solve. + Qed. + + Lemma bv_add_Z_add_l b m o: + bv_add_Z b (m + o) = bv_add_Z (bv_add_Z b m) o. + Proof. + apply bv_eq. unfold bv_add_Z. rewrite !bv_of_Z_unsigned. + bv_wrap_simplify_solve. + Qed. + + Lemma bv_add_Z_succ b m: + bv_add_Z b (Z.succ m) = bv_add_Z (bv_add_Z b 1) m. + Proof. + apply bv_eq. unfold bv_add_Z. rewrite !bv_of_Z_unsigned. + bv_wrap_simplify_solve. + Qed. + End properties. (** ** Lemmas about [bv_to_little] and [bv_of_little] *) @@ -835,8 +863,35 @@ Section little. Lemma bv_to_little_length m n z : length (bv_to_little m n z) = m. Proof. unfold bv_to_little. rewrite fmap_length. apply Z_to_little_length. Qed. + + Lemma bv_of_to_little_bv x m n (b : bv x): + x = (N.of_nat m * n)%N → + bv_of_Z x (bv_of_little n (bv_to_little m n (bv_unsigned b))) = b. + Proof. + intros ->. rewrite bv_of_to_little, Z.mod_small. + 2: { pose proof bv_unsigned_in_range _ b. unfold bv_modulus in *. lia. } + apply bv_eq. rewrite bv_of_Z_small; [done|]. apply bv_unsigned_in_range. + Qed. End little. +(** ** Lemmas about [bv_seq] *) +Section bv_seq. + Context {n : N}. + Implicit Types (b : bv n). + + Lemma bv_seq_succ b m: + 0 ≤ m → + bv_seq b (Z.succ m) = b :: bv_seq (bv_add_Z b 1) m. + Proof. + intros. unfold bv_seq. rewrite seqZ_cons by lia. csimpl. + rewrite bv_add_Z_0. f_equal. + assert (Z.succ 0 = 1 + 0) as -> by lia. + rewrite <-fmap_add_seqZ, <-list_fmap_compose. apply list_fmap_ext. + - intros x. simpl. by rewrite bv_add_Z_add_l. + - f_equal. lia. + Qed. +End bv_seq. + (** * [bvn] *) Record bvn := BVN { bvn_n : N;