Ltac memval_lessdef_tac :=
match goal with
 | H: memval_lessdef ?a ?b |- _ => destruct a,b; inv H
 | H: list_forall2 _ ?a ?b |- _ => destruct a,b; inv H
 | H: proj_bytes ?a = Some _ |- _ => match a with context [nil] => inv H end
end;
 try discriminate;
 try solve [unfold decode_val; simpl; auto] .

(* Specifications: *)
Lemma mem_lessdef_proj_bytes: forall vl vl', list_forall2 memval_lessdef vl vl' -> forall bl, proj_bytes vl = Some bl -> proj_bytes vl' = Some bl.
Lemma mem_lessdef_decode_val: forall ch vl vl', list_forall2 memval_lessdef vl vl' -> Val.lessdef (decode_val ch vl) (decode_val ch vl').
Lemma mem_lessdef_loadbytes: forall m1 m2, mem_lessdef m1 m2 -> forall b z n v1, Mem.loadbytes m1 b z n = Some v1 -> exists v2, list_forall2 memval_lessdef v1 v2 /\ Mem.loadbytes m2 b z n = Some v2.
Lemma valid_pointer_lessalloc {m m2} (M:mem_lessalloc m m2): Mem.valid_pointer m = Mem.valid_pointer m2.
Lemma weak_valid_pointer_lessalloc {m m2} (M:mem_lessalloc m m2): Mem.weak_valid_pointer m = Mem.weak_valid_pointer m2.