Ltac use_star_step_triangle :=
match goal with
| [ S1: Star ?L _ ?t1 _, S2: Star ?L _ ?t2 ?s2, NO: Nostep ?L ?s2 |- _ ] =>
let t := fresh "t" in let P := fresh "P" in let EQ := fresh "EQ" in
destruct (star_step_triangle _ _ _ _ _ S1 S2 NO)
as [t [P EQ]]; subst
end.

(* Specifications: *)
Lemma steps_deterministic:
forall s0 t1 s1 t2 s2,
Star L s0 t1 s1 -> Star L s0 t2 s2 ->
Nostep L s1 -> Nostep L s2 ->
t1 = t2 /\ s1 = s2.
Lemma terminates_not_goes_wrong:
forall s t1 s1 r t2 s2,
Star L s t1 s1 -> final_state L s1 r ->
Star L s t2 s2 -> Nostep L s2 ->
(forall r, ~final_state L s2 r) -> False.