Section corollary.
Definition injclosed (P : Event.t -> Prop) :=
forall vals1 vals2 orv1 orv2 m1 m2 m1' m2' j j',
P (Event.mk m1 m1' vals1 orv1) ->
Mem.inject (as_inj j) m1 m2 ->
val_list_inject (as_inj j) vals1 vals2 ->
Mem.inject (as_inj j') m1' m2' ->
oval_inject (as_inj j') orv1 orv2 ->
P (Event.mk m2 m2' vals2 orv2).
Definition tracepred := list (Event.t -> Prop).
Fixpoint tracepred_injclosed (Ps : tracepred) :=
match Ps with
| nil => True
| P :: Ps' => injclosed P /\ tracepred_injclosed Ps'
end.
Fixpoint app_tracepred (Ps : tracepred) (tr : list Event.t) :=
match Ps, tr with
| P :: Ps', ev :: tr' => P ev /\ app_tracepred Ps' tr'
| _, _ => True
end.

Lemma app_match_trace (Ps : tracepred) tr tr' :
tracepred_injclosed Ps ->
match_trace tr tr' ->
app_tracepred Ps tr ->
app_tracepred Ps tr'.