End SIMULATION_STEP.
(** Simulation when one transition in the first program corresponds to zero or one transitions in the second program. However, there is no stuttering: infinitely many transitions in the source program must correspond to infinitely many transitions in the second program. *)
Section SIMULATION_OPT.
Variable measure: state L1 -> nat.
Hypothesis simulation:
forall s1 t s1', Step L1 s1 t s1' ->
forall s2, match_states s1 s2 ->
(exists s2', Step L2 s2 t s2' /\ match_states s1' s2')
\/ (measure s1' < measure s1 /\ t = E0 /\ match_states s1' s2)%nat.

(* Specifications: *)
Lemma forward_simulation_opt: forward_simulation L1 L2.
Lemma fsim_properties_opt:
fsim_properties L1 L2 _ (ltof _ measure)
(fun (idx s1 : state L1) (s2 : state L2) => idx = s1 /\ match_states s1 s2).