End TREE.
(** * The abstract signatures of maps *)
Module Type MAP.
Parameter elt: Type.
Parameter elt_eq: forall (a b: elt), {a = b} + {a <> b}.
Parameter t: Type -> Type.
Parameter init: forall (A: Type), A -> t A.
Parameter get: forall (A: Type), elt -> t A -> A.
Parameter set: forall (A: Type), elt -> A -> t A -> t A.

(* Specifications: *)
Axiom gi:
forall (A: Type) (i: elt) (x: A), get i (init x) = x.
Axiom gss:
forall (A: Type) (i: elt) (x: A) (m: t A), get i (set i x m) = x.
Axiom gso:
forall (A: Type) (i j: elt) (x: A) (m: t A),
i <> j -> get i (set j x m) = get i m.
Axiom gsspec:
forall (A: Type) (i j: elt) (x: A) (m: t A),
get i (set j x m) = if elt_eq i j then x else get i m.
Axiom gsident:
forall (A: Type) (i j: elt) (m: t A), get j (set i (get i m) m) = get j m.
Axiom gi:
forall (A: Type) (i: elt) (x: A), get i (init x) = x.
Axiom gss:
forall (A: Type) (i: elt) (x: A) (m: t A), get i (set i x m) = x.
Axiom gso:
forall (A: Type) (i j: elt) (x: A) (m: t A),
i <> j -> get i (set j x m) = get i m.
Axiom gsspec:
forall (A: Type) (i j: elt) (x: A) (m: t A),
get i (set j x m) = if elt_eq i j then x else get i m.
Axiom gsident:
forall (A: Type) (i j: elt) (m: t A), get j (set i (get i m) m) = get j m.