Notation meminj := Val.meminj.(** Monotone evolution of a memory injection. *)

Definition inject_incr (f1 f2: meminj) : Prop :=
  forall b b' delta, f1 b = Some(b', delta) -> f2 b = Some(b', delta).

(* Specifications: *)
Lemma inject_incr_refl : forall f , inject_incr f f .
Lemma inject_incr_trans : forall f1 f2 f3, inject_incr f1 f2 -> inject_incr f2 f3 -> inject_incr f1 f3 .
Lemma val_inject_incr: forall f1 f2 v v', inject_incr f1 f2 -> Val.inject f1 v v' -> Val.inject f2 v v'.
Lemma val_inject_list_incr: forall f1 f2 vl vl' , inject_incr f1 f2 -> Val.inject_list f1 vl vl' -> Val.inject_list f2 vl vl'.
Lemma val_inject_lessdef: forall v1 v2, Val.lessdef v1 v2 <-> Val.inject (fun b => Some(b, 0)) v1 v2.
Lemma val_inject_list_lessdef: forall vl1 vl2, Val.lessdef_list vl1 vl2 <-> Val.inject_list (fun b => Some(b, 0)) vl1 vl2.
Lemma inject_incr_refl : forall f , inject_incr f f .
Lemma inject_incr_trans : forall f1 f2 f3, inject_incr f1 f2 -> inject_incr f2 f3 -> inject_incr f1 f3 .
Lemma val_inject_incr: forall f1 f2 v v', inject_incr f1 f2 -> Val.inject f1 v v' -> Val.inject f2 v v'.
Lemma val_inject_list_incr: forall f1 f2 vl vl' , inject_incr f1 f2 -> Val.inject_list f1 vl vl' -> Val.inject_list f2 vl vl'.
Lemma val_inject_lessdef: forall v1 v2, Val.lessdef v1 v2 <-> Val.inject (fun b => Some(b, 0)) v1 v2.
Lemma val_inject_list_lessdef: forall vl1 vl2, Val.lessdef_list vl1 vl2 <-> Val.inject_list (fun b => Some(b, 0)) vl1 vl2.