Fact map_symb_sigma A :
    List.map symb (List.map sigma A) = List.map sym A.Ltac rep_listInv := repeat listInv.Ltac confeq :=
    unfold step; unfold mk_srconf;
    match goal with
      | [ |- (_::_ = _::_) /\ _ ] => split
      | [ |- (_::_ = _::_)] => reflexivity                            
      | [H: ctape _ = _ |- (_ = _) /\ _ ] => rewrite H
      | [H: trans(_,_) = _ |- _ ] => rewrite H          
      | [H: _ |- mk_mconfig _ _ = mk_mconfig _  _ /\ _ ] => split
      | [ |- mk_mconfig _ _ = mk_mconfig _ _ ] => reflexivity
      | [H: (?q,_) el list_prod not_halting_states _ |- halt ?q = false ] =>
        apply in_prod_iff in H as [? _]; now apply not_halting
      | [H: _ el not_halting_states |- halt _ = false] => now apply not_halting
        end; subst; cbn in *; try now rewrite !map_app, <- !app_assoc.Ltac rep_confeq := repeat confeq.Ltac solve_inv := repeat (state_inv || confeq || listInv).

(* Specifications: *)
Lemma rewrite_step_halt (c1: conf) y: rew' TMrules (mk_srconf c1) y -> (y = (mk_srconf (step c1)) /\ (halt (cstate c1) = false)).
Lemma rewrite_steps_halt (c1: conf) y: rewt' TMrules (mk_srconf c1) y -> exists c2, y = (mk_srconf c2).
Theorem reach_rewrite (c1 c2:conf): reach c1 c2 <-> rewt' TMrules (mk_srconf c1) (mk_srconf c2).