(** Memory states that inject into themselves. *)
Definition flat_inj (thr: block) : meminj :=
fun (b: block) => if plt b thr then Some(b, 0) else None.
Parameter inject_neutral: forall (thr: block) (m: mem), Prop.

(* Specifications: *)
Axiom neutral_inject:
forall m, inject_neutral (nextblock m) m ->
inject (flat_inj (nextblock m)) m m.
Axiom empty_inject_neutral:
forall thr, inject_neutral thr empty.
Axiom alloc_inject_neutral:
forall thr m lo hi b m',
alloc m lo hi = (m', b) ->
inject_neutral thr m ->
Plt (nextblock m) thr ->
inject_neutral thr m'.
Axiom store_inject_neutral:
forall chunk m b ofs v m' thr,
store chunk m b ofs v = Some m' ->
inject_neutral thr m ->
Plt b thr ->
Val.inject (flat_inj thr) v v ->
inject_neutral thr m'.
Axiom drop_inject_neutral:
forall m b lo hi p m' thr,
drop_perm m b lo hi p = Some m' ->
inject_neutral thr m ->
Plt b thr ->
inject_neutral thr m'.
Axiom neutral_inject:
forall m, inject_neutral (nextblock m) m ->
inject (flat_inj (nextblock m)) m m.
Axiom empty_inject_neutral:
forall thr, inject_neutral thr empty.
Axiom alloc_inject_neutral:
forall thr m lo hi b m',
alloc m lo hi = (m', b) ->
inject_neutral thr m ->
Plt (nextblock m) thr ->
inject_neutral thr m'.
Axiom store_inject_neutral:
forall chunk m b ofs v m' thr,
store chunk m b ofs v = Some m' ->
inject_neutral thr m ->
Plt b thr ->
Val.inject (flat_inj thr) v v ->
inject_neutral thr m'.
Axiom drop_inject_neutral:
forall m b lo hi p m' thr,
drop_perm m b lo hi p = Some m' ->
inject_neutral thr m ->
Plt b thr ->
inject_neutral thr m'.