Ltac exploit_match:=
unfold match_thread_target,match_thread_source,match_thread_compiled in *;
match goal with
| [ H: getThreadC ?i = _ ?c,
H0: context[match_state2match_thread] |- _ ] =>
rewrite H in H0; inversion H0; subst; simpl in *; clear H0
end;
fold match_thread_target in *;
fold match_thread_source in *;
fold match_thread_compiled in *.
(* Build the concur_match *)
Ltac destroy_ev_step_sum:=
match goal with
| [ H: ev_step_sum _ _ _ _ _ _ _ |- _ ] => inversion H; clear H
end.

Lemma self_simulation_plus:
forall state coresem
(SIM: self_simulation.self_simulation state coresem),
forall (f : meminj) (t : Events.trace) (c1 : state)
(m1 : mem) (c2 : state) (m2 : mem),
self_simulation.match_self (self_simulation.code_inject _ _ SIM) f c1 m1 c2 m2 ->
forall (c1' : state) (m1' : mem),
(corestep_plus coresem) c1 m1 c1' m1' ->
exists (c2' : state) (f' : meminj) (t' : Events.trace)
(m2' : mem),
(corestep_plus coresem) c2 m2 c2' m2' /\
self_simulation.match_self (self_simulation.code_inject _ _ SIM) f' c1' m1' c2' m2' /\
inject_incr f f' /\
self_simulation.is_ext f (Mem.nextblock m1) f' (Mem.nextblock m2) /\
Events.inject_trace f' t t'.