(* A is Y-full : (full A Y) *)

Definition full (A : nat -> Prop) (Y : (nat -> nat) -> nat) :=
  forall f : nat -> nat, increasing f -> A (f (Y f)).Definition enumerate (Y : (nat -> nat) -> nat) :=
  (fix F (x : nat) : nat :=
     match x return nat with
     | O => 
         (* O   *)  Y (fun n : nat => n)
         (* S y *) 
     | S y => Y (fun n : nat => n + S (F y)) + S (F y)
     end).

(* Specifications: *)
Lemma increasing_enumerate : forall Y : (nat -> nat) -> nat, increasing (enumerate Y).