Fixpoint hlist_split ls ls' : hlist (ls ++ ls') -> hlist ls * hlist ls' :=
match ls as ls return hlist (ls ++ ls') -> hlist ls * hlist ls' with
| nil => fun h => (Hnil, h)
| l :: ls => fun h =>
let (a,b) := @hlist_split ls ls' (hlist_tl h) in
(Hcons (hlist_hd h) a, b)
end.

Lemma hlist_split_hlist_app : forall ls' ls (h : hlist ls) (h' : hlist ls'),
hlist_split _ _ (hlist_app h h') = (h,h').