Fixpoint getUnique(A : Set)(ls : list A)(pf : eq_dec A) : list A :=
  match ls with
    | nil => nil
    | a :: ls' => 
      let ls'' := (getUnique ls' pf) in
        if (in_dec pf a ls'') 
          then ls''
          else a :: ls''
  end.

(* Specifications: *)
Theorem in_getUnique_if : forall (A : Set)(ls : list A)(eqd : eq_dec A) a, In a (getUnique ls eqd) -> In a ls.
Theorem in_getUnique : forall (A : Set)(ls : list A)(eqd : eq_dec A) a, In a ls -> In a (getUnique ls eqd).
Lemma getUnique_NoDup : forall (A : Set)(ls : list A)(eqd: eq_dec A), NoDup (getUnique ls eqd).
Theorem length_getUnique_nz : forall (A :Set)(eqd : eq_dec A)(ls : list A), length ls > 0 -> length (getUnique ls eqd) > 0.