Hint Resolve insert_l insert_r insert_eq: searchtrees.
Definition insert :
forall (n : key) (v : data) (t : btree), insert_spec n v t.
simple induction t.
exists (bnode n v leaf leaf).
auto with searchtrees.
unfold insert_spec at 3 in |- *; intros p b t1 H1 t2 H2 H0.
case (M.le_lt_dec n p).
intro H; case (M.le_lt_eq_dec n p H).
intro H'.
case (H1 (search_tree_l _ _ _ _ H0)).
intros t3; exists (bnode p b t3 t2).
auto with searchtrees.
intro e; rewrite e; exists (bnode p v t1 t2); auto with searchtrees.
case (H2 (search_tree_r _ _ _ _ H0)).
intros t3; exists (bnode p b t1 t3).
auto with searchtrees.
Defined.
(* realisation of the DICT  signature *)
(* dictionaries are represented as  certified binary search trees *)
Definition dict : Set := sig search_tree.
Definition empty : dict.
unfold dict in |- *; exists leaf.
left.
Defined.
Definition find (k : key) (d : dict) : option data :=
let (t, Ht) := d in
match occ_dec k t Ht with
| inleft s => let (v, _) := s in Some v
| inright _ => None (A:=data)
end.
Definition add : key -> data -> dict -> dict.
refine
(fun (k : key) (v : data) (d : dict) =>
let (t, Ht) := d in
let (x, Hx) := insert k v t Ht in exist search_tree x _).
case Hx; auto.
Defined.
(* Now, we've got to prove the axioms *)
Definition D_tree (d : dict) : btree := match d with
| exist t Ht => t
end.

Theorem empty_def : forall k : key, find k empty = None.
Remark success2 :
forall (d : dict) (k : key) (v : data), occ v k (D_tree (add k v d)).