(** Here is an alternate formulation of [parmove], where the
  parallel move problem is given as two separate lists of sources
  and destinations. *)

Definition parmove2 (sl dl: list reg) : moves :=
  parmove (List.combine sl dl).

(* Specifications: *)
Theorem parmove2_correctness: forall sl dl, List.length sl = List.length dl -> list_norepet dl -> (forall r, In r sl -> is_not_temp r) -> (forall r, In r dl -> is_not_temp r) -> forall e, let e' := exec_seq (parmove2 sl dl) e in List.map e' dl = List.map e sl /\ forall r, ~In r dl -> is_not_temp r -> e' r = e r.
Theorem parmove2_correctness: forall sl dl, List.length sl = List.length dl -> list_norepet dl -> (forall r, In r sl -> is_not_temp r) -> (forall r, In r dl -> is_not_temp r) -> forall e, let e' := exec_seq (parmove2 sl dl) e in List.map e' dl = List.map e sl /\ forall r, ~In r dl -> is_not_temp r -> e' r = e r.