(** Determinism for program executions *)

Definition same_behaviors (beh1 beh2: program_behavior) : Prop :=
  match beh1, beh2 with
  | Terminates t1 r1, Terminates t2 r2 => t1 = t2 /\ r1 = r2
  | Diverges t1, Diverges t2 => t1 = t2
  | Reacts t1, Reacts t2 => traceinf_sim t1 t2
  | Goes_wrong t1, Goes_wrong t2 => t1 = t2
  | _, _ => False
  end.

(* Specifications: *)
Lemma state_behaves_deterministic: forall s beh1 beh2, state_behaves L s beh1 -> state_behaves L s beh2 -> same_behaviors beh1 beh2.
Theorem program_behaves_deterministic: forall beh1 beh2, program_behaves L beh1 -> program_behaves L beh2 -> same_behaviors beh1 beh2.
Lemma state_behaves_deterministic: forall s beh1 beh2, state_behaves L s beh1 -> state_behaves L s beh2 -> same_behaviors beh1 beh2.
Theorem program_behaves_deterministic: forall beh1 beh2, program_behaves L beh1 -> program_behaves L beh2 -> same_behaviors beh1 beh2.