(** ** Converting a forward simulation to a backward simulation *)
Section FORWARD_TO_BACKWARD.
Context L1 L2 index order match_states (FS: fsim_properties L1 L2 index order match_states).
Hypothesis L1_receptive: receptive L1.
Hypothesis L2_determinate: determinate L2.
(** Exploiting forward simulation *)
Inductive f2b_transitions: state L1 -> state L2 -> Prop :=
| f2b_trans_final: forall s1 s2 s1' r,
Star L1 s1 E0 s1' ->
final_state L1 s1' r ->
final_state L2 s2 r ->
f2b_transitions s1 s2
| f2b_trans_step: forall s1 s2 s1' t s1'' s2' i' i'',
Star L1 s1 E0 s1' ->
Step L1 s1' t s1'' ->
Plus L2 s2 t s2' ->
match_states i' s1' s2 ->
match_states i'' s1'' s2' ->
f2b_transitions s1 s2.

(* Specifications: *)
Lemma f2b_progress:
forall i s1 s2, match_states i s1 s2 -> safe L1 s1 -> f2b_transitions s1 s2.
Lemma fsim_simulation_not_E0:
forall s1 t s1', Step L1 s1 t s1' -> t <> E0 ->
forall i s2, match_states i s1 s2 ->
exists i', exists s2', Plus L2 s2 t s2' /\ match_states i' s1' s2'.
Lemma f2b_progress:
forall i s1 s2, match_states i s1 s2 -> safe L1 s1 -> f2b_transitions s1 s2.
Lemma fsim_simulation_not_E0:
forall s1 t s1', Step L1 s1 t s1' -> t <> E0 ->
forall i s2, match_states i s1 s2 ->
exists i', exists s2', Plus L2 s2 t s2' /\ match_states i' s1' s2'.