End hlist.
Arguments Hnil {_ _}.
Arguments Hcons {_ _ _ _} _ _.
Arguments equiv_hlist {_ F} R {_} _ _ : rename.
(** Weak Map ** This is weak because it does not change the key type **)
Section hlist_map.
Variable A : Type.
Variables F G : A -> Type.
Variable ff : forall x, F x -> G x.
Fixpoint hlist_map (ls : list A) (hl : hlist F ls) {struct hl} : hlist G ls :=
match hl in @hlist _ _ ls return hlist G ls with
| Hnil => Hnil
| Hcons _ _ hd tl =>
Hcons (ff hd) (hlist_map tl)
end.

Theorem hlist_app_hlist_map
: forall ls ls' (a : hlist F ls) (b : hlist F ls'),
hlist_map (hlist_app a b) =
hlist_app (hlist_map a) (hlist_map b).