End FilterLemmas.
(* * Element removal *)
Section Removal.
Variable X : Type.
Context {eq_X_dec : eq_dec X}.
Definition rem (A : list X) (x : X) : list X :=
filter (fun z => z <> x) A.

(* Specifications: *)
Lemma in_rem_iff x A y :
x el rem A y <-> x el A /\ x <> y.
Lemma rem_not_in x y A :
x = y \/ ~ x el A -> ~ x el rem A y.
Lemma rem_incl A x :
rem A x <<= A.
Lemma rem_mono A B x :
A <<= B -> rem A x <<= rem B x.
Lemma rem_cons A B x :
A <<= B -> rem (x::A) x <<= B.
Lemma rem_cons' A B x y :
x el B -> rem A y <<= B -> rem (x::A) y <<= B.
Lemma rem_in x y A :
x el rem A y -> x el A.
Lemma rem_neq x y A :
x <> y -> x el A -> x el rem A y.
Lemma rem_app x A B :
x el A -> B <<= A ++ rem B x.
Lemma rem_equi x A :
x::A === x::rem A x.
Lemma rem_fst x A :
rem (x::A) x = rem A x.
Lemma rem_fst' x y A :
x <> y -> rem (x::A) y = x::rem A y.