(** Associating behaviors to programs. *)
Section PROGRAM_BEHAVIORS.
Variable L: semantics.
Inductive state_behaves (s: state L): program_behavior -> Prop :=
| state_terminates: forall t s' r,
Star L s t s' ->
final_state L s' r ->
state_behaves s (Terminates t r)
| state_diverges: forall t s',
Star L s t s' -> Forever_silent L s' ->
state_behaves s (Diverges t)
| state_reacts: forall T,
Forever_reactive L s T ->
state_behaves s (Reacts T)
| state_goes_wrong: forall t s',
Star L s t s' ->
Nostep L s' ->
(forall r, ~final_state L s' r) ->
state_behaves s (Goes_wrong t).
Inductive program_behaves: program_behavior -> Prop :=
| program_runs: forall s beh,
initial_state L s -> state_behaves s beh ->
program_behaves beh
| program_goes_initially_wrong:
(forall s, ~initial_state L s) ->
program_behaves (Goes_wrong E0).

(* Specifications: *)
Lemma state_behaves_app:
forall s1 t s2 beh,
Star L s1 t s2 -> state_behaves s2 beh -> state_behaves s1 (behavior_app t beh).