Section NU.
Context {D : Type} {PROSET : isProset D} {COLA : isCola D (PROSET := PROSET)}.
Definition nu (f : `[D -> D]) : { gfp_f : D | is_gfpOf gfp_f (proj1_sig f) } :=
let nu_f_proj1_sig : D := proj1_sig (supremum_cola (postfixedpointsOf (proj1_sig f))) in
let IS_SUPREMUM : is_supremum_of nu_f_proj1_sig (postfixedpointsOf (proj1_sig f)) := proj2_sig (supremum_cola (postfixedpointsOf (proj1_sig f))) in
@exist D (fun gfp_f : D => is_gfpOf gfp_f (proj1_sig f)) nu_f_proj1_sig (postfixedpoint_is_gfpOf (proj1_sig f) nu_f_proj1_sig (proj2_sig f) IS_SUPREMUM).

Lemma coinduction_principle (b : `[D -> D])
: forall x, x =< proj1_sig (nu b) <-> (exists y : D, x =< y /\ y =< proj1_sig b y).