Section type.
Variable eqv : forall x, type (F x).
Global Instance type_hlist (ls : list iT): type (hlist ls) :=
{ equal := @equiv_hlist (fun x => @equal _ (eqv x)) ls
; proper :=
(fix recur ls (h : hlist ls) : Prop :=
match h with
| Hnil => True
| Hcons _ _ x y => proper x /\ recur _ y
end) ls
}.
Variable eqvOk : forall x, typeOk (eqv x).
Global Instance typeOk_hlist (ls : list iT): typeOk (type_hlist ls).
Global Instance proper_hlist_app l l' : proper (@hlist_app l l').

Lemma hlist_app_assoc'
: forall (ls ls' ls'' : list iT)
(a : hlist ls) (b : hlist ls') (c : hlist ls''),
hlist_app a (hlist_app b c) =
match
app_ass_trans ls ls' ls'' in (_ = t) return (hlist t)
with
| eq_refl => hlist_app (hlist_app a b) c
end.