End EVENTVAL_INJECT.
(** * Matching traces. *)
Section MATCH_TRACES.
Variable ge: Senv.t.
(** Matching between traces corresponding to single transitions. Arguments (provided by the program) must be equal. Results (provided by the outside world) can vary as long as they can be converted safely to values. *)
Inductive match_traces: trace -> trace -> Prop :=
| match_traces_E0:
match_traces nil nil
| match_traces_syscall: forall id args res1 res2,
eventval_valid ge res1 -> eventval_valid ge res2 -> eventval_type res1 = eventval_type res2 ->
match_traces (Event_syscall id args res1 :: nil) (Event_syscall id args res2 :: nil)
| match_traces_vload: forall chunk id ofs res1 res2,
eventval_valid ge res1 -> eventval_valid ge res2 -> eventval_type res1 = eventval_type res2 ->
match_traces (Event_vload chunk id ofs res1 :: nil) (Event_vload chunk id ofs res2 :: nil)
| match_traces_vstore: forall chunk id ofs arg,
match_traces (Event_vstore chunk id ofs arg :: nil) (Event_vstore chunk id ofs arg :: nil)
| match_traces_annot: forall id args,
match_traces (Event_annot id args :: nil) (Event_annot id args :: nil).
End MATCH_TRACES.
(** Invariance by change of global environment *)
Section MATCH_TRACES_INV.
Variables ge1 ge2: Senv.t.
Hypothesis public_preserved:
forall id, Senv.public_symbol ge2 id = Senv.public_symbol ge1 id.

Lemma match_traces_preserved:
forall t1 t2, match_traces ge1 t1 t2 -> match_traces ge2 t1 t2.