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.

Lemma equiv_hlist_map : forall T U (F : T -> Type) (R : forall t, F t -> F t -> Prop) (R' : forall t, U t -> U t -> Prop) (f g : forall t, F t -> U t), (forall t (x y : F t), R t x y -> R' t (f t x) (g t y)) -> forall ls (a b : hlist F ls), equiv_hlist R a b -> equiv_hlist R' (hlist_map f a) (hlist_map g b).