Section step.
Variable F: State -> A.
Hypothesis HF: forall l: State, P (proj1_sig l ++ F l :: nil).
Fixpoint step (n: nat): State :=
match n with
| 0 => state_nil
| S m => exist _ _ (HF (step m))
end.
End step.
End NatChoice.
End NatChoice.
Export NatChoice.

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))) /\ (forall k, P (l k)).