Definition alist := list (ad * A).
Definition anil := nil (A:=(ad * A)).
Definition acons := cons (A:=(ad * A)).
Definition aapp := app (A:=(ad * A)).
Definition alist_of_Map :=
MapFold alist anil aapp (fun (a:ad) (y:A) => acons (a, y) anil).
Fixpoint alist_semantics (l:alist) : ad -> option A :=
match l with
| nil => fun _:ad => None
| (a, y) :: l' =>
fun a0:ad => if Neqb a a0 then Some y else alist_semantics l' a0
end.

Lemma alist_semantics_app :
forall (l l':alist) (a:ad),
alist_semantics (aapp l l') a =
match alist_semantics l a with
| None => alist_semantics l' a
| Some y => Some y
end.