Module Type NAT_CHOICE.
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.

(* Specifications: *)
Axiom nat_stepwise_choice: forall {A: Type} (P: list A -> Prop),
P nil ->
(forall l, P l -> exists a, P (l ++ a :: nil)) ->
exists f, forall n, P (fisrtn_list_from_fun f n).