Section Elt.
Variable elt : Type.
Implicit Types m r : t elt.
(** * AVL trees *)
(** [avl s] : [s] is a properly balanced AVL tree, i.e. for any node the heights of the two children differ by at most 2 *)
Inductive avl : t elt -> Prop :=
| RBLeaf : avl (Leaf _)
| RBNode : forall x e l r h,
avl l ->
avl r ->
-(2) <= height l - height r <= 2 ->
h = max (height l) (height r) + 1 ->
avl (Node l x e r h).
(** * Automation and dedicated tactics about [avl]. *)
Hint Constructors avl : core.

Lemma height_non_negative : forall (s : t elt), avl s ->
height s >= 0.