CoFixpoint build_traceinf' (s1: state L) (t1: trace) (ST: Star L s0 t1 s1) : traceinf' :=
  match reacts' ST with
  | existT s2 (exist t2 (conj A B)) =>
      Econsinf' t2
                (build_traceinf' (star_trans ST A (eq_refl _)))
                B
  end.

(* Specifications: *)
Lemma reacts_forever_reactive_rec: forall s1 t1 (ST: Star L s0 t1 s1), Forever_reactive L s1 (traceinf_of_traceinf' (build_traceinf' ST)).
Lemma reacts_forever_reactive: exists T, Forever_reactive L s0 T.
Lemma diverges_forever_silent: forall s0, (forall s1 t1, Star L s0 t1 s1 -> exists s2, Step L s1 E0 s2) -> Forever_silent L s0.
Lemma state_behaves_exists: forall s, exists beh, state_behaves s beh.
Theorem program_behaves_exists: exists beh, program_behaves beh.
Lemma forward_simulation_state_behaves: forall i s1 s2 beh1, match_states i s1 s2 -> state_behaves L1 s1 beh1 -> exists beh2, state_behaves L2 s2 beh2 /\ behavior_improves beh1 beh2.
Theorem forward_simulation_behavior_improves: forall L1 L2, forward_simulation L1 L2 -> forall beh1, program_behaves L1 beh1 -> exists beh2, program_behaves L2 beh2 /\ behavior_improves beh1 beh2.
Lemma reacts_forever_reactive_rec: forall s1 t1 (ST: Star L s0 t1 s1), Forever_reactive L s1 (traceinf_of_traceinf' (build_traceinf' ST)).
Lemma reacts_forever_reactive: exists T, Forever_reactive L s0 T.
Lemma diverges_forever_silent: forall s0, (forall s1 t1, Star L s0 t1 s1 -> exists s2, Step L s1 E0 s2) -> Forever_silent L s0.
Lemma state_behaves_exists: forall s, exists beh, state_behaves s beh.
Theorem program_behaves_exists: exists beh, program_behaves beh.
Lemma forward_simulation_state_behaves: forall i s1 s2 beh1, match_states i s1 s2 -> state_behaves L1 s1 beh1 -> exists beh2, state_behaves L2 s2 beh2 /\ behavior_improves beh1 beh2.
Theorem forward_simulation_behavior_improves: forall L1 L2, forward_simulation L1 L2 -> forall beh1, program_behaves L1 beh1 -> exists beh2, program_behaves L2 beh2 /\ behavior_improves beh1 beh2.