(*********************************************************************) 
(*                  Some List Functions                              *) 
(*********************************************************************) 

Definition front (A : Set) (l : list A) : list A := rev (tail (rev l)).Definition last (A : Set) (l : list A) := head (rev l).Fixpoint take (A : Set) (n : nat) (l : list A) {struct l} : 
 list A :=
  match l with
  | nil => nil (A:=A)
  | a :: l' => match n with
               | O => nil (A:=A)
               | S m => a :: take m l'
               end
  end.(*********************************************************************) 
(*                  Some Functions for ListSet                       *) 
(*********************************************************************) 
 
Definition IsEmpty (A : Set) (B : set A) := forall x : A, ~ set_In x B.Definition Included (A : Set) (B C : set A) :=
  forall x : A, set_In x B -> set_In x C.

Lemma Prodeq_dec : forall A B : Set, (forall x y : A, {x = y} + {x <> y}) -> (forall v w : B, {v = w} + {v <> w}) -> forall c d : A * B, {c = d} + {c <> d}.