(** * Relating values and event values *)
Set Implicit Arguments.
Section EVENTVAL.
(** Symbol environment used to translate between global variable names and their block identifiers. *)
Variable ge: Senv.t.
(** Translation between values and event values. *)
Inductive eventval_match: eventval -> typ -> val -> Prop :=
| ev_match_int: forall i,
eventval_match (EVint i) Tint (Vint i)
| ev_match_long: forall i,
eventval_match (EVlong i) Tlong (Vlong i)
| ev_match_float: forall f,
eventval_match (EVfloat f) Tfloat (Vfloat f)
| ev_match_single: forall f,
eventval_match (EVsingle f) Tsingle (Vsingle f)
| ev_match_ptr: forall id b ofs,
Senv.public_symbol ge id = true ->
Senv.find_symbol ge id = Some b ->
eventval_match (EVptr_global id ofs) Tptr (Vptr b ofs).
Inductive eventval_list_match: list eventval -> list typ -> list val -> Prop :=
| evl_match_nil:
eventval_list_match nil nil nil
| evl_match_cons:
forall ev1 evl ty1 tyl v1 vl,
eventval_match ev1 ty1 v1 ->
eventval_list_match evl tyl vl ->
eventval_list_match (ev1::evl) (ty1::tyl) (v1::vl).
(** Some properties of these translation predicates. *)

(* Specifications: *)
Lemma eventval_match_type:
forall ev ty v,
eventval_match ev ty v -> Val.has_type v ty.
Lemma eventval_list_match_length:
forall evl tyl vl, eventval_list_match evl tyl vl -> List.length vl = List.length tyl.
Lemma eventval_match_lessdef:
forall ev ty v1 v2,
eventval_match ev ty v1 -> Val.lessdef v1 v2 -> eventval_match ev ty v2.
Lemma eventval_list_match_lessdef:
forall evl tyl vl1, eventval_list_match evl tyl vl1 ->
forall vl2, Val.lessdef_list vl1 vl2 -> eventval_list_match evl tyl vl2.