(** * Compatibility of evaluation functions with respect to memory injections. *)
Remark val_inject_val_of_bool:
forall f b, val_inject f (Val.of_bool b) (Val.of_bool b).
Remark val_inject_val_of_optbool:
forall f ob, val_inject f (Val.of_optbool ob) (Val.of_optbool ob).
Ltac TrivialExists :=
match goal with
| [ |- exists y, Some ?x = Some y /\ val_inject _ _ _ ] =>
exists x; split; [auto | try(econstructor; eauto)]
| [ |- exists y, _ /\ val_inject _ (Vint ?x) _ ] =>
exists (Vint x); split; [eauto with evalexpr | constructor]
| [ |- exists y, _ /\ val_inject _ (Vfloat ?x) _ ] =>
exists (Vfloat x); split; [eauto with evalexpr | constructor]
| [ |- exists y, _ /\ val_inject _ (Vlong ?x) _ ] =>
exists (Vlong x); split; [eauto with evalexpr | constructor]
| _ => idtac
end.
(** Compatibility of [eval_unop] with respect to [val_inject]. *)

(* Specifications: *)
Lemma eval_unop_compat:
forall f op v1 tv1 v,
eval_unop op v1 = Some v ->
val_inject f v1 tv1 ->
exists tv,
eval_unop op tv1 = Some tv
/\ val_inject f v tv.
Lemma eval_unop_compat:
forall f op v1 tv1 v,
eval_unop op v1 = Some v ->
val_inject f v1 tv1 ->
exists tv,
eval_unop op tv1 = Some tv
/\ val_inject f v tv.