Library ZFpairs


Require Export ZF.



Definition couple x y := pair (singl x) (pair x y).

Instance couple_morph : morph2 couple.
Qed.

Lemma union_couple_eq : a b, union (couple a b) == pair a b.

Definition fst p := union (subset (union p) (fun x => singl x p)).

Instance fst_morph : morph1 fst.
Qed.

Lemma fst_def : x y, fst (couple x y) == x.

Definition snd p :=
  union (subset (union p) (fun z => pair (fst p) z == union p)).

Instance snd_morph : morph1 snd.

Lemma snd_def : x y, snd (couple x y) == y.

Lemma couple_injection : x y x' y',
  couple x y == couple x' y' -> x == x' /\ y == y'.


Definition prodcart A B :=
  subset (power (power (A B)))
    (fun x => exists2 a, a A & exists2 b, b B & x == couple a b).

Instance prodcart_mono :
  Proper (incl_set ==> incl_set ==> incl_set) prodcart.

Qed.

Instance prodcart_morph : morph2 prodcart.

Lemma couple_intro :
   x y A B, x A -> y B -> couple x y prodcart A B.

Lemma fst_typ : p A B, p prodcart A B -> fst p A.

Lemma snd_typ : p A B, p prodcart A B -> snd p B.

Lemma surj_pair :
   p A B, p prodcart A B -> p == couple (fst p) (snd p).


Definition sigma A B :=
  subset (prodcart A (sup A B)) (fun p => snd p B (fst p)).

Instance sigma_morph : Proper (eq_set ==> (eq_set ==> eq_set) ==> eq_set) sigma.

Qed.

Lemma sigma_ext : A A' B B',
  A == A' ->
  ( x x', x A -> x == x' -> B x == B' x') ->
  sigma A B == sigma A' B'.

Lemma sigma_nodep : A B,
  prodcart A B == sigma A (fun _ => B).

Lemma couple_intro_sigma :
   x y A B,
  ext_fun A B ->
  x A -> y B x -> couple x y sigma A B.

Lemma fst_typ_sigma : p A B, p sigma A B -> fst p A.

Lemma snd_typ_sigma : p y A B,
  ext_fun A B ->
  p sigma A B -> y == fst p -> snd p B y.

Lemma sigma_mono : A A' B B',
  ext_fun A B ->
  ext_fun A' B' ->
  A A' ->
  ( x x', x A -> x == x' -> B x B' x') ->
  sigma A B sigma A' B'.