(* * Copying Machines and Helper functions for verifying machines using [CopySymbols] ane [MoveToSymbol] *)
From Undecidability Require Export TM.Compound.CopySymbols TM.Compound.MoveToSymbol.
Local Generalizable All Variables.
Set Default Proof Using "Type".
(* Don't simplify [skipn (S n) xs]; only, if the number and the lists are constructors *)
Local Arguments skipn { A } !n !l.
Local Arguments plus : simpl never.
Local Arguments mult : simpl never.

Corollary CopySymbols_L_correct t str1 x str2 :
(forall x, List.In x str1 -> stop x = false) ->
(stop x = true) ->
tape_local_l (fst t) = str1 ++ x :: str2 ->
CopySymbols_L_Fun stop t =
(midtape str2 x (rev str1 ++ right (fst t)),
midtape (skipn (|str1|) (left (snd t))) x (rev str1 ++ right (snd t))).