Definition subtype_image_set : Setoid := Build_Setoid subtype_image_equiv.Record subtype_image : Type := 
  {subtype_image_carrier : Type;
   subtype_image_inj :> subtype_image_carrier -> E}.Record subtype_image : Type := 
  {subtype_image_carrier : Type;
   subtype_image_inj :> subtype_image_carrier -> E}.Record subtype_image : Type := 
  {subtype_image_carrier : Type;
   subtype_image_inj :> subtype_image_carrier -> E}.Definition set_of_subtype_image (S : subtype_image) :=
  subtype_image_set (subtype_image_inj (s:=S)).Definition pred_compatible (P : E -> Prop) : Prop :=
  forall x y : E, P x -> Equal y x -> (P y:Prop).Record Predicate : Type := 
  {Pred_fun : E -> Prop; Pred_compatible_prf : pred_compatible Pred_fun:Prop}.Record Predicate : Type := 
  {Pred_fun : E -> Prop; Pred_compatible_prf : pred_compatible Pred_fun:Prop}.Record Predicate : Type := 
  {Pred_fun : E -> Prop; Pred_compatible_prf : pred_compatible Pred_fun:Prop}.Record subtype : Type := 
  {subtype_elt : E; subtype_prf : Pred_fun P subtype_elt:Prop}.Record subtype : Type := 
  {subtype_elt : E; subtype_prf : Pred_fun P subtype_elt:Prop}.Record subtype : Type := 
  {subtype_elt : E; subtype_prf : Pred_fun P subtype_elt:Prop}.Definition part :=
  Build_subtype_image (subtype_image_carrier:=subtype) subtype_elt.Definition in_part (E : Setoid) (x : E) (A : Predicate E) := Pred_fun A x.Definition eq_part (A B : Predicate E) : Prop :=
  forall x : E, (in_part x A -> in_part x B) /\ (in_part x B -> in_part x A).Definition part_set : Setoid := Build_Setoid eq_part_equiv.Definition empty : part_set.Definition full : part_set.

(* Specifications: *)
Lemma in_part_comp_l : forall (A : part_set E) (x y : E), in_part x A -> Equal y x -> in_part y A.
Lemma in_part_comp_r : forall (x : E) (A B : part_set E), in_part x A -> Equal A B -> in_part x B.
Lemma empty_prop : forall x : E, ~ in_part x (empty E).
Lemma full_prop : forall x : E, in_part x (full E).