(** ** Properties of [store]. *)
(** [store] preserves block validity, permissions, access validity, and bounds. Moreover, a [store] succeeds if and only if the corresponding access is valid for writing. *)

(* Specifications: *)
Axiom nextblock_store:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
nextblock m2 = nextblock m1.
Axiom store_valid_block_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b', valid_block m1 b' -> valid_block m2 b'.
Axiom store_valid_block_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b', valid_block m2 b' -> valid_block m1 b'.
Axiom perm_store_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b' ofs' k p, perm m1 b' ofs' k p -> perm m2 b' ofs' k p.
Axiom perm_store_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b' ofs' k p, perm m2 b' ofs' k p -> perm m1 b' ofs' k p.
Axiom valid_access_store:
forall m1 chunk b ofs v,
valid_access m1 chunk b ofs Writable ->
{ m2: mem | store chunk m1 b ofs v = Some m2 }.
Axiom store_valid_access_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall chunk' b' ofs' p,
valid_access m1 chunk' b' ofs' p -> valid_access m2 chunk' b' ofs' p.
Axiom store_valid_access_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall chunk' b' ofs' p,
valid_access m2 chunk' b' ofs' p -> valid_access m1 chunk' b' ofs' p.
Axiom store_valid_access_3:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
valid_access m1 chunk b ofs Writable.
Axiom nextblock_store:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
nextblock m2 = nextblock m1.
Axiom store_valid_block_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b', valid_block m1 b' -> valid_block m2 b'.
Axiom store_valid_block_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b', valid_block m2 b' -> valid_block m1 b'.
Axiom perm_store_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b' ofs' k p, perm m1 b' ofs' k p -> perm m2 b' ofs' k p.
Axiom perm_store_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall b' ofs' k p, perm m2 b' ofs' k p -> perm m1 b' ofs' k p.
Axiom valid_access_store:
forall m1 chunk b ofs v,
valid_access m1 chunk b ofs Writable ->
{ m2: mem | store chunk m1 b ofs v = Some m2 }.
Axiom store_valid_access_1:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall chunk' b' ofs' p,
valid_access m1 chunk' b' ofs' p -> valid_access m2 chunk' b' ofs' p.
Axiom store_valid_access_2:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
forall chunk' b' ofs' p,
valid_access m2 chunk' b' ofs' p -> valid_access m1 chunk' b' ofs' p.
Axiom store_valid_access_3:
forall chunk m1 b ofs v m2, store chunk m1 b ofs v = Some m2 ->
valid_access m1 chunk b ofs Writable.