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.

Lemma treactive_or_tsilent: forall S, treactive S \/ (exists S', tsteps S S' /\ tsilent S').