Ltac Kind :=
  exploit safe_expr_kind; eauto; simpl; intros X; rewrite <- X in *; clear X.Ltac Rec HR kind C C' :=
  destruct (HR kind (fun x => C(C' x))) as [? | [C'' [a' [D [A B]]]]];
  [eauto | eauto | auto |
   right; exists (fun x => C'(C'' x)); exists a'; rewrite D; auto].Ltac Base :=
  right; exists (fun x => x); econstructor; split; [eauto | simpl; auto].

Theorem step_simulation: forall S1 t S2, step S1 t S2 -> plus Csem.step ge S1 t S2.