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)).

Lemma LiftTapes_unlift (k : nat)
(c1 : mconfig sig (state (LiftTapes_TM)) n)
(c2 : mconfig sig (state (LiftTapes_TM)) m) :
loopM (M := projT1 pM) (selectConf c1) k = Some c2 ->
exists c2' : mconfig sig (state (LiftTapes_TM)) n,
loopM (M := LiftTapes_TM) c1 k = Some c2' /\
c2 = selectConf c2'.