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.