Open Scope nat.
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.

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.