Fixpoint fisrtn_list_from_fun {A: Type} (f: nat -> A) (n: nat) : list A :=
  match n with
  | 0 => nil
  | S m => fisrtn_list_from_fun f m ++ f m :: nil
  end.Definition State: Type := {l: list A | P l}.Definition state_nil: State := exist _ nil H_init.Fixpoint step (n: nat): State := 
  match n with
  | 0 => state_nil
  | S m => exist _ _ (HF (step m))
  end.

Lemma nat_coinduction {A: Type}: forall (P: A -> Prop) (R: A -> A -> Prop) a0, P a0 -> (forall a, P a -> exists b, R a b /\ P b) -> exists l: nat -> A, l 0 = a0 /\ (forall k, R (l k) (l (S k))).