CoRN.examples.Picard

Require Import CRtrans.
Require Import Qmetric.


Section ODE.
Open Scope uc_scope.
Require Import ProductMetric CompleteProduct.
Require Import Unicode.Utf8.
Require Import CPoly_Newton.
Require Import metric2.Classified.
Require Import Circle.
Notation "X * Y":=(ProductMS X Y).
Notation " f >> g ":= (Cbind_slow fg) (at level 50).
Notation " x >>= f ":= (Cbind_slow f x) (at level 50).

Section Picard_op.
Require Import AbstractIntegration.

Variable v: (Q×Q) -->CR.
Variable f:Q-->CR.
Notation "( f , g )":= (together f g).
Definition vxfx:= (v >> Couple ∘ (Cunit, f) ∘ diag _).

Require Import SimpleIntegration.


Definition integral: ((Q-->CR) × Q × Q) → CR.
intros [[g a] b].
destruct (QMinMax.Qlt_le_dec_fast b a).
assert (a_min_b:Qpos). (a-b) . admit.
exact (- ∫ g b (a_min_b))%CR.

assert (b_min_a:Qpos). (b-a). admit.
exact ( ∫ g a (b_min_a))%CR.
Defined.



Definition Picard_raw:=fun t:Qintegral (f, 0, t).

Lemma Picard_uc: (is_UniformlyContinuousFunction Picard_raw (fun ee)%Qpos).
admit.
Qed.

Definition Picard:=(Cbind_slow (Build_UniformlyContinuousFunction Picard_uc)).
End Picard_op.

Section Banach_it.
Context {X} `(F:X-->X).
Fixpoint Banach_seq (n : nat) : X --> X :=
         match n with
         | OF
         | S mF ∘ (Banach_seq m)
         end.

Variable f:CR-->CR.
Check Picard.
Fixpoint Picard_seq (n : nat) : Q --> CR :=
         match n with
         | OfCunit
         | S m ⇒ (Picard (Picard_seq m) )∘ Cunit
         end.
End Banach_it.

Section Picard.
Variable L:Qpos.
Variable c:Qpos.
Hypothesis c_unit:1-c>0.
Program Definition oneminc:=(1-c):Qpos.
Next Obligation.
admit.
Defined.
Variables a K:Q.
Hypothesis aL_le_c:(a×L<c).
Require Import Qabs.
Require Export CRabs.
Require Import Interval.

Variable v: (Q×Q) -->CR.

Hypothesis Lipschitz: x, -axxa y, -KyyK
   y':Q, -Ky'yK
 ((CRabs ((v (x, y)) - (v (x, y'))))<= 'L× 'Qabs (y-y'))%CR.

Section BanachFPT.
Context (X: MetricSpace).
Context (d:XXCR).

Variable metric_function: e x y, ball e x y ↔ ((d x y) <='e)%CR.
Class Contraction `(F:X-->X)`(c:Qpos):= contraction:
  c<1-> x x', ((d x x') ≤ 'c*(d (F x) (F x')))%CR.

Context {F}`{conF: Contraction F}.
Require Export CRGeometricSum.


Lemma bla: n m:nat, x:X,
  (ball (c^m) (@Banach_seq _ F n x) (@Banach_seq _ F (n+m) x)).
Admitted.

Lemma bla2: n:nat, x:X, (ball (Qpos_inv oneminc) x (@Banach_seq _ F n x)).
Admitted.

Lemma bla3: n m:nat, x:X, e,
  (ball e x (F x)) →
  (ball (c^m*(Qpos_inv oneminc)*e) (@Banach_seq _ F n x) (@Banach_seq _ F m x)).
Admitted.

Variable x:X.
Definition DiffSeries:=fun nd (@Banach_seq _ F n x) (@Banach_seq _ F (S n) x).
Require Import StreamMemo.
Definition DiffStream:=(memo_list _ DiffSeries).
Require Import Streams.

Definition GeometricSeriesCR (c:CR):=
  (ForAll (fun s:Stream CR ⇒ (CRabs ((hd (tl s))) ≤ c*(CRabs(hd s)))%CR)).

Lemma GeomDiff:GeometricSeriesCR ('c)%CR DiffStream.
unfold GeometricSeriesCR.
unfold DiffStream.
unfold memo_list.
unfold memo_make.
simpl.
admit.
Qed.



Lemma BanachCauchy: ϵ:Qpos, N, n m:nat , nNmN
   (ball ϵ (@Banach_seq _ F n x) (@Banach_seq _ F m x)).
intros.
set ceil:=(Qabs (approximate (d (@Banach_seq _ F 0 x) (@Banach_seq _ F 1 x))
  (Qpos2QposInf (1#1))))+1:Qpos.

( /((ϵ×oneminc/ceil)(oneminc))).


End BanachFPT.

Section BanachFPT2.
Context {X} (F:Complete X--> Complete X) `{conF: Contraction (Complete X) F}.
Theorem BanachFPT : x, (F x) =x.
eexists y.
Admitted.


Theorem PicardFPT: f, (Picard f) = (fCunit).
apply BanachFPT.
Qed.