Library ZFcont

Require Export basic.
Require Import ZF ZFpairs ZFsum ZFfix ZFnats ZFord ZFstable ZFrank ZFrelations.
Import ZFrepl.

Geeralized continuity

Definition continuous o F :=
   X, ext_fun o X -> F (sup o X) == sup o (fun z => F (X z)).

Section Convergence.

Variable o :set.
Hypothesis oo : limitOrd o.
Hypothesis F : set->set.
Hypothesis Fm : morph1 F.
Hypothesis Fcont : continuous o F.

Lemma Fcont_mono :
  (exists x, x o) -> Proper (incl_set==>incl_set) F.
do 2 red; intros.
destruct H as (w,?).
assert (wo : isOrd w).
 apply isOrd_inv with o; auto.
assert (d : ~ w == osucc w).
 intro.
 apply (lt_antirefl w); trivial.
 apply eq_elim with (osucc w); auto with *.
 apply lt_osucc; trivial.
pose (X:=fun o' => cond_set (o'==w) x cond_set (o'==osucc w) y).
assert (Xm : morph1 X).
 do 2 red; intros.
 unfold X.
 rewrite H1; reflexivity.
red; intros.
setoid_replace y with (sup o X).
 rewrite (Fcont X); auto with *.
 rewrite sup_ax.
 2:do 2 red; intros; apply Fm; auto with *.
 exists w; trivial.
 revert H1; apply eq_elim; apply Fm.
 unfold X; apply eq_set_ax; intros z'.
 rewrite union2_ax.
 rewrite cond_set_ax.
 rewrite cond_set_ax.
 split; auto with *.
 destruct 1 as [(?,?)|(?,?)]; trivial.
 contradiction.

 apply eq_set_ax; intros z'.
 rewrite sup_ax; auto with *.
 split; intros.
  exists (osucc w).
   apply oo; auto.
  revert H2; apply eq_elim.
  unfold X; apply eq_set_ax; intros z''.
  rewrite union2_ax.
  rewrite cond_set_ax.
  rewrite cond_set_ax.
  split; auto with *.
  destruct 1 as [(?,?)|(?,?)]; trivial.
  symmetry in H3; contradiction.

  destruct H2.
  apply union2_elim in H3; destruct H3; rewrite cond_set_ax in H3; destruct H3; auto.
Qed.

Lemma cont_least_fix : F (TI F o) == TI F o.
rewrite TI_eq; auto.
red in Fcont.
rewrite Fcont; auto.
apply eq_set_ax; intros z.
rewrite sup_ax; auto.
2:do 2 red; intros; apply Fm; apply Fm; apply TI_morph; trivial.
rewrite sup_ax; auto.
split; destruct 1.
 exists (osucc x).
  apply oo; trivial.
  rewrite TI_mono_succ; trivial.
   apply Fcont_mono; eauto.
   apply isOrd_inv with o; auto.

 assert (isOrd x) by eauto using isOrd_inv.
 assert (Fmono : Proper (incl_set==>incl_set) F).
  apply Fcont_mono; eauto.
 exists x; trivial.
 rewrite <- TI_mono_succ; auto.
 revert H0; apply Fmono.
 apply TI_incl; auto.
Qed.

End Convergence.
A small libary of continuous functions

Lemma cst_cont : X o, (exists y, lt y o) -> X == sup o (fun _ => X).
intros.
apply eq_intro; intros.
 rewrite sup_ax; trivial.
 destruct H as (y,?); exists y; trivial.

 rewrite sup_ax in H0; trivial.
 destruct H0; trivial.
Qed.

Lemma sum_cont : o F G,
  ext_fun o F ->
  ext_fun o G ->
  sum (sup o F) (sup o G) == sup o (fun y => sum (F y) (G y)).
intros.
apply eq_intro; intros.
 rewrite sup_ax; auto.
 elim H1 using sum_ind; clear H1; intros.
  rewrite sup_ax in H1; auto.
  destruct H1.
  exists x0; trivial.
  rewrite H2; apply inl_typ; trivial.

  rewrite sup_ax in H1; auto.
  destruct H1.
  exists x; trivial.
  rewrite H2; apply inr_typ; trivial.

 rewrite sup_ax in H1; auto.
 destruct H1.
 apply sum_mono with (F x) (G x); auto.
Qed.

  Lemma sup_cont : o F G,
    ext_fun o F ->
    ext_fun o G ->
    sup o F sup o G == sup o (fun y => F y G y).
intros.
apply eq_set_ax; intros z.
rewrite union2_ax.
repeat rewrite sup_ax; auto with *.
 split; intros.
  destruct H1 as [(o',?,?)|(o',?,?)]; exists o'; trivial.
   apply union2_intro1; trivial.
   apply union2_intro2; trivial.

  destruct H1 as (o',?,?).
  apply union2_elim in H2; destruct H2;[left|right]; exists o'; trivial.

 do 2 red; intros; apply union2_morph; auto.
Qed.

  Lemma sigma_cont dom A f :
    morph2 f ->
    sigma A (fun x => sup dom (f x)) == sup dom (fun i => sigma A (fun x => f x i)).
intros.
assert (Hm : ext_fun dom (fun i => sigma A (fun x => f x i))).
 do 2 red; intros.
 apply sigma_morph; auto with *.
 red; intros; apply H; trivial.
apply eq_intro; intros.
 rewrite sup_ax; trivial.
 assert (snd z sup dom (f (fst z))).
  apply snd_typ_sigma with (2:=H0); auto with *.
  do 2 red; intros.
  apply sup_morph; auto with *.
  red; intros; apply H; trivial.
 rewrite sup_ax in H1.
 2:do 2 red; intros; apply H;auto with *.
 destruct H1.
 exists x; trivial.
 rewrite surj_pair with (1:=subset_elim1 _ _ _ H0).
 apply couple_intro_sigma; trivial.
  do 2 red; intros; apply H; auto with *.
 apply fst_typ_sigma in H0; trivial.

 rewrite sup_ax in H0; trivial.
 destruct H0.
 rewrite surj_pair with (1:=subset_elim1 _ _ _ H1).
 apply couple_intro_sigma; trivial.
  do 2 red; intros.
  apply sup_morph; auto with *.
  red; intros; apply H; trivial.

  apply fst_typ_sigma in H1; trivial.

  rewrite sup_ax.
  2:do 2 red; intros; apply H; auto with *.
  exists x; trivial.
  apply snd_typ_sigma with (2:=H1); auto with *.
  do 2 red; intros; apply H; auto with *.
Qed.

Section ProductContinuity.

  Hypothesis mu : set.
  Hypothesis mu_ord : isOrd mu.

  Variable X : set.
  Hypothesis X_small : bound_ord X mu.

  Lemma func_cont_gen : F,
    stable_ord F ->
    increasing F ->
    func X (sup mu F) sup mu (fun A => func X (F A)).
intros F Fstb Fincr.
assert (Fm : o, isOrd o -> ext_fun o F) by auto.
red; intros.
pose (G := fun n => inter (subset mu (fun y => app z n F y))).
assert (Gm : ext_fun X G).
 red; red; intros.
 apply inter_morph.
 apply subset_morph; auto with *.
 red; intros.
 rewrite H1; reflexivity.
assert (Fprop : x, x X -> app z x F (G x) /\ lt (G x) mu).
  intros.
  apply app_typ with (x:=x) in H; trivial.
  rewrite sup_ax in H; auto.
  destruct H.
  split.
   apply Fstb; intros.
    apply subset_elim1 in H2; eauto using isOrd_inv.
   apply inter_intro.
    intros.
    rewrite replf_ax in H2.
     destruct H2.
     rewrite H3.
     rewrite subset_ax in H2; destruct H2.
     destruct H4.
     setoid_replace (F x1) with (F x2); trivial.
     apply Fm with mu; auto.

     red; red; intros.
     apply Fm with mu; auto.
     apply subset_elim1 in H3; trivial.

    exists (F x0).
    rewrite replf_ax.
     exists x0; auto with *.
     apply subset_intro; trivial.

     red; red; intros.
     apply Fm with mu; auto.
     apply subset_elim1 in H2; trivial.

   apply isOrd_plump with x0; auto.
    apply isOrd_inter; intros.
    apply subset_elim1 in H2; eauto using isOrd_inv.

    red; intros.
    apply inter_elim with (1:=H2).
    apply subset_intro; trivial.
assert (Fmu := fun x h => proj2 (Fprop x h)).
assert (Fspec := fun x h => proj1 (Fprop x h)).
clear Fprop.
assert (Ford : x, x X -> isOrd (G x)).
 intros.
 apply isOrd_inv with mu; auto.
rewrite sup_ax; auto.
assert (lt (osup X G) mu) by (apply X_small; trivial).
exists (osup X G); trivial.
apply func_narrow with (1:=H); intros.
apply Fincr with (G x); auto.
 apply isOrd_osup; auto.

 apply osup_intro; trivial.
Qed.

  Hypothesis mu_bound : lt (osup (func X mu) (fun f => osup X (app f))) mu.

  Lemma func_bound : bound_ord X mu.
red; intros.
apply isOrd_plump with (4:=mu_bound); auto.
 apply isOrd_osup; auto.
 intros.
 apply isOrd_inv with mu; auto.

 red; intros.
 apply osup_intro with (x:=lam X F).
  do 2 red; intros.
  apply osup_morph; auto with *.
  red; intros.
  apply app_morph; trivial.

  apply lam_is_func; auto.

  apply eq_elim with (2:=H1).
  apply osup_morph; auto with *.
  red; intros.
  rewrite beta_eq; auto.
  rewrite <- H3; trivial.
Qed.

End ProductContinuity.


Lemma func_cont : mu X F,
  isOrd mu ->
  VN_regular mu ->
  omega mu ->
  stable_ord F ->
  increasing F ->
  X VN mu ->
  func X (sup mu F) == sup mu (fun x => func X (F x)).
intros mu X F mu_ord mu_reg mu_inf Fstb Fincr Fsmall.
apply eq_intro; intros.
 apply func_cont_gen; trivial.
 red; intros; apply VN_reg_ord; auto.

 rewrite sup_ax in H; auto.
 destruct H.
 apply func_mono with X (F x); auto.
 reflexivity.
Qed.