End pigeon_list.
Fact not_list_has_dup_an a n : ~ list_has_dup (list_an a n).
Fact list_has_dup_map_inv X Y (f : X -> Y) l :
(forall x y, In x l -> In y l -> f x = f y -> x = y)
-> list_has_dup (map f l)
-> list_has_dup l.
Fact not_list_an_has_dup a n : ~ list_has_dup (list_an a n).
Fact list_exists X Y (R : X -> Y -> Prop) l : (forall x, In x l -> exists y, R x y) -> exists ll, Forall2 R l ll.
Fact Forall2_conj X Y (R S : X -> Y -> Prop) ll mm : Forall2 (fun x y => R x y /\ S x y) ll mm <-> Forall2 R ll mm /\ Forall2 S ll mm.
Fact Forall2_length X Y (R : X -> Y -> Prop) l m : Forall2 R l m -> length l = length m.
Fact Forall2_app_inv_r X Y R l m1 m2 :
@Forall2 X Y R l (m1++m2)
-> { l1 : _ & { l2 | Forall2 R l1 m1 /\ Forall2 R l2 m2 /\ l = l1++l2 } }.
Section PHP_rel.
Variable (U V : Type) (S : U -> V -> Prop) (l : list U) (m : list V)
(HS : forall x, In x l -> exists y, In y m /\ S x y).
Let sigma : exists Sm, incl Sm m /\ Forall2 S l Sm.
Hypothesis (Hlm : length m < length l).

Theorem PHP_rel : exists a x b y c v, l = a++x::b++y::c
/\ In v m /\ S x v /\ S y v.