Section PACO5.
Variable T0 : Type.
Variable T1 : forall (x0: @T0), Type.
Variable T2 : forall (x0: @T0) (x1: @T1 x0), Type.
Variable T3 : forall (x0: @T0) (x1: @T1 x0) (x2: @T2 x0 x1), Type.
Variable T4 : forall (x0: @T0) (x1: @T1 x0) (x2: @T2 x0 x1) (x3: @T3 x0 x1 x2), Type.
(** ** Signatures *)
Record sig5T  :=
exist5T {
proj5T0: @T0;
proj5T1: @T1 proj5T0;
proj5T2: @T2 proj5T0 proj5T1;
proj5T3: @T3 proj5T0 proj5T1 proj5T2;
proj5T4: @T4 proj5T0 proj5T1 proj5T2 proj5T3;
}.
Definition uncurry5  (R: rel5 T0 T1 T2 T3 T4): rel1 sig5T :=
fun x => R (proj5T0 x) (proj5T1 x) (proj5T2 x) (proj5T3 x) (proj5T4 x).
Definition curry5  (R: rel1 sig5T): rel5 T0 T1 T2 T3 T4 :=
fun x0 x1 x2 x3 x4 => R (@exist5T x0 x1 x2 x3 x4).
(** ** Predicates of Arity 5 *)
Definition paco5(gf : rel5 T0 T1 T2 T3 T4 -> rel5 T0 T1 T2 T3 T4)(r: rel5 T0 T1 T2 T3 T4) : rel5 T0 T1 T2 T3 T4 :=
curry5 (paco (fun R0 => uncurry5 (gf (curry5 R0))) (uncurry5 r)).
Definition upaco5(gf : rel5 T0 T1 T2 T3 T4 -> rel5 T0 T1 T2 T3 T4)(r: rel5 T0 T1 T2 T3 T4) := paco5 gf r \5/ r.
Arguments paco5 : clear implicits.
Arguments upaco5 : clear implicits.
Hint Unfold upaco5 : core.
Definition monotone5 (gf: rel5 T0 T1 T2 T3 T4 -> rel5 T0 T1 T2 T3 T4) :=
forall x0 x1 x2 x3 x4 r r' (IN: gf r x0 x1 x2 x3 x4) (LE: r <5= r'), gf r' x0 x1 x2 x3 x4.
Definition _monotone5 (gf: rel5 T0 T1 T2 T3 T4 -> rel5 T0 T1 T2 T3 T4) :=
forall r r'(LE: r <5= r'), gf r <5== gf r'.

Lemma monotone5_compose (gf gf': rel5 T0 T1 T2 T3 T4 -> rel5 T0 T1 T2 T3 T4)
(MON1: monotone5 gf)
(MON2: monotone5 gf'):
monotone5 (compose gf gf').