(** The relation [env_match] holds between two environments [e1] and [e2] if they assign the same values to all registers not in the adherence set. *)
Definition env_match (e1 e2: env) : Prop :=
forall r, no_adherence r -> e1 r = e2 r.
(** The following lemmas relate the effect of executing moves using normal, overlap-unaware update and weak, overlap-aware update. *)

(* Specifications: *)
Lemma weak_update_match:
forall e1 e2 s d,
(In s (srcs mu) \/ is_temp s) ->
(In d (dests mu) \/ is_temp d) ->
env_match e1 e2 ->
env_match (update d (e1 s) e1)
(weak_update d (e2 s) e2).
Lemma weak_exec_seq_match:
forall m e1 e2,
(forall s, In s (srcs m) -> In s (srcs mu) \/ is_temp s) ->
(forall d, In d (dests m) -> In d (dests mu) \/ is_temp d) ->
env_match e1 e2 ->
env_match (exec_seq m e1) (weak_exec_seq m e2).
Lemma weak_update_match:
forall e1 e2 s d,
(In s (srcs mu) \/ is_temp s) ->
(In d (dests mu) \/ is_temp d) ->
env_match e1 e2 ->
env_match (update d (e1 s) e1)
(weak_update d (e2 s) e2).
Lemma weak_exec_seq_match:
forall m e1 e2,
(forall s, In s (srcs m) -> In s (srcs mu) \/ is_temp s) ->
(forall d, In d (dests m) -> In d (dests mu) \/ is_temp d) ->
env_match e1 e2 ->
env_match (exec_seq m e1) (weak_exec_seq m e2).