End CLOSURES.
(** * Transition semantics *)
(** The general form of a transition semantics. *)
Record semantics : Type := Semantics_gen {
state: Type;
genvtype: Type;
step : genvtype -> state -> trace -> state -> Prop;
initial_state: state -> Prop;
final_state: state -> int -> Prop;
globalenv: genvtype;
symbolenv: Senv.t
}.
(** The form used in earlier CompCert versions, for backward compatibility. *)
Definition Semantics {state funtype vartype: Type}
(step: Genv.t funtype vartype -> state -> trace -> state -> Prop)
(initial_state: state -> Prop)
(final_state: state -> int -> Prop)
(globalenv: Genv.t funtype vartype) :=
{| state := state;
genvtype := Genv.t funtype vartype;
step := step;
initial_state := initial_state;
final_state := final_state;
globalenv := globalenv;
symbolenv := Genv.to_senv globalenv |}.
(** Handy notations. *)
Notation " 'Step' L " := (step L (globalenv L)) (at level 1) : smallstep_scope.
Notation " 'Star' L " := (star (step L) (globalenv L)) (at level 1) : smallstep_scope.
Notation " 'Plus' L " := (plus (step L) (globalenv L)) (at level 1) : smallstep_scope.
Notation " 'Forever_silent' L " := (forever_silent (step L) (globalenv L)) (at level 1) : smallstep_scope.
Notation " 'Forever_reactive' L " := (forever_reactive (step L) (globalenv L)) (at level 1) : smallstep_scope.
Notation " 'Nostep' L " := (nostep (step L) (globalenv L)) (at level 1) : smallstep_scope.
Open Scope smallstep_scope.
(** * Forward simulations between two transition semantics. *)
(** The general form of a forward simulation. *)
Record fsim_properties (L1 L2: semantics) (index: Type)
(order: index -> index -> Prop)
(match_states: index -> state L1 -> state L2 -> Prop) : Prop := {
fsim_order_wf: well_founded order;
fsim_match_initial_states:
forall s1, initial_state L1 s1 ->
exists i, exists s2, initial_state L2 s2 /\ match_states i s1 s2;
fsim_match_final_states:
forall i s1 s2 r,
match_states i s1 s2 -> final_state L1 s1 r -> final_state L2 s2 r;
fsim_simulation:
forall s1 t s1', Step L1 s1 t s1' ->
forall i s2, match_states i s1 s2 ->
exists i', exists s2',
(Plus L2 s2 t s2' \/ (Star L2 s2 t s2' /\ order i' i))
/\ match_states i' s1' s2';
fsim_public_preserved:
forall id, Senv.public_symbol (symbolenv L2) id = Senv.public_symbol (symbolenv L1) id
}.
Arguments fsim_properties: clear implicits.
Inductive forward_simulation (L1 L2: semantics) : Prop :=
Forward_simulation (index: Type)
(order: index -> index -> Prop)
(match_states: index -> state L1 -> state L2 -> Prop)
(props: fsim_properties L1 L2 index order match_states).
Arguments Forward_simulation {L1 L2 index} order match_states props.
(** An alternate form of the simulation diagram *)

Lemma fsim_simulation':
forall L1 L2 index order match_states, fsim_properties L1 L2 index order match_states ->
forall i s1 t s1', Step L1 s1 t s1' ->
forall s2, match_states i s1 s2 ->
(exists i', exists s2', Plus L2 s2 t s2' /\ match_states i' s1' s2')
\/ (exists i', order i' i /\ t = E0 /\ match_states i' s1' s2).