Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Import Tactics.Prelude.

(* Iterate an endofunction <<n>> times *)

(** * Iterating Functions *)
(**********************************************************************)
Fixpoint iterate (n : nat) {A : Type} (f : A -> A) :=
  match n with
  | 0 => @id A
  | S n' => iterate n' f ∘ f
  end.

(** ** Rewriting Rules *)
(**********************************************************************)

forall (A : Type) (f : A -> A), iterate 0 f = id

forall (A : Type) (f : A -> A), iterate 0 f = id
reflexivity. Qed.

forall (n : nat) (A : Type) (f : A -> A), iterate (S n) f = iterate n f ∘ f

forall (n : nat) (A : Type) (f : A -> A), iterate (S n) f = iterate n f ∘ f
n: nat
A: Type
f: A -> A

iterate (S n) f = iterate n f ∘ f
n: nat
A: Type
f: A -> A

iterate n f ∘ f = iterate n f ∘ f
reflexivity. Qed.

forall (n : nat) (A : Type) (f : A -> A), iterate (S n) f = f ∘ iterate n f

forall (n : nat) (A : Type) (f : A -> A), iterate (S n) f = f ∘ iterate n f
n: nat
A: Type
f: A -> A

iterate (S n) f = f ∘ iterate n f
n: nat
A: Type
f: A -> A

iterate n f ∘ f = f ∘ iterate n f
A: Type
f: A -> A

iterate 0 f ∘ f = f ∘ iterate 0 f
n: nat
A: Type
f: A -> A
IHn: iterate n f ∘ f = f ∘ iterate n f
iterate (S n) f ∘ f = f ∘ iterate (S n) f
A: Type
f: A -> A

iterate 0 f ∘ f = f ∘ iterate 0 f
reflexivity.
n: nat
A: Type
f: A -> A
IHn: iterate n f ∘ f = f ∘ iterate n f

iterate (S n) f ∘ f = f ∘ iterate (S n) f
n: nat
A: Type
f: A -> A
IHn: iterate n f ∘ f = f ∘ iterate n f

iterate n f ∘ f ∘ f = f ∘ (iterate n f ∘ f)
n: nat
A: Type
f: A -> A
IHn: iterate n f ∘ f = f ∘ iterate n f

iterate n f ∘ f ∘ f = f ∘ iterate n f ∘ f
n: nat
A: Type
f: A -> A
IHn: iterate n f ∘ f = f ∘ iterate n f

iterate n f ∘ f ∘ f = iterate n f ∘ f ∘ f
reflexivity. Qed.

forall (A : Type) (f : A -> A) (a : A), iterate 0 f a = a

forall (A : Type) (f : A -> A) (a : A), iterate 0 f a = a
reflexivity. Qed.

forall (n : nat) (A : Type) (f : A -> A) (a : A), iterate (S n) f a = iterate n f (f a)

forall (n : nat) (A : Type) (f : A -> A) (a : A), iterate (S n) f a = iterate n f (f a)
reflexivity. Qed.

forall (n : nat) (A : Type) (f : A -> A) (a : A), iterate (S n) f a = f (iterate n f a)

forall (n : nat) (A : Type) (f : A -> A) (a : A), iterate (S n) f a = f (iterate n f a)
n: nat
A: Type
f: A -> A
a: A

iterate (S n) f a = f (iterate n f a)
n: nat
A: Type
f: A -> A
a: A

iterate (S n) f a = (f ∘ iterate n f) a
n: nat
A: Type
f: A -> A
a: A

(f ∘ iterate n f) a = (f ∘ iterate n f) a
reflexivity. Qed.