Inductive tstate: Type :=
  ST: forall (s: state) (T: traceinf), forever step s T -> tstate.Inductive tstate: Type :=
  ST: forall (s: state) (T: traceinf), forever step s T -> tstate.Definition state_of_tstate (S: tstate): state :=
  match S with ST s T F => s end.Definition traceinf_of_tstate (S: tstate) : traceinf :=
  match S with ST s T F => T end.Inductive tsteps: tstate -> tstate -> Prop :=
  | tsteps_refl: forall S, tsteps S S
  | tsteps_left: forall t S1 S2 S3, tstep t S1 S2 -> tsteps S2 S3 -> tsteps S1 S3.Inductive tsteps: tstate -> tstate -> Prop :=
  | tsteps_refl: forall S, tsteps S S
  | tsteps_left: forall t S1 S2 S3, tstep t S1 S2 -> tsteps S2 S3 -> tsteps S1 S3.Inductive tsteps: tstate -> tstate -> Prop :=
  | tsteps_refl: forall S, tsteps S S
  | tsteps_left: forall t S1 S2 S3, tstep t S1 S2 -> tsteps S2 S3 -> tsteps S1 S3.Remark tsteps_trans:
  forall S1 S2, tsteps S1 S2 -> forall S3, tsteps S2 S3 -> tsteps S1 S3.

(* Specifications: *)
Lemma treactive_or_tsilent: forall S, treactive S \/ (exists S', tsteps S S' /\ tsilent S').
Lemma tsilent_forever_silent: forall S, tsilent S -> forever_silent step (state_of_tstate S).
Lemma treactive_forever_reactive: forall S, treactive S -> forever_reactive step (state_of_tstate S) (traceinf_of_tstate S).
Lemma behavior_bigstep_terminates: forall t r, bigstep_terminates B t r -> program_behaves L (Terminates t r).
Lemma behavior_bigstep_diverges: forall T, bigstep_diverges B T -> program_behaves L (Reacts T) \/ exists t, program_behaves L (Diverges t) /\ traceinf_prefix t T.