Fixpoint filter_aux (f: key -> bool) (s: tree) (n: positive) (l: list key) : (positive * list key) :=
match s with
| T _ sl k sr => let (n,l') := filter_aux f sr n l
in if f k then filter_aux f sl (Psucc n) (k::l')
else filter_aux f sl n l'
| EE => (n,l)
end.
Definition Kle x y := K.lt x y \/ K.eq x y.

(* Specifications: *)
Lemma HdRel_le_lt:
forall u v l, K.lt u v -> HdRel Kle v l -> HdRel K.lt u l.
Lemma HdRel_lt_le: forall v l, HdRel K.lt v l -> HdRel Kle v l.
induction 1; constructor. left; auto.