Library ZF


Require Export Setoid Morphisms.
Require Export ZFdef.

Require Ens ZFskol.
Module IZF : IZF_sig := ZFskol.Skolem Ens.IZF.
Import IZF.

Notation morph1 := (Proper (eq_set ==> eq_set)).
Notation morph2 := (Proper (eq_set ==> eq_set ==> eq_set)).

Instance eq_set_equiv: Equivalence eq_set.

Lemma eq_intro : forall x y,
  (forall z, z \in x -> z \in y) ->
  (forall z, z \in y -> z \in x) ->
  eq_set x y.

Lemma eq_elim : forall x y y',
  y == y' ->
  x \in y ->
  x \in y'.

Instance in_set_morph : Proper (eq_set ==> eq_set ==> iff) in_set.

Qed.

Definition incl_set x y := forall z, z \in x -> z \in y.

Notation "x \incl y" := (incl_set x y) (at level 70).

Instance incl_set_pre : PreOrder incl_set.
Qed.

Instance incl_set_morph : Proper (eq_set ==> eq_set ==> iff) incl_set.
Qed.

Lemma incl_eq : forall x y, x \incl y -> y \incl x -> x == y.


Definition eq_fun dom F G :=
  forall x x', x \in dom -> x == x' -> F x == G x'.

Instance eq_fun_sym : forall dom, Symmetric (eq_fun dom).
Qed.

Instance eq_fun_trans : forall dom, Transitive (eq_fun dom).
Qed.

Definition ext_fun dom f := eq_fun dom f f.

Lemma eq_fun_ext : forall dom F G, eq_fun dom F G -> ext_fun dom F.

Definition eq_pred dom (P Q : set -> Prop) :=
  forall x, x \in dom -> (P x <-> Q x).

Instance eq_pred_set : forall dom, Equivalence (eq_pred dom).
Qed.

Definition ext_rel dom (R:set->set->Prop) :=
  forall x x' y y', x \in dom -> x == x' -> y == y' -> (R x y <-> R x' y').

Definition eq_index x F y G :=
  (forall a, a \in x -> exists2 b, b \in y & F a == G b) /\
  (forall b, b \in y -> exists2 a, a \in x & F a == G b).

Lemma eq_index_sym : forall x F y G, eq_index x F y G -> eq_index y G x F.

Lemma eq_index_eq : forall x F y G,
  x == y ->
  eq_fun x F G ->
  eq_index x F y G.


Definition subset a (P:set->Prop) := repl a (fun x y => x==y /\ P x).

Lemma subset_ax: forall a (P:set->Prop),
    forall x, x \in subset a P <-> (x \in a /\ exists2 x', x==x' & P x').


Lemma empty_ext : forall e, (forall x, ~x \in e) -> e == empty.

Lemma pair_intro1 : forall x y, x \in pair x y.

Lemma pair_intro2 : forall x y, y \in pair x y.

Hint Resolve pair_intro1 pair_intro2.

Lemma pair_elim : forall x a b, x \in pair a b -> x == a \/ x == b.

Lemma pair_ext : forall p a b,
  a \in p -> b \in p -> (forall x, x \in p -> x == a \/ x == b) ->
  p == pair a b.

Instance pair_morph : morph2 pair.

Qed.

Lemma union_intro : forall x y z, x \in y -> y \in z -> x \in union z.

Lemma union_elim : forall x z, x \in union z -> exists2 y, x \in y & y \in z.

Lemma union_ext :
  forall u z,
  (forall x y, x \in y -> y \in z -> x \in u) ->
  (forall x, x \in u -> exists2 y, x \in y & y \in z) ->
  u == union z.

Instance union_morph : morph1 union.
Qed.

Lemma union_empty_eq : union empty == empty.

Lemma power_intro :
  forall x y, (forall z, z \in x -> z \in y) -> x \in power y.

Lemma power_elim : forall x y z, x \in power y -> z \in x -> z \in y.

Lemma power_mono : Proper (incl_set ==> incl_set) power.

Lemma power_ext :
  forall p a,
  (forall x, (forall y, y \in x -> y \in a) -> x \in p) ->
  (forall x y, x \in p -> y \in x -> y \in a) ->
  p == power a.

Instance power_morph : morph1 power.
Qed.

Lemma empty_in_power : forall x, empty \in power x.

Lemma union_in_power :
    forall x X, x \incl power X -> union x \in power X.

Lemma subset_intro : forall a (P:set->Prop) x,
  x \in a -> P x -> x \in subset a P.

Lemma subset_elim1 : forall a (P:set->Prop) x, x \in subset a P -> x \in a.

Lemma subset_elim2 : forall a (P:set->Prop) x, x \in subset a P ->
  exists2 x', x==x' & P x'.

Lemma subset_ext :
  forall s a (P:set->Prop),
  (forall x, x \in a -> P x -> x \in s) ->
  (forall x, x \in s -> x \in a) ->
  (forall x, x \in s -> exists2 x', x==x' & P x') ->
  s == subset a P.

Lemma subset_morph :
  forall x x', x == x' ->
  forall (P P':set->Prop), eq_pred x P P' ->
  subset x P == subset x' P'.

Lemma union_subset_singl : forall x (P:set->Prop) y y',
  y \in x ->
  y == y' ->
  P y' ->
  (forall y y', y \in x -> y' \in x -> P y -> P y' -> y == y') ->
  union (subset x P) == y.

Definition replf a (F:set->set) :=
  repl a (fun x y => y == F x).

Instance replf_mono_raw :
  Proper (incl_set ==> (eq_set ==> eq_set) ==> incl_set) replf.
Qed.

Instance replf_morph_raw :
  Proper (eq_set ==> (eq_set ==> eq_set) ==> eq_set) replf.

Qed.

Lemma replf_ax : forall a F z,
  ext_fun a F ->
  (z \in replf a F <-> exists2 x, x \in a & z == F x).

Lemma replf_intro : forall a F y x,
  ext_fun a F -> x \in a -> y == F x -> y \in replf a F.

Lemma replf_elim : forall a F y,
  ext_fun a F -> y \in replf a F -> exists2 x, x \in a & y == F x.

Lemma replf_ext : forall p a F,
  ext_fun a F ->
  (forall x, x \in a -> F x \in p) ->
  (forall y, y \in p -> exists2 x, x \in a & y == F x) ->
  p == replf a F.

Lemma replf_mono2 : forall x y F,
  ext_fun y F ->
  x \incl y ->
  replf x F \incl replf y F.

Lemma replf_morph_gen : forall x1 x2 F1 F2,
  ext_fun x1 F1 ->
  ext_fun x2 F2 ->
  eq_index x1 F1 x2 F2 ->
  replf x1 F1 == replf x2 F2.

Lemma replf_morph : forall x1 x2 F1 F2,
  x1 == x2 ->
  eq_fun x1 F1 F2 ->
  replf x1 F1 == replf x2 F2.

Lemma replf_empty : forall F, replf empty F == empty.


Lemma pair_commut : forall x y, pair x y == pair y x.

Lemma pair_inv : forall x y x' y',
  pair x y == pair x' y' -> (x==x' /\ y==y') \/ (x==y' /\ y==x').

Definition singl x := pair x x.

Lemma singl_intro : forall x, x \in singl x.

Lemma singl_intro_eq : forall x y, x == y -> x \in singl y.

Lemma singl_elim : forall x y, x \in singl y -> x == y.

Lemma singl_ext :
  forall y x,
  x \in y ->
  (forall z, z \in y -> z == x) ->
  y == singl x.

Instance singl_morph : morph1 singl.
Qed.

Lemma union_singl_eq : forall x, union (singl x) == x.

Lemma singl_inj : forall x y, singl x == singl y -> x == y.

Definition union2 x y := union (pair x y).

Lemma union2_intro1: forall x y z, z \in x -> z \in union2 x y.

Lemma union2_intro2: forall x y z, z \in y -> z \in union2 x y.

Lemma union2_elim : forall x y z, z \in union2 x y -> z \in x \/ z \in y.

Lemma union2_mono : forall A A' B B',
  A \incl A' -> B \incl B' -> union2 A B \incl union2 A' B'.

Instance union2_morph : morph2 union2.
Qed.

Lemma union2_commut : forall x y, union2 x y == union2 y x.

Definition minus2 x y := subset x (fun x' => ~ (x' \in y)).


Definition sup x F := union (replf x F).

Lemma sup_ax : forall x F z,
  ext_fun x F ->
  (z \in sup x F <-> exists2 y, y \in x & z \in F y).

Lemma sup_ext : forall y a F,
  ext_fun a F ->
  (forall x, x \in a -> F x \incl y) ->
  (forall z, z \in y -> exists2 x, x \in a & z \in F x) ->
  y == sup a F.

Lemma sup_morph_gen : forall a F b G,
  ext_fun a F ->
  ext_fun b G ->
  eq_index a F b G ->
  sup a F == sup b G.

Lemma sup_morph : forall a F b G,
  a == b ->
  eq_fun a F G ->
  sup a F == sup b G.

Lemma sup_incl : forall a F x,
  ext_fun a F -> x \in a -> F x \incl sup a F.
Hint Resolve sup_incl.


Section Russel.

Variable U : set.
Variable universal : forall x, x \in U.

Definition omega := subset U (fun x => ~ x \in x).

Lemma omega_not_in_omega : ~ omega \in omega.

Lemma omega_in_omega : omega \in omega.

Lemma no_universal_set : False.
End Russel.


Definition inter x := subset (union x) (fun y => forall z, z \in x -> y \in z).

Lemma inter_empty_eq : inter empty == empty.

Lemma inter_intro :
  forall x a y0,
  (forall y, y \in a -> x \in y) ->
  y0 \in a ->
  x \in inter a.

Lemma inter_elim : forall x a y, x \in inter a -> y \in a -> x \in y.

Lemma inter_ext :
  forall i a y0,
  (forall y, y \in a -> i \incl y) ->
  (forall x, (forall y, y \in a -> x \in y) -> x \in i) ->
  y0 \in a ->
  i == inter a.

Instance inter_morph : morph1 inter.

Qed.