Section PROD'.
Variable A B : Type.
Variable agB: ageable B.
Let levelAB (x:prod A B) := level (snd x).
Let age1AB (x:prod A B) :=
match age1 (snd x) with
| None => None
| Some a' => Some (fst x, a')
end.
Definition ag_prod' :=
mkAgeable (prod A B) levelAB age1AB ag_prod'_facts.
End PROD'.
Fixpoint composeOptN (A: Type) (f: A -> option A)
(n: nat) (w: A) {struct n} : option A :=
match n  with
| S n' => match f w with Some w' => composeOptN A f n' w' | None => None end
| O => Some w
end.
Arguments composeOptN [A] _ _ _.
Definition ageN {A} `{ageable A}: nat -> A -> option A := composeOptN age1.

Lemma ageable_ext:
forall A (B C: ageable A),
@age1 _ B = @age1 _ C -> @level _ B = @level _ C -> B=C.