Section rev.
Definition Trans_rev(tr:Trans) :=
let (s',d,o):=tr in
{| nxt:=s'; dir:=Dir_rev d; out:=o |}.
Definition option_Trans_rev(o:option Trans) :=
match o with
| None => None
| Some tr => Some (Trans_rev tr)
end.
Definition TM_rev(tm:TM) :=
fun s i => option_Trans_rev (tm s i).
Definition Tape_rev(t:Z->Σ) :=
fun x:Z => t (-x)%Z.
Definition ExecState_rev(st:ExecState) :=
let (s,t):=st in
(s,Tape_rev t).
End rev.
End TM.
Definition UnusedState(tm:TM Σ)(s:St): Prop :=
(forall s0 i,
match tm s0 i with
| None => True
| Some tr => nxt Σ tr <> s
end) /\
(forall i, tm s i = None) /\
s <> St0.
Definition isUnusedState tm s: bool :=
forallb_St (fun s0 =>
forallb_Σ (fun i =>
match tm s0 i with
| None => true
| Some tr => negb (St_eqb (nxt Σ tr) s)
end)) &&&
forallb_Σ (fun i => match tm s i with None => true | _ => false end) &&&
negb (St_eqb s St0).
Ltac Σ_eq_dec s1 s2 :=
eq_dec Σ_eqb_spec Σ_eqb s1 s2.

Lemma HaltTimeUpperBound_LE_HaltsAtES_UnusedState{tm n s t bb}:
HaltsAt _ tm n (InitES Σ Σ0) ->
Steps _ tm n (InitES Σ Σ0) (s,t) ->
forall s1 s2 d o,
UnusedState tm s1 ->
UnusedState tm s2 ->
HaltTimeUpperBound _ bb (InitES Σ Σ0) (LE Σ (TM_upd Σ Σ_eqb tm s (t Z0) (Some {| nxt:=s1; dir:=d; out:=o |}))) ->
HaltTimeUpperBound _ bb (InitES Σ Σ0) (LE Σ (TM_upd Σ Σ_eqb tm s (t Z0) (Some {| nxt:=s2; dir:=d; out:=o |}))).