(** TODO: I need hlist_rev_cons **)
(** Equivalence **)
(** TODO: This should change to relations **)
Variable eqv : forall x, relation (F x).
Inductive equiv_hlist : forall ls, hlist ls -> hlist ls -> Prop :=
| hlist_eqv_nil : equiv_hlist Hnil Hnil
| hlist_eqv_cons : forall l ls x y h1 h2, eqv x y -> equiv_hlist h1 h2 ->
@equiv_hlist (l :: ls) (Hcons x h1) (Hcons y h2).
Global Instance Reflexive_equiv_hlist (R : forall t, Reflexive (@eqv t)) ls
: Reflexive (@equiv_hlist ls).
Global Instance Symmetric_equiv_hlist (R : forall t, Symmetric (@eqv t)) ls
: Symmetric (@equiv_hlist ls).
Global Instance Transitive_equiv_hlist (R : forall t, Transitive (@eqv t)) ls
: Transitive (@equiv_hlist ls).

(* Specifications: *)
Lemma equiv_hlist_Hcons
: forall ls i a b (c : hlist ls) d,
equiv_hlist (Hcons a c) (@Hcons i ls b d) ->
(@eqv i a b /\ equiv_hlist c d).