Inductive NoDup_gen : list A -> Prop :=
  | NoDup_gen_nil : NoDup_gen nil
  | NoDup_gen_cons : 
      forall (a : A)(ls : list A),
        (~In_gen ea a ls) -> 
        NoDup_gen ls ->
        NoDup_gen (a :: ls).Inductive NoDup_gen : list A -> Prop :=
  | NoDup_gen_nil : NoDup_gen nil
  | NoDup_gen_cons : 
      forall (a : A)(ls : list A),
        (~In_gen ea a ls) -> 
        NoDup_gen ls ->
        NoDup_gen (a :: ls).Inductive NoDup_gen : list A -> Prop :=
  | NoDup_gen_nil : NoDup_gen nil
  | NoDup_gen_cons : 
      forall (a : A)(ls : list A),
        (~In_gen ea a ls) -> 
        NoDup_gen ls ->
        NoDup_gen (a :: ls).

Theorem NoDup_gen_zip_fst : forall (A B : Set)(ea : A -> A -> Prop)(lsa : list A)(lsb : list B), NoDup_gen ea lsa -> NoDup_gen (fun a b => ea (fst a) (fst b)) (zip lsa lsb).