(** Drop an element from a Zlist *)
Fixpoint zdrop (x : Z) (l : Zlist) {struct l} : Zlist :=
match l with
| Nil => Nil Z
| Cons h t => if Zeq_bool x h then t else Cons Z h (zdrop x t)
end.

(* Specifications: *)
Lemma zdrop_head_eq :
forall (x y : Z) (l : Zlist), x = y -> zdrop x (Cons Z y l) = l.
Lemma zdrop_head_neq :
forall (x y : Z) (l : Zlist),
x <> y -> zdrop x (Cons Z y l) = Cons Z y (zdrop x l).
Lemma zdrop_length :
forall (x : Z) (l : Zlist),
inlist Z x l -> S (length Z (zdrop x l)) = length Z l.
Lemma zdrop_neq_inlist :
forall (x y : Z) (l : Zlist),
x <> y -> inlist Z x l -> inlist Z x (zdrop y l).
Lemma zdrop_inlist_weak :
forall (x y : Z) (l : Zlist), inlist Z x (zdrop y l) -> inlist Z x l.
Lemma zdrop_swap :
forall (x y : Z) (l : Zlist), zdrop x (zdrop y l) = zdrop y (zdrop x l).
Lemma zdrop_inlist_swap :
forall (x y : Z) (l : Zlist),
inlist Z y l -> inlist Z x (zdrop y l) -> inlist Z y (zdrop x l).
Lemma zdrop_product :
forall (x : Z) (l : Zlist),
inlist Z x l -> (x * zproduct (zdrop x l))%Z = zproduct l.