Fixpoint pos (X : Type) (d : forall x y : X, {x = y} + {x <> y}) (x : X) l : option nat :=
match l with
| nil => None
| y :: l => if d x y then Some 0 else match pos d x l with Some f => Some (S f) | None => None end
end.

Lemma pos_length X d (x : X) l n : pos d x l = Some n -> n < | l |.
Fixpoint omap X Y (f : X -> option Y) l :=
match l with
| nil => nil
| x :: l => match f x with Some y => y :: omap f l | None => omap f l end
end.