(** 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.