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
    }.Global Instance typeOk_hlist (ls : list iT): typeOk (type_hlist ls).Global Instance proper_hlist_app l l' : proper (@hlist_app l l').

(* Specifications: *)
Lemma hlist_app_assoc : forall ls ls' ls'' (a : hlist ls) (b : hlist ls') (c : hlist ls''), hlist_app (hlist_app a b) c = match eq_sym (app_ass_trans ls ls' ls'') in _ = t return hlist t with | eq_refl => hlist_app a (hlist_app b c) end.
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.