Module Type TREE.
Parameter elt: Type.
Parameter elt_eq: forall (a b: elt), {a = b} + {a <> b}.
Parameter t: Type -> Type.
Parameter empty: forall (A: Type), t A.
Parameter get: forall (A: Type), elt -> t A -> option A.
Parameter set: forall (A: Type), elt -> A -> t A -> t A.
Parameter remove: forall (A: Type), elt -> t A -> t A.

(** The ``good variables'' properties for trees, expressing commutations between [get], [set] and [remove]. *)
Axiom gempty:
forall (A: Type) (i: elt), get i (empty A) = None.