Ltac TransfInstr :=
match goal with
| H1: (PTree.get ?pc (fn_code ?f) = Some ?instr),
H2: (analyze ?rm ?f)#?pc = VA.State ?ae ?am |- _ =>
generalize (transf_instr_at rm _ _ _ H1); unfold transf_instr; rewrite H2
end.
(** The proof of simulation proceeds by case analysis on the transition taken in the source code. *)

(* Specifications: *)
Lemma transf_step_correct:
forall s1 t s2,
step ge s1 t s2 ->
forall n1 s1' (SS: sound_state prog s1) (MS: match_states n1 s1 s1'),
(exists n2, exists s2', step tge s1' t s2' /\ match_states n2 s2 s2')
\/ (exists n2, n2 < n1 /\ t = E0 /\ match_states n2 s2 s1')%nat.
Lemma transf_initial_states:
forall st1, initial_state prog st1 ->
exists n, exists st2, initial_state tprog st2 /\ match_states n st1 st2.
Lemma transf_final_states:
forall n st1 st2 r,
match_states n st1 st2 -> final_state st1 r -> final_state st2 r.