Ltac DestructM :=
  match goal with
    [ H: exists p, _ /\ _ |- _ ] =>
      let p := fresh "p" in let M := fresh "M" in let MM := fresh "MM" in
      destruct H as (p & M & MM); clear H
  end.

Theorem c_semantic_preservation: forall p tp, match_prog p tp -> backward_simulation (Csem.semantics p) (Asm.semantics tp).