Definition mem_equiv' m1 m2 :=
(forall x, Mem.perm_order' (access_at m1 x Cur) Readable -> contents_at m1 x = contents_at m2 x) /\
Mem.perm m1 = Mem.perm m2 /\
Mem.nextblock m1 = Mem.nextblock m2.
Definition mem_lessalloc' m1 m2 :=
(forall x, Mem.perm_order' (access_at m1 x Cur) Readable -> contents_at m1 x = contents_at m2 x) /\
Mem.perm m1 = Mem.perm m2 /\
(Mem.nextblock m1 <= Mem.nextblock m2)%positive.

(* Specifications: *)
Lemma mem_equiv'_spec m1 m2 : mem_equiv m1 m2 <-> mem_equiv' m1 m2.
Lemma mem_lessalloc'_spec m1 m2 : mem_lessalloc m1 m2 <-> mem_lessalloc' m1 m2.
Lemma val_inject_antisym v1 v2 :
val_inject inject_id v1 v2 ->
val_inject inject_id v2 v1 ->
v1 = v2.
Lemma memval_lessdef_antisym v1 v2 : memval_lessdef v1 v2 -> memval_lessdef v2 v1 -> v1 = v2.
Lemma mem_lessdef_equiv m1 m2 : mem_lessdef m1 m2 -> mem_lessdef m2 m1 ->  mem_equiv m1 m2.
Lemma mem_equiv_refl m : mem_equiv m m.
Lemma mem_lessalloc_refl m : mem_lessalloc m m.
Lemma mem_equiv_refl' m m' : m = m' -> mem_equiv m m'.
Lemma mem_lessalloc_refl' m m' : m = m' -> mem_lessalloc m m'.
Lemma mem_equiv_sym m1 m2 : mem_equiv m1 m2 -> mem_equiv m2 m1.
Lemma mem_equiv_trans m1 m2 m3 :
mem_equiv m1 m2 ->
mem_equiv m2 m3 ->
mem_equiv m1 m3.
Lemma mem_lessalloc_trans m1 m2 m3 :
mem_lessalloc m1 m2 ->
mem_lessalloc m2 m3 ->
mem_lessalloc m1 m3.
Lemma mem_equiv_lessalloc m1 m2 : mem_equiv m1 m2 -> mem_lessalloc m1 m2.
Lemma mem_lessalloc_lessdef m1 m2 : mem_lessalloc m1 m2 -> mem_lessdef m1 m2.
Lemma mem_equiv_lessdef m1 m2 : mem_equiv m1 m2 -> mem_lessdef m1 m2.
Lemma mem_lessdef_valid_pointer:
forall m1 m2 b z,
mem_lessdef m1 m2 ->
Mem.valid_pointer m1 b z = true ->
Mem.valid_pointer m2 b z = true.
Lemma mem_lessdef_weak_valid_pointer:
forall m1 m2 b z,
mem_lessdef m1 m2 ->
Mem.weak_valid_pointer m1 b z = true ->
Mem.weak_valid_pointer m2 b z = true.