Definition me (ab: list T * list T): nat := length (fst ab) + length (snd ab).Program Fixpoint merges_ex (ab: list T * list T) {measure (me ab)}: sig (merges_spec (fst ab) (snd ab)) :=
    match ab with
    | (nil, x) => x :: nil
    | (x, nil) => x :: nil
    | (x :: y, h :: t) => map (cons x) (merges_ex (y, h :: t)) ++ map (cons h) (merges_ex (x :: y, t))
    end.Definition merges (a b: list T): list (list T) := proj1_sig (merges_ex (a, b)).

Lemma elemsRuniq A B (R: A -> B -> Prop) (l: list A): (forall x, In x l -> forall y, R x y -> forall y', R x y' -> y = y') -> forall r, elemsR R l r -> forall r', elemsR R l r' -> r = r'.