Section PACO_METATHEORY.
Context {D : Type} {PROSET : isProset D}.
#[local] Hint Resolve le_join_lattice_introl le_join_lattice_intror join_lattice_le_intro bot_lattice_le_intro : core.
Proof with eauto with *.
assert (claim1 : proj1_sig f (proj1_sig (nu f)) =< proj1_sig f (join_lattice x (proj1_sig (nu f)))).
{ eapply (proj2_sig f). eapply join_lattice_spec; done!. }
pose proof (proj2_sig (nu f)) as [claim2 claim3]. split.
- intros x_le. rewrite x_le at 1. transitivity (proj1_sig f (proj1_sig (nu f)))...
- intros x_le. unnw. exploit (join_lattice_le_intro x (proj1_sig (nu f)) _ x_le).
+ do 2 red in claim2. rewrite claim2 at 1. eapply (proj2_sig f). eapply le_join_lattice_intror...
+ intros H. rewrite x_le. eapply postfixedpoint_le_gfpOf. eapply (proj2_sig f)...
Qed.
Definition G_aux0 {UPPER_LATTICE : isUpperSemilattice D} (f : `[D -> D]) (x : D) : D -> D :=
fun y : D => proj1_sig f (join_lattice x y).
Definition G_aux {UPPER_LATTICE : isUpperSemilattice D} (f : `[D -> D]) (x : D) : `[D -> D] :=
@exist (D -> D) isMonotonic1 (G_aux0 f x) (G_aux0_isMonotionicMap f x).
Context {COLA : isCola D} {UPPER_LATTICE : isUpperSemilattice D}.
Definition G0 (f : `[D -> D]) (x : D) : D :=
proj1_sig (nu (G_aux f x)).

Lemma G0_isMonotonic1 (f : `[D -> D])
: isMonotonic1 (G0 f).