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 internal_step_diagram: forall (m : option mem) (sge tge : HybridMachineSig.G) (U : list nat) tr1 (st1 : ThreadPool (Some hb)) (m1 : mem) (st1' : ThreadPool (Some hb)) (m1' : mem), machine_semantics.thread_step (HybConcSem (Some hb) m) sge U st1 m1 st1' m1' -> forall (cd : option compiler_index) tr2 (st2 : ThreadPool (Some (S hb))) (mu : meminj) (m2 : mem), concur_match cd mu st1 m1 st2 m2 -> forall (Hmatch_event : List.Forall2 (inject_mevent mu) tr1 tr2), exists (st2' : ThreadPool (Some (S hb))) (m2' : mem) (cd' : option compiler_index) (mu' : meminj), concur_match cd' mu' st1' m1' st2' m2' /\ List.Forall2 (inject_mevent mu') tr1 tr2 /\ (machine_semantics_lemmas.thread_step_plus (HybConcSem (Some (S hb)) m) tge U st2 m2 st2' m2' \/ machine_semantics_lemmas.thread_step_star (HybConcSem (Some (S hb)) m) tge U st2 m2 st2' m2' /\ ord_opt (Injorder compiler_sim) cd' cd).