Fixpoint app (a b: L) {struct a}: L :=
match a with
| one x => cons x b
| cons x y => cons x (app y b)
end.
Variable l: L.
Definition head := match l with one x => x | cons x _ => x end.
Definition tail := match l with one _ => List.nil | cons _ x => to_plain x end.

(* Specifications: *)
Lemma head_in_self: List.In head l.
Proof with auto. unfold head. destruct l; left... Qed.
Lemma In_sound x: List.In x l -> (head = x \/ List.In x tail).
Proof with auto. unfold head. unfold tail. destruct l... Qed.
Lemma In_cons_head (x: T) y: List.In x (cons x y). left; reflexivity. Qed.
Lemma In_one (x: T): List.In x (one x). left; reflexivity. Qed.
Lemma coerced_cons_eq (h: T): List.cons h l = cons h l.
Add Parametric Morphism (A B: Set): (@map A B)
with signature (@ext_eq A B) ==> (@ext_eq (L A) (L B))
as ne_list_map_ext_eq_morph.