(* A list is unique if there is not twice the same element in the list *)
Inductive ulist : list A -> Prop :=
  | ulist_nil : ulist nil
  | ulist_cons : forall a l, ~ In a l -> ulist l -> ulist (a :: l).(* A list is unique if there is not twice the same element in the list *)
Inductive ulist : list A -> Prop :=
  | ulist_nil : ulist nil
  | ulist_cons : forall a l, ~ In a l -> ulist l -> ulist (a :: l).(* A list is unique if there is not twice the same element in the list *)
Inductive ulist : list A -> Prop :=
  | ulist_nil : ulist nil
  | ulist_cons : forall a l, ~ In a l -> ulist l -> ulist (a :: l).

(* Specifications: *)
Theorem ulist_inv : forall a l, ulist (a :: l) -> ulist l.
Theorem ulist_app : forall l1 l2, ulist l1 -> ulist l2 -> (forall a : A, In a l1 -> In a l2 -> False) -> ulist (l1 ++ l2).
Theorem ulist_app_inv : forall l1 l2 (a : A), ulist (l1 ++ l2) -> In a l1 -> In a l2 -> False.
Theorem ulist_app_inv_l : forall l1 l2 : list A, ulist (l1 ++ l2) -> ulist l1.
Theorem ulist_app_inv_r : forall l1 l2 : list A, ulist (l1 ++ l2) -> ulist l2.