Notation "[ s | p ∈ A ]" :=
  (map (fun p => s) A) (p pattern).Hint Extern 4 => 
match goal with
|[ H: ?x el nil |- _ ] => destruct H
end.(** ** Tactics *)
Ltac inv H := inversion H; subst; try clear H.

(* Specifications: *)
Lemma size_induction X (f : X -> nat) (p : X -> Type) : (forall x, (forall y, f y < f x -> p y) -> p x) -> forall x, p x.
Lemma size_induction_dep L (X : L -> Type) (f : forall l, X l -> nat) (p : forall l, X l -> Type) : (forall l x, (forall l' y, f l' y < f l x -> p l' y) -> p l x) -> forall l x, p l x.
Lemma size_induction X (f : X -> nat) (p : X -> Type) : (forall x, (forall y, f y < f x -> p y) -> p x) -> forall x, p x.