(** *** Filter *)
Variable X : Type.
Implicit Types (x y: X) (A B C: list X) (p q: X -> bool).
Fixpoint filter p A : list X :=
match A with
| nil => nil
| x::A' => if p x then x :: filter p A' else filter p A'
end.

Lemma filter_app p A B :
filter p (A ++ B) = filter p A ++ filter p B.