Section FORWARD_SIMU_DETERM.
Variable L1: semantics.
Variable L2: semantics.
Hypothesis L1det: determinate L1.
Variable index: Type.
Variable order: index -> index -> Prop.
Hypothesis wf_order: well_founded order.
Variable match_states: index -> state L1 -> state L2 -> Prop.
Hypothesis match_initial_states:
forall s1, initial_state L1 s1 ->
exists i s2, initial_state L2 s2 /\ match_states i s1 s2.
Hypothesis match_final_states:
forall i s1 s2 r,
match_states i s1 s2 ->
final_state L1 s1 r ->
final_state L2 s2 r.
Hypothesis simulation:
forall s1 t s1', Step L1 s1 t s1' ->
forall i s2, match_states i s1 s2 ->
exists s1'' i' s2',
Star L1 s1' E0 s1''
/\ (Plus L2 s2 t s2' \/ (Star L2 s2 t s2' /\ order i' i))
/\ match_states i' s1'' s2'.
Hypothesis public_preserved:
forall id, Senv.public_symbol (symbolenv L2) id = Senv.public_symbol (symbolenv L1) id.
Inductive match_states_later: index * nat -> state L1 -> state L2 -> Prop :=
| msl_now: forall i s1 s2,
match_states i s1 s2 -> match_states_later (i, O) s1 s2
| msl_later: forall i n s1 s1' s2,
Step L1 s1 E0 s1' -> match_states_later (i, n) s1' s2 -> match_states_later (i, S n) s1 s2.

Lemma star_match_states_later:
forall s1 s1', Star L1 s1 E0 s1' ->
forall i s2, match_states i s1' s2 ->
exists n, match_states_later (i, n) s1 s2.