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

(* Specifications: *)
Lemma add_moves_unchanged:
forall srcs dsts pc2 s pc1 s' i pc,
add_moves srcs dsts pc2 s = R pc1 s' i ->
Plt pc s.(st_nextnode) \/ Ple s'.(st_nextnode) pc ->
s'.(st_code)!pc = s.(st_code)!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.