Implicit Types m n : nat.Implicit Types x y : T.Definition iter n f x :=
  let fix loop m := if m is i.+1 then f (loop i) else x in loop n.Definition iteri n f x :=
  let fix loop m := if m is i.+1 then f i (loop i) else x in loop n.Definition iterop n op x :=
  let f i y := if i is 0 then x else op x y in iteri n f.

(* Specifications: *)
Lemma iterSr n f x : iter n.+1 f x = iter n f (f x).
Lemma iterS n f x : iter n.+1 f x = f (iter n f x).
Lemma iter_add n m f x : iter (n + m) f x = iter n f (iter m f x).
Lemma iteriS n f x : iteri n.+1 f x = f n (iteri n f x).
Lemma iteropS idx n op x : iterop n.+1 op x idx = iter n (op x) x.
Lemma eq_iter f f' : f =1 f' -> forall n, iter n f =1 iter n f'.
Lemma eq_iteri f f' : f =2 f' -> forall n, iteri n f =1 iteri n f'.
Lemma eq_iterop n op op' : op =2 op' -> iterop n op =2 iterop n op'.
Lemma iter_succn m n : iter n succn m = m + n.
Lemma iter_succn_0 n : iter n succn 0 = n.
Lemma iter_predn m n : iter n predn m = m - n.