Inductive ListType: list Type -> Type :=
  | Nil: ListType nil
  | Cons: forall {A B} (a: A) (b: ListType B), ListType (A :: B).Inductive ListType: list Type -> Type :=
  | Nil: ListType nil
  | Cons: forall {A B} (a: A) (b: ListType B), ListType (A :: B).Inductive ListType: list Type -> Type :=
  | Nil: ListType nil
  | Cons: forall {A B} (a: A) (b: ListType B), ListType (A :: B).Fixpoint ListTypeGen {A} (F: A -> Type) (f: forall A, F A) (l: list A) : ListType (map F l) :=
  match l with
  | nil => Nil
  | cons h t => Cons (f h) (ListTypeGen F f t)
  end.

(* Specifications: *)
Lemma ListTypeGen_preserve: forall A F f1 f2 (l: list A), (forall a, In a l -> f1 a = f2 a) -> ListTypeGen F f1 l = ListTypeGen F f2 l.
Lemma ListTypeGen_preserve: forall A F f1 f2 (l: list A), (forall a, In a l -> f1 a = f2 a) -> ListTypeGen F f1 l = ListTypeGen F f2 l.