Notation "f ∘ g" := (fun x => f (g x)) (at level 100).
Hint Rewrite concat_app map_app map_map : list.
Hint Rewrite <- map_rev  : list.
Hint Rewrite <- concat_rev : list.

(* Specifications: *)
Lemma list_split X A B C D E (x : X) :
A ++ B ++ C = D ++ x :: E -> ~ x el A -> ~ x el C ->
exists F G,
D = A ++ F /\
E = G ++ C /\
B = F ++ x :: G.
Lemma nil_app_nil X (A : list X) :
A = [] ++ A ++ [].