Local Infix "~p" := (@Permutation _) (at level 70, no associativity).Implicit Types (l m : list X).Fact incl_cons_linv l m x : incl (x::m) l -> In x l /\ incl m l.Fact incl_right_cons_choose x l m : incl m (x::l) -> In x m \/ incl m l.Fact incl_left_right_cons x l y m : incl (x::l) (y::m) -> y = x  /\ In y l 
                                                         \/ y = x  /\ incl l m
                                                         \/ In x m /\ incl l (y::m).Inductive list_has_dup : list X -> Prop :=
    | in_list_hd0 : forall l x, In x l -> list_has_dup (x::l)
    | in_list_hd1 : forall l x, list_has_dup l -> list_has_dup (x::l).Inductive list_has_dup : list X -> Prop :=
    | in_list_hd0 : forall l x, In x l -> list_has_dup (x::l)
    | in_list_hd1 : forall l x, list_has_dup l -> list_has_dup (x::l).Inductive list_has_dup : list X -> Prop :=
    | in_list_hd0 : forall l x, In x l -> list_has_dup (x::l)
    | in_list_hd1 : forall l x, list_has_dup l -> list_has_dup (x::l).Fact list_hd_cons_inv x l : list_has_dup (x::l) -> In x l \/ list_has_dup l.Fact list_has_dup_app_left l m : list_has_dup m -> list_has_dup (l++m).Fact list_has_dup_app_right l m : list_has_dup l -> list_has_dup (l++m).Fact list_has_dup_app_inv l m : list_has_dup (l++m) -> list_has_dup l 
                                                      \/ list_has_dup m 
                                                      \/ exists x, In x l /\ In x m.Fact list_has_dup_eq_duplicates m: list_has_dup m <-> exists x aa bb cc, m = aa++x::bb++x::cc.Fact repeat_choice_two x m : Forall (eq x) m -> (exists m', m = x::x::m') \/ m = nil \/ m = x::nil.

(* Specifications: *)
Theorem finite_pigeon_hole l m : length l < length m -> incl m l -> exists x aa bb cc, m = aa++x::bb++x::cc.
Theorem partition_intersection l m k : length k < length (l++m) -> incl (l++m) k -> list_has_dup l \/ list_has_dup m \/ exists x, In x l /\ In x m.