(** ** Relational specification of the translation of moves *)
Inductive tr_moves (c: code) : node -> list reg -> list reg -> node -> Prop :=
| tr_moves_cons: forall pc1 src srcs dst dsts pc2 pc3,
tr_moves c pc1 srcs dsts pc2 ->
c!pc2 = Some(Iop Omove (src :: nil) dst pc3) ->
tr_moves c pc1 (src :: srcs) (dst :: dsts) pc3
| tr_moves_nil: forall srcs dsts pc,
srcs = nil \/ dsts = nil ->
tr_moves c pc srcs dsts pc.

Lemma add_moves_spec:
forall srcs dsts pc2 s pc1 s' i c,
add_moves srcs dsts pc2 s = R pc1 s' i ->
(forall pc, Ple s.(st_nextnode) pc -> Plt pc s'.(st_nextnode) -> c!pc = s'.(st_code)!pc) ->
tr_moves c pc1 srcs dsts pc2.