Fixpoint iter_nat (n : nat) (x : A) {struct n} : A :=
  match n with
  | S n' => iter_nat n' (f x)
  | O => x
  end.

(* Specifications: *)
Lemma iter_nat_plus : forall (p q : nat) (x : A), iter_nat (p + q) x = iter_nat p (iter_nat q x).
Lemma iter_nat_S : forall (p : nat) (x : A), iter_nat (S p) x = f (iter_nat p x).
Lemma iter_nat_plus : forall (p q : nat) (x : A), iter_nat (p + q) x = iter_nat p (iter_nat q x).
Lemma iter_nat_S : forall (p : nat) (x : A), iter_nat (S p) x = f (iter_nat p x).