Fixpoint memory_block' (sh: share) (n: nat) (b: block) (i: Z) : mpred :=
  match n with
  | O => emp
  | S n' => mapsto_ sh (Tint I8 Unsigned noattr) (Vptr b (Ptrofs.repr i))
         * memory_block' sh n' b (i+1)
 end.Definition memory_block'_alt (sh: share) (n: nat) (b: block) (ofs: Z) : mpred :=
 if readable_share_dec sh 
 then VALspec_range (Z_of_nat n) sh (b, ofs)
 else nonlock_permission_bytes sh (b,ofs) (Z.of_nat n).

Lemma memory_block_split: forall (sh : share) (b : block) (ofs n m : Z), 0 <= n -> 0 <= m -> n + m <= n + m + ofs < Ptrofs.modulus -> memory_block sh (n + m) (Vptr b (Ptrofs.repr ofs)) = memory_block sh n (Vptr b (Ptrofs.repr ofs)) * memory_block sh m (Vptr b (Ptrofs.repr (ofs + n))).