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).
Fixpoint einit_regs (rl: list reg) : aenv :=
match rl with
| r1 :: rs => AE.set r1 (Ifptr Nonstack) (einit_regs rs)
| nil => AE.top
end.
Fixpoint eforget (rl: list reg) (ae: aenv) {struct rl} : aenv :=
match rl with
| nil => ae
| r1 :: rs => eforget rs (AE.set r1 Vtop ae)
end.

Lemma ematch_forget:
forall e rl ae, ematch e ae -> ematch e (eforget rl ae).