Global Instance Injection_equiv_hlist_cons ls i a b (c : hlist ls) d
    : Injective (equiv_hlist (Hcons a c) (@Hcons i ls b d)) :=
    { result := @eqv i a b /\ equiv_hlist c d
    ; injection := @equiv_hlist_Hcons _ _ _ _ _ _ }.Global Instance Injection_equiv_hlist_app a b (c c' : hlist a) (d d' : hlist b)
    : Injective (equiv_hlist (hlist_app c d) (hlist_app c' d')) :=
    { result := equiv_hlist c c' /\ equiv_hlist d d'
    ; injection := fun x => proj2 (@equiv_hlist_app _ _ _ _ _ _) x }.

(* Specifications: *)
Lemma hlist_nil_eta : forall (h : hlist nil), h = Hnil.
Lemma hlist_cons_eta : forall a b (h : hlist (a :: b)), h = Hcons (hlist_hd h) (hlist_tl h).
Lemma Hcons_inv : forall l ls a b c d, @eq (hlist (l :: ls)) (Hcons a b) (Hcons c d) -> a = c /\ b = d.