Section LiftNM.
Variable sig : finType.
Variable m n : nat.
Variable F : finType.
Variable pM : pTM sig F m.
Variable I : Vector.t ((Fin.t n)) m.
Variable I_dupfree : dupfree I.
Definition LiftTapes_trans :=
fun '(q, sym ) =>
let (q', act) := trans (m := projT1 pM) (q, select I sym) in
(q', fill_default I (None, Nmove) act).
Definition LiftTapes_TM : TM sig n :=
{|
trans := LiftTapes_trans;
start := start (projT1 pM);
halt := halt (m := projT1 pM);
|}.
Definition LiftTapes : pTM sig F n := (LiftTapes_TM; projT2 pM).
Definition selectConf : mconfig sig (state LiftTapes_TM) n -> mconfig sig (state (projT1 pM)) m :=
fun c => mk_mconfig (cstate c) (select I (ctapes c)).
End LiftNM.
Arguments LiftTapes : simpl never.
Notation "pM @ ts" := (LiftTapes pM ts) (at level 41, only parsing).
(* * Tactic Support *)
(* TODO: Some of this is probably deprecated, e.g. the [app_tapes] stuff *)

Lemma smpl_dupfree_helper1 (n : nat) :
dupfree [|Fin.F1 (n := n)|].