Module SSWP := WPropertiesOn SetOfSetsOfPositiveOrderedType SS.Module SSWEqP := WEqPropertiesOn SetOfSetsOfPositiveOrderedType SS.Module SPWEqP := WEqPropertiesOn SetOfPairsOfPositiveOrderedType SP.Definition pick_line (s : SS.elt) (sp : SP.t) :=
  SP.exists_ (fun p => (S.mem (fstpp p) s) && (S.mem (sndpp p) s)) sp.Definition exists_witness (f : SS.elt -> bool) (s : SS.t) : option SS.elt :=
  SS.choose (SS.filter f s).Definition pick_lines_aux (s1 : SS.elt)
                          (ss : SS.t)
                          (sp : SP.t)
                          : (option (SS.elt * SS.elt)) :=
  match ((exists_witness (fun s2 => let i := S.inter s1 s2 in
                                    pick_line i sp)) ss) with
    | None => None
    | Some s2 => Some(s1,s2)
  end.Definition pick_lines (ss : SS.t) (sp : SP.t)
                      : (option (SS.elt * SS.elt)) :=
  match (exists_witness (fun s =>
                           match (pick_lines_aux s (SS.remove s ss) sp) with
                             | None => false
                             | _ => true
                           end) ss) with
    | None => None
    | Some s1 => pick_lines_aux s1 (SS.remove s1 ss) sp
  end.Definition eqop (p1 p2 : option SS.elt) :=
  match p1,p2 with
    | None, None => True
    | Some s1, Some s2 => True
    | _, _ => False
  end.Definition eqopp (p1 p2 : option (SS.elt * SS.elt)) :=
  match p1,p2 with
    | None, None => True
    | Some s1, Some s2 => True
    | _, _ => False
  end.

(* Specifications: *)
Lemma pick_lines_ok_1 : forall s1 s2 ss sp, pick_lines ss sp = Some(s1,s2) -> SS.In s1 ss.
Lemma pick_lines_ok_2 : forall s1 s2 ss sp, pick_lines ss sp = Some(s1,s2) -> SS.In s2 (SS.remove s1 ss).