Section level'.
Variable A:Type.
Variable ag:ageable A.
Function level' (x:A) { wf (fun x y => @age A ag y x)  x } : nat :=
(*  Function level' (x:A) { wf (transp _ (@age A ag)) x } : nat := *)
match age1 x with
| None => 0
| Some x' => S (level' x')
end.
intros. hnf. assumption.
unfold transp. apply (af_wf _).
Defined.

(* Specifications: *)
Theorem level_level' : forall x:A, level x = level' x.
End level'.
Lemma levelS_age1 {A} `{ageable A} : forall (x:A) n,
level x = S n ->
exists y, age1 x = Some y.
Lemma age1_levelS {A} `{ageable A} : forall (x y:A),
age1 x = Some y ->
exists n, level x = S n.
Lemma age1_level0_absurd {A} `{ageable A} : forall (x y:A),
age1 x = Some y ->
level x = 0 ->
False.
Lemma age1None_levelS_absurd {A} `{ageable A} : forall (x:A) n,
age1 x = None ->
level x = S n ->
False.