Fixpoint ptree_cmp {T : Type} (p1 p2: Maps.PTree.tree T)
         (e : T -> T -> bool) :=
match p1, p2 with
| Maps.PTree.Leaf, Maps.PTree.Leaf => true
| Maps.PTree.Node l1 i1 r1, Maps.PTree.Node l2 i2 r2 =>
  match i1, i2 with
    | Some v1, Some v2 => andb (e v1 v2)
                               (andb (ptree_cmp l1 l2 e)
                                     (ptree_cmp r1 r2 e))
    | None, None => (andb (ptree_cmp l1 l2 e)
                          (ptree_cmp r1 r2 e))
    | _, _ => false
  end
| _, _ => false
end.

Lemma ptree_cmp_sound : forall T p1 p2 e, (forall (i1 i2 : T), e i1 i2 = true -> i1 = i2) -> ptree_cmp p1 p2 e = true -> p1 = p2.