Library ZFgrothendieck

Require Import ZF.
Require Import ZFpairs ZFsum ZFrelations ZFrepl ZFwf ZFord ZFfix.
Require Import ZFstable.
Require Import ZFlist.

Record grot_univ (U:set) : Prop := {
  G_trans : x y, y x -> x U -> y U;
  G_pair : x y, x U -> y U -> pair x y U;
  G_power : x, x U -> power x U;
  G_union_repl : I R, repl_rel I R -> I U ->
                ( x y, x I -> R x y -> y U) ->
                union (repl I R) U }.

Lemma grot_univ_ext : U U',
  U == U' -> grot_univ U -> grot_univ U'.

Lemma grot_empty : grot_univ empty.


Section GrothendieckUniverse.

Variable U : set.
Hypothesis grot : grot_univ U.

Lemma G_incl : x y, x U -> y x -> y U.

Lemma G_subset : x P, x U -> subset x P U.

Lemma G_singl : x, x U -> singl x U.

Lemma G_repl : A R,
  repl_rel A R ->
  A U ->
  ( x y, x A -> R x y -> y U) ->
  repl A R U.

Lemma G_union : x, x U -> union x U.

Lemma G_replf : A F,
  ext_fun A F ->
  A U ->
  ( x, x A -> F x U) ->
  replf A F U.

Lemma G_union2 : x y, x U -> y U -> x y U.

Lemma G_sup A B :
  ext_fun A B ->
  A U ->
  ( x, x A -> B x U) ->
  sup A B U.

Lemma G_nat x : x U -> ZFnats.N U.

Lemma G_prodcart : A B, A U -> B U -> prodcart A B U.

Lemma G_couple : x y, x U -> y U -> couple x y U.

  Lemma G_sum X Y : X U -> Y U -> sum X Y U.

Lemma G_sumcase A B f g a :
  morph1 f ->
  morph1 g ->
  a sum A B ->
  ( a, a A -> f a U) ->
  ( a, a B -> g a U) ->
  sum_case f g a U.

Lemma G_rel : A B, A U -> B U -> rel A B U.

Lemma G_func : A B, A U -> B U -> func A B U.

Lemma G_dep_func : X Y,
  ext_fun X Y ->
  X U ->
  ( x, x X -> Y x U) ->
  dep_func X Y U.

Lemma G_app f x :
  f U -> x U -> app f x U.

  Lemma G_sigma A B :
    ext_fun A B ->
    A U ->
    ( x, x A -> B x U) ->
    sigma A B U.

  Lemma G_cc_lam A F :
    ext_fun A F ->
    A U ->
    ( x, x A -> F x U) ->
    cc_lam A F U.

  Lemma G_cc_app f x :
    f U -> x U -> cc_app f x U.

  Lemma G_cc_prod A B :
    ext_fun A B ->
    A U ->
    ( x, x A -> B x U) ->
    cc_prod A B U.

  Lemma G_TR F o :
    Proper ((eq_set==>eq_set)==>eq_set==>eq_set) F ->
    ( o f f', isOrd o -> eq_fun o f f' -> F f o == F f' o) ->
    isOrd o ->
    o U ->
    ( f o, ext_fun o f -> o U ->
     ( o', o' o -> f o' U) ->
     F f o U) ->
    TR F o U.

  Lemma G_TI F o :
    morph1 F ->
    isOrd o ->
    o U ->
    ( x, x U -> F x U) ->
    TI F o U.

Lemma G_osup2 x y :
  isWf x -> x U -> y U -> x y U.

  Lemma G_Ffix F A : A U -> Ffix F A U.

Section NonTrivial.

  Hypothesis Unontriv : empty U.

End NonTrivial.

Section Infinite.

  Hypothesis Uinf : omega U.

  Lemma G_inf_nontriv : empty U.
  Hint Resolve G_inf_nontriv.

  Lemma G_List A : A U -> List A U.

  Lemma G_N : ZFnats.N U.

Lemma G_osup I f :
  ext_fun I f ->
  ( x, x I -> isOrd (f x)) ->
  I U ->
  ( x, x I -> f x U) ->
  osup I f U.

  Lemma G_Ffix_ord F A :
    Proper (incl_set ==> incl_set) F ->
    ( X, X A -> F X A) ->
    A U ->
    Ffix_ord F A U.

End Infinite.


End GrothendieckUniverse.

Lemma grot_inter : UU,
  (exists x, x UU) ->
  ( x, x UU -> grot_univ x) ->
  grot_univ (inter UU).

Lemma grot_intersection : (P:set->Prop) x,
  grot_univ x -> P x ->
  grot_univ (subset x (fun y => U, grot_univ U -> P U -> y U)).

Definition grot_succ_pred x y :=
  grot_univ y /\ x y /\ U, grot_univ U -> x U -> y U.

Definition grothendieck := x, exists2 U, grot_univ U & x U.

Section TarskiGrothendieck.

Variable gr : grothendieck.

Lemma grot_inter_unique : x, uchoice_pred (grot_succ_pred x).

Definition grot_succ U := uchoice (grot_succ_pred U).

Lemma grot_succ_typ : x, grot_univ (grot_succ x).

Lemma grot_succ_in : x, x grot_succ x.

End TarskiGrothendieck.