(** * Abstracting RTL register environments *)
Module AVal <: SEMILATTICE_WITH_TOP.
Definition t := aval.
Definition eq (x y: t) := (x = y).
Definition eq_refl: forall x, eq x x := (@eq_refl t).
Definition eq_sym: forall x y, eq x y -> eq y x := (@eq_sym t).
Definition eq_trans: forall x y z, eq x y -> eq y z -> eq x z := (@eq_trans t).
Definition beq (x y: t) : bool := proj_sumbool (eq_aval x y).

(* Specifications: *)
Lemma beq_correct: forall x y, beq x y = true -> eq x y.
Lemma ematch_update:
forall e ae v av r,
ematch e ae -> vmatch bc v av -> ematch (e#r <- v) (AE.set r av ae).