Definition memval_lessdef: memval -> memval -> Prop := memval_inject inject_id.

(* Specifications: *)
Lemma memval_lessdef_refl: forall mv, memval_lessdef mv mv.
Lemma memval_inject_compose: forall f f' v1 v2 v3, memval_inject f v1 v2 -> memval_inject f' v2 v3 -> memval_inject (compose_meminj f f') v1 v3.
Lemma int_of_bytes_append: forall l2 l1, int_of_bytes (l1 ++ l2) = int_of_bytes l1 + int_of_bytes l2 * two_p (Z.of_nat (length l1) * 8).
Lemma int_of_bytes_range: forall l, 0 <= int_of_bytes l < two_p (Z.of_nat (length l) * 8).
Lemma length_proj_bytes: forall l b, proj_bytes l = Some b -> length b = length l.
Lemma proj_bytes_append: forall l2 l1, proj_bytes (l1 ++ l2) = match proj_bytes l1, proj_bytes l2 with | Some b1, Some b2 => Some (b1 ++ b2) | _, _ => None end.
Lemma decode_val_int64: forall l1 l2, length l1 = 4%nat -> length l2 = 4%nat -> Archi.ptr64 = false -> Val.lessdef (decode_val Mint64 (l1 ++ l2)) (Val.longofwords (decode_val Mint32 (if Archi.big_endian then l1 else l2)) (decode_val Mint32 (if Archi.big_endian then l2 else l1))).
Lemma bytes_of_int_append: forall n2 x2 n1 x1, 0 <= x1 < two_p (Z.of_nat n1 * 8) -> bytes_of_int (n1 + n2) (x1 + x2 * two_p (Z.of_nat n1 * 8)) = bytes_of_int n1 x1 ++ bytes_of_int n2 x2.
Lemma bytes_of_int64: forall i, bytes_of_int 8 (Int64.unsigned i) = bytes_of_int 4 (Int.unsigned (Int64.loword i)) ++ bytes_of_int 4 (Int.unsigned (Int64.hiword i)).
Lemma encode_val_int64: forall v, Archi.ptr64 = false -> encode_val Mint64 v = encode_val Mint32 (if Archi.big_endian then Val.hiword v else Val.loword v) ++ encode_val Mint32 (if Archi.big_endian then Val.loword v else Val.hiword v).
Lemma memval_lessdef_refl: forall mv, memval_lessdef mv mv.
Lemma memval_inject_compose: forall f f' v1 v2 v3, memval_inject f v1 v2 -> memval_inject f' v2 v3 -> memval_inject (compose_meminj f f') v1 v3.
Lemma int_of_bytes_append: forall l2 l1, int_of_bytes (l1 ++ l2) = int_of_bytes l1 + int_of_bytes l2 * two_p (Z.of_nat (length l1) * 8).
Lemma int_of_bytes_range: forall l, 0 <= int_of_bytes l < two_p (Z.of_nat (length l) * 8).
Lemma length_proj_bytes: forall l b, proj_bytes l = Some b -> length b = length l.
Lemma proj_bytes_append: forall l2 l1, proj_bytes (l1 ++ l2) = match proj_bytes l1, proj_bytes l2 with | Some b1, Some b2 => Some (b1 ++ b2) | _, _ => None end.
Lemma decode_val_int64: forall l1 l2, length l1 = 4%nat -> length l2 = 4%nat -> Archi.ptr64 = false -> Val.lessdef (decode_val Mint64 (l1 ++ l2)) (Val.longofwords (decode_val Mint32 (if Archi.big_endian then l1 else l2)) (decode_val Mint32 (if Archi.big_endian then l2 else l1))).
Lemma bytes_of_int_append: forall n2 x2 n1 x1, 0 <= x1 < two_p (Z.of_nat n1 * 8) -> bytes_of_int (n1 + n2) (x1 + x2 * two_p (Z.of_nat n1 * 8)) = bytes_of_int n1 x1 ++ bytes_of_int n2 x2.
Lemma bytes_of_int64: forall i, bytes_of_int 8 (Int64.unsigned i) = bytes_of_int 4 (Int.unsigned (Int64.loword i)) ++ bytes_of_int 4 (Int.unsigned (Int64.hiword i)).
Lemma encode_val_int64: forall v, Archi.ptr64 = false -> encode_val Mint64 v = encode_val Mint32 (if Archi.big_endian then Val.hiword v else Val.loword v) ++ encode_val Mint32 (if Archi.big_endian then Val.loword v else Val.hiword v).