Definition disjoint (A B : part_set E) := Equal (inter A B) (empty E).

(* Specifications: *)
Lemma disjoint_comp : forall A A' B B' : part_set E, Equal A A' -> Equal B B' -> disjoint A B -> disjoint A' B'.
Lemma empty_not_in : forall A : part_set E, Equal A (empty E) -> forall x : E, ~ in_part x A.
Lemma disjoint_inclus : forall A B C : part_set E, included A B -> disjoint B C -> disjoint A C.
Lemma included_add_part : forall (A : part_set E) (x : E), included A (add_part A x).
Lemma union_not_in : forall (A B : part_set E) (x : E), ~ in_part x A -> ~ in_part x B -> ~ in_part x (union A B).
Lemma disjoint_not_in_r : forall (A B : part_set E) (x : E), disjoint A B -> in_part x A -> ~ in_part x B.
Lemma cardinal_union_disjoint : forall (a b : nat) (A B : part_set E), cardinal A a -> cardinal B b -> disjoint A B -> cardinal (union A B) (a + b).
Lemma in_eq_part : forall A B : part_set E, (forall x : E, in_part x A -> in_part x B) -> (forall x : E, in_part x B -> in_part x A) -> Equal A B.
Lemma diff_in_l : forall (A B : part_set E) (x : E), in_part x (diff A B) -> in_part x A.
Lemma diff_in_r : forall (A B : part_set E) (x : E), in_part x (diff A B) -> ~ in_part x B.
Lemma in_diff : forall (A B : part_set E) (x : E), in_part x A -> ~ in_part x B -> in_part x (diff A B).
Lemma union_diff : forall A B : part_set E, Equal (union A (diff B A)) (union A B).
Lemma disjoint_diff : forall A B : part_set E, disjoint A (diff B A).
Lemma cardinal_union : forall (a b : nat) (A B : part_set E), cardinal A a -> cardinal (diff B A) b -> cardinal (union A B) (a + b).
Lemma empty_diff : forall A : part_set E, Equal (diff (empty E) A) (empty E).
Lemma empty_inter : forall A : part_set E, Equal (inter (empty E) A) (empty E).
Lemma in_part_trans_eq : forall (A : part_set E) (x y : E), in_part x A -> Equal y x -> in_part y A.
Lemma diff_add_part : forall (A B0 B : part_set E) (x : E), ~ in_part x B0 -> Equal A (add_part B0 x) -> in_part x B -> Equal (diff B0 B) (diff A B).
Lemma diff_not_in : forall (A B : part_set E) (x : E), ~ in_part x A -> ~ in_part x (diff A B).
Lemma inter_not_in : forall (A B : part_set E) (x : E), ~ in_part x A -> ~ in_part x (inter A B).
Lemma inter_add_part : forall (A B0 B : part_set E) (x : E), ~ in_part x B0 -> Equal A (add_part B0 x) -> in_part x B -> Equal (inter A B) (add_part (inter B0 B) x).
Lemma diff_add_part_not_in : forall (A B0 B : part_set E) (x : E), ~ in_part x B0 -> Equal A (add_part B0 x) -> ~ in_part x B -> Equal (diff A B) (add_part (diff B0 B) x).
Lemma inter_add_part_not_in : forall (A B0 B : part_set E) (x : E), ~ in_part x B0 -> Equal A (add_part B0 x) -> ~ in_part x B -> Equal (inter B0 B) (inter A B).
Lemma cardinal_diff : forall (a : nat) (A B : part_set E), cardinal A a -> exists b : nat, (exists c : nat, cardinal (diff A B) b /\ cardinal (inter A B) c /\ a = b + c).
Lemma cardinal_union_inter : forall (A B : part_set E) (a b c : nat), cardinal A a -> cardinal B b -> cardinal (inter A B) c -> cardinal (union A B) (a + b - c).