(*********************************************************************) 
(*                  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 Set_add2 : forall (B : set A) (x y : A), x <> y -> ~ set_In x B -> ~ set_In x (set_add Aeq_dec y B).